日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CortexM0开发 —— LPC11C14的UART使用方法

發布時間:2023/12/9 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CortexM0开发 —— LPC11C14的UART使用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LPC1100系列微控制器UART ?LPC1100系列Cortex-M0微控制器具有一個符合16C550工業標準的異步串行口(UART)。此口同時增加了調制解調器(Modem)接口,DSR、DCD和RI Modem信號是只用于LQFP48和PLCC44封裝的管腳配置。?

?特性 ?

??16字節收發FIFO;?

??寄存器位置符合16C550工業標準; ?

??接收器FIFO觸發點可為1、4、8和14字節;?

??內置波特率發生器; ?

? ?用于精確控制波特率的小數分頻器,并擁有賴以實現軟件流控制的自動波特率檢測能力和機制; ?

? 支持軟件或硬件流控制執行; ?

? 包含標準Modem接口信號(CTS、DCD、DTS、DTR、RI、RTS);?

? 支持RS-458/EIA-485的9位模式和輸出使能。


【實驗步驟】:

先看一下板子上UART的原理圖

PL-2303HX是一款UART-USB芯片,這里先不管其原理,我們只學習如何將數據從CPU發送到這個TXD RXD處。


一、LPC11C14 UART 寄存器描述



這里只貼出部分



具體寄存器分析,這里不再闡述,先看一下在頭文件中我們這樣定義

[cpp]?view plaincopy
  • /*-------------?Universal?Asynchronous?Receiver?Transmitter?(UART)?-----------*/??
  • /**?@addtogroup?LPC11xx_UART?LPC11xx?Universal?Asynchronous?Receiver/Transmitter??
  • ??@{?
  • */??
  • typedef?struct??
  • {??
  • ??union?{??
  • ??__I??uint32_t??RBR;???????????????????/*!<?Offset:?0x000?Receiver?Buffer??Register?(R/?)?*/??
  • ??__O??uint32_t??THR;???????????????????/*!<?Offset:?0x000?Transmit?Holding?Register?(?/W)?*/??
  • ??__IO?uint32_t??DLL;???????????????????/*!<?Offset:?0x000?Divisor?Latch?LSB?(R/W)?*/??
  • ??};??
  • ??union?{??
  • ??__IO?uint32_t??DLM;???????????????????/*!<?Offset:?0x004?Divisor?Latch?MSB?(R/W)?*/??
  • ??__IO?uint32_t??IER;???????????????????/*!<?Offset:?0x000?Interrupt?Enable?Register?(R/W)?*/??
  • ??};??
  • ??union?{??
  • ??__I??uint32_t??IIR;???????????????????/*!<?Offset:?0x008?Interrupt?ID?Register?(R/?)?*/??
  • ??__O??uint32_t??FCR;???????????????????/*!<?Offset:?0x008?FIFO?Control?Register?(?/W)?*/??
  • ??};??
  • ??__IO?uint32_t??LCR;???????????????????/*!<?Offset:?0x00C?Line?Control?Register?(R/W)?*/??
  • ??__IO?uint32_t??MCR;???????????????????/*!<?Offset:?0x010?Modem?control?Register?(R/W)?*/??
  • ??__I??uint32_t??LSR;???????????????????/*!<?Offset:?0x014?Line?Status?Register?(R/?)?*/??
  • ??__I??uint32_t??MSR;???????????????????/*!<?Offset:?0x018?Modem?status?Register?(R/?)?*/??
  • ??__IO?uint32_t??SCR;???????????????????/*!<?Offset:?0x01C?Scratch?Pad?Register?(R/W)?*/??
  • ??__IO?uint32_t??ACR;???????????????????/*!<?Offset:?0x020?Auto-baud?Control?Register?(R/W)?*/??
  • ???????uint32_t??RESERVED0;??
  • ??__IO?uint32_t??FDR;???????????????????/*!<?Offset:?0x028?Fractional?Divider?Register?(R/W)?*/??
  • ???????uint32_t??RESERVED1;??
  • ??__IO?uint32_t??TER;???????????????????/*!<?Offset:?0x030?Transmit?Enable?Register?(R/W)?*/??
  • ???????uint32_t??RESERVED2[6];??
  • ??__IO?uint32_t??RS485CTRL;?????????????/*!<?Offset:?0x04C?RS-485/EIA-485?Control?Register?(R/W)?*/??
  • ??__IO?uint32_t??ADRMATCH;??????????????/*!<?Offset:?0x050?RS-485/EIA-485?address?match?Register?(R/W)?*/??
  • ??__IO?uint32_t??RS485DLY;??????????????/*!<?Offset:?0x054?RS-485/EIA-485?direction?control?delay?Register?(R/W)?*/??
  • ??__I??uint32_t??FIFOLVL;???????????????/*!<?Offset:?0x058?FIFO?Level?Register?(R)?*/??
  • }?LPC_UART_TypeDef;??
  • /*@}*/?/*?end?of?group?LPC11xx_UART?*/??
  • 相關宏定義(部分)

    [cpp]?view plaincopy
  • ****************************************************************************/??
  • #ifndef?__UART_H???
  • #define?__UART_H??
  • ??
  • #define?RS485_ENABLED???0??
  • #define?TX_INTERRUPT????0???????/*?0?if?TX?uses?polling,?1?interrupt?driven.?*/??
  • #define?MODEM_TEST??????0??
  • ??
  • #define?IER_RBR?????????(0x01<<0)??
  • #define?IER_THRE????????(0x01<<1)??
  • #define?IER_RLS?????????(0x01<<2)??
  • ??
  • #define?IIR_PEND????????0x01??
  • #define?IIR_RLS?????????0x03??
  • #define?IIR_RDA?????????0x02??
  • #define?IIR_CTI?????????0x06??
  • #define?IIR_THRE????????0x01??
  • ??
  • #define?LSR_RDR?????????(0x01<<0)??
  • #define?LSR_OE??????????(0x01<<1)??
  • #define?LSR_PE??????????(0x01<<2)??
  • #define?LSR_FE??????????(0x01<<3)??
  • #define?LSR_BI??????????(0x01<<4)??
  • #define?LSR_THRE????????(0x01<<5)??
  • #define?LSR_TEMT????????(0x01<<6)??
  • #define?LSR_RXFE????????(0x01<<7)??
  • ??
  • #define?UART0_RBUF_SIZE?64??

  • 二、UART的初始化

    [cpp]?view plaincopy
  • /*****************************************************************************?
  • **?Function?name:???????UARTInit?
  • **?
  • **?Descriptions:????????Initialize?UART0?port,?setup?pin?select,?
  • **??????????????????????clock,?parity,?stop?bits,?FIFO,?etc.?
  • **?
  • **?parameters:??????????UART?baudrate?
  • **?Returned?value:??????None?
  • **??
  • *****************************************************************************/??
  • void?UARTInit(uint32_t?baudrate)??
  • {??
  • ??uint32_t?Fdiv;??
  • ??uint32_t?regVal;??
  • ??
  • ??UARTTxEmpty?=?1;??
  • ??UARTCount?=?0;??
  • ????
  • ??NVIC_DisableIRQ(UART_IRQn);??
  • ??
  • ??LPC_IOCON->PIO1_6?&=?~0x07;????/*??UART?I/O?config?*/??
  • ??LPC_IOCON->PIO1_6?|=?0x01;?????/*?UART?RXD?*/??
  • ??LPC_IOCON->PIO1_7?&=?~0x07;??????
  • ??LPC_IOCON->PIO1_7?|=?0x01;?????/*?UART?TXD?*/??
  • ??
  • ??/*?Enable?UART?clock?*/??
  • ??LPC_SYSCON->SYSAHBCLKCTRL?|=?(1<<12);??
  • ??LPC_SYSCON->UARTCLKDIV?=?0x1;?????/*?divided?by?1?*/??
  • ??
  • ??LPC_UART->LCR?=?0x83;?????????????/*?8?bits,?no?Parity,?1?Stop?bit?*/??
  • ??regVal?=?LPC_SYSCON->UARTCLKDIV;??
  • ??Fdiv?=?((SystemAHBFrequency/regVal)/16)/baudrate?;????/*baud?rate?*/??
  • ??
  • ??LPC_UART->DLM?=?Fdiv?/?256;??????????????????????????????
  • ??LPC_UART->DLL?=?Fdiv?%?256;??
  • ??LPC_UART->LCR?=?0x03;??????/*?DLAB?=?0?*/??
  • ??LPC_UART->FCR?=?0x07;??????/*?Enable?and?reset?TX?and?RX?FIFO.?*/??
  • ??
  • ??/*?Read?to?clear?the?line?status.?*/??
  • ??regVal?=?LPC_UART->LSR;??
  • ??
  • ??/*?Ensure?a?clean?start,?no?data?in?either?TX?or?RX?FIFO.?*/??
  • ??while?((?LPC_UART->LSR?&?(LSR_THRE|LSR_TEMT))?!=?(LSR_THRE|LSR_TEMT)?);??
  • ??while?(?LPC_UART->LSR?&?LSR_RDR?)??
  • ??{??
  • ????regVal?=?LPC_UART->RBR;??/*?Dump?data?from?RX?FIFO?*/??
  • ??}??
  • ???
  • ??/*?Enable?the?UART?Interrupt?*/??
  • ??NVIC_EnableIRQ(UART_IRQn);??
  • ??
  • #if?TX_INTERRUPT??
  • ??LPC_UART->IER?=?IER_RBR?|?IER_THRE?|?IER_RLS;??/*?Enable?UART?interrupt?*/??
  • #else??
  • ??LPC_UART->IER?=?IER_RBR?|?IER_RLS;?/*?Enable?UART?interrupt?*/??
  • #endif??
  • ??return;??
  • }??

  • CortexM0 中UART與CPIO口復用,這里看到用到了PIO1_6 與PIO1_7


    1、對IO口進行設置

    以PIO1_7寄存器為例

    可以看到低3位用于配置管腳功能 001為TXD,PIO1_6配置也相同

    [cpp]?view plaincopy
  • LPC_IOCON->PIO1_6?&=?~0x07;????/*??UART?I/O?config?*/??
  • LPC_IOCON->PIO1_6?|=?0x01;?????/*?UART?RXD?*/??
  • LPC_IOCON->PIO1_7?&=?~0x07;????
  • LPC_IOCON->PIO1_7?|=?0x01;?????/*?UART?TXD?*/??
  • 2、時鐘設置

    [cpp]?view plaincopy
  • /*?Enable?UART?clock?*/??
  • ??LPC_SYSCON->SYSAHBCLKCTRL?|=?(1<<12);??
  • ??LPC_SYSCON->UARTCLKDIV?=?0x1;?????/*?divided?by?1?*/??
  • 3、設置波特率、數據位

    [cpp]?view plaincopy
  • LPC_UART->LCR?=?0x83;?????????????/*?8?bits,?no?Parity,?1?Stop?bit?*/??
  • regVal?=?LPC_SYSCON->UARTCLKDIV;??
  • Fdiv?=?((SystemAHBFrequency/regVal)/16)/baudrate?;??/*baud?rate?*/??
  • 4、UART相應配置

    [cpp]?view plaincopy
  • LPC_UART->DLM?=?Fdiv?/?256;????????????????????????????
  • LPC_UART->DLL?=?Fdiv?%?256;??
  • LPC_UART->LCR?=?0x03;????????/*?DLAB?=?0?*/??
  • LPC_UART->FCR?=?0x07;????????/*?Enable?and?reset?TX?and?RX?FIFO.?*/??
  • 第4行 FCR為?FIFO控制寄存器??刂芔ART ?FIFO的使用和模式?


    5、使能中斷等操作

    [cpp]?view plaincopy
  • ??/*?Read?to?clear?the?line?status.?*/??
  • ??regVal?=?LPC_UART->LSR;??
  • ??
  • ??/*?Ensure?a?clean?start,?no?data?in?either?TX?or?RX?FIFO.?*/??
  • ??while?((?LPC_UART->LSR?&?(LSR_THRE|LSR_TEMT))?!=?(LSR_THRE|LSR_TEMT)?);??
  • ??while?(?LPC_UART->LSR?&?LSR_RDR?)??
  • ??{??
  • ????regVal?=?LPC_UART->RBR;??/*?Dump?data?from?RX?FIFO?*/??
  • ??}??
  • ???
  • ??/*?Enable?the?UART?Interrupt?*/??
  • ??NVIC_EnableIRQ(UART_IRQn);??
  • ??
  • #if?TX_INTERRUPT??
  • ??LPC_UART->IER?=?IER_RBR?|?IER_THRE?|?IER_RLS;??/*?Enable?UART?interrupt?*/??
  • #else??
  • ??LPC_UART->IER?=?IER_RBR?|?IER_RLS;?/*?Enable?UART?interrupt?*/??
  • #endif??
  • LCR寄存器作用



    三、發送數據

    [cpp]?view plaincopy
  • /*****************************************************************************?
  • **?Function?name:???????UARTSend?
  • **?
  • **?Descriptions:????????Send?a?block?of?data?to?the?UART?0?port?based?
  • **??????????????????????on?the?data?length?
  • **?
  • **?parameters:??????????buffer?pointer,?and?data?length?
  • **?Returned?value:??????None?
  • **??
  • *****************************************************************************/??
  • void?UARTSend(uint8_t?*BufferPtr,?uint32_t?Length)??
  • {??
  • ????
  • ??while?(?Length?!=?0?)??
  • ??{??
  • ??????/*?THRE?status,?contain?valid?data?*/??
  • #if?!TX_INTERRUPT??
  • ??????while?(?!(LPC_UART->LSR?&?LSR_THRE)?);??
  • ??????LPC_UART->THR?=?*BufferPtr;??
  • #else??
  • ??????/*?Below?flag?is?set?inside?the?interrupt?handler?when?THRE?occurs.?*/??
  • ??????while?(?!(UARTTxEmpty?&?0x01)?);??
  • ??????LPC_UART->THR?=?*BufferPtr;??
  • ??????UARTTxEmpty?=?0;??/*?not?empty?in?the?THR?until?it?shifts?out?*/??
  • #endif??
  • ??????BufferPtr++;??
  • ??????Length--;??
  • ??}??
  • ??return;??
  • }??


  • 四、接收數據

    ? ? ? ?這里利用中斷

    [cpp]?view plaincopy
  • /*****************************************************************************?
  • **?Function?name:???????UART_IRQHandler?
  • **?
  • **?Descriptions:????????UART?interrupt?handler?
  • **?
  • **?parameters:??????????None?
  • **?Returned?value:??????None?
  • **??
  • *****************************************************************************/??
  • void?UART_IRQHandler(void)??
  • {??
  • ??uint8_t?IIRValue,?LSRValue;??
  • ??uint8_t?Dummy?=?Dummy;??
  • ??
  • ??IIRValue?=?LPC_UART->IIR;??
  • ??????
  • ??IIRValue?>>=?1;?????????/*?skip?pending?bit?in?IIR?*/??
  • ??IIRValue?&=?0x07;?????????/*?check?bit?1~3,?interrupt?identification?*/??
  • ??if?(IIRValue?==?IIR_RLS)??????/*?Receive?Line?Status?*/??
  • ??{??
  • ????LSRValue?=?LPC_UART->LSR;??
  • ????/*?Receive?Line?Status?*/??
  • ????if?(LSRValue?&?(LSR_OE?|?LSR_PE?|?LSR_FE?|?LSR_RXFE?|?LSR_BI))??
  • ????{??
  • ??????/*?There?are?errors?or?break?interrupt?*/??
  • ??????/*?Read?LSR?will?clear?the?interrupt?*/??
  • ??????UARTStatus?=?LSRValue;??
  • ??????Dummy?=?LPC_UART->RBR;?/*?Dummy?read?on?RX?to?clear??
  • ????????????????????????????????interrupt,?then?bail?out?*/??
  • ??????return;??
  • ????}??
  • ????if?(LSRValue?&?LSR_RDR)?/*?Receive?Data?Ready?*/??????????????
  • ????{??
  • ??????/*?If?no?error?on?RLS,?normal?ready,?save?into?the?data?buffer.?*/??
  • ??????/*?Note:?read?RBR?will?clear?the?interrupt?*/??
  • ??????UARTBuffer[UARTCount++]?=?LPC_UART->RBR;??
  • ??????if?(UARTCount?>=?UART0_RBUF_SIZE)??
  • ??????{??
  • ????????UARTCount?=?0;??????/*?buffer?overflow?*/??
  • ??????}???
  • ????}??
  • ??}??
  • ??else?if?(IIRValue?==?IIR_RDA)?/*?Receive?Data?Available?*/??
  • ??{??
  • ????/*?Receive?Data?Available?*/??
  • ????UARTBuffer[UARTCount++]?=?LPC_UART->RBR;??
  • ????if?(UARTCount?>=?UART0_RBUF_SIZE)??
  • ????{??
  • ??????UARTCount?=?0;????????/*?buffer?overflow?*/??
  • ????}??
  • ??}??
  • ??else?if?(IIRValue?==?IIR_CTI)?/*?Character?timeout?indicator?*/??
  • ??{??
  • ????/*?Character?Time-out?indicator?*/??
  • ????UARTStatus?|=?0x100;????????/*?Bit?9?as?the?CTI?error?*/??
  • ??}??
  • ??else?if?(IIRValue?==?IIR_THRE)????/*?THRE,?transmit?holding?register?empty?*/??
  • ??{??
  • ????/*?THRE?interrupt?*/??
  • ????LSRValue?=?LPC_UART->LSR;????????/*?Check?status?in?the?LSR?to?see?if?
  • ????????????????????????????????valid?data?in?U0THR?or?not?*/??
  • ????if?(LSRValue?&?LSR_THRE)??
  • ????{??
  • ??????UARTTxEmpty?=?1;??
  • ????}??
  • ????else??
  • ????{??
  • ??????UARTTxEmpty?=?0;??
  • ????}??
  • ??}??
  • ??return;??
  • }??
  • 下面學習一下UART中斷


    對于UART接口來說,有兩種情況可以觸發UART接收中斷:接收字節數達到接收FIFO的觸發點(RDA)、接收超時(CTI)。

    (1) 接收字節數達到接收FIFO中的觸發點(RDA)

    ???? LPC1100系列Cortex-M0微控制器UART接口具有16字節的接收FIFO,接收觸發點可以設置為1、4、8、14字節,當接收到的字節數達到接收觸發點時,便會觸發中斷。

    ???? 通過UART FIFO控制寄存器U0FCR,將接收觸發點設置為“8字節觸發”。那么當UART接收8個字節時,便會觸發RDA中斷(注:在接收中斷使能的前提下)。


    下面看一下IIR



    五、其他操作補充

    [cpp]?view plaincopy
  • /*******************************************************************************?
  • *?Function?Name??:?UART0_PutChar?
  • *?Description????:?Send?a?char?to?uart0?channel.?
  • *?Input??????????:?c?
  • *?Output?????????:?None?
  • *?Return?????????:?None?
  • *******************************************************************************/??
  • void?UART0_PutChar(char?ch)??
  • {??
  • ??while(!(LPC_UART->LSR?&?LSR_THRE));??
  • ??LPC_UART->THR?=?ch;??
  • }??
  • ??
  • /*******************************************************************************?
  • *?Function?Name??:?uart0_sendstring?
  • *?Description????:?Send?string?to?uart0?channel.?
  • *?Input??????????:?pString??--??string?
  • *?Output?????????:?None?
  • *?Return?????????:?None?
  • *******************************************************************************/??
  • void?UART0_PutString(char?*pString)??
  • {??
  • ??while(*pString)??
  • ??{??
  • ????UART0_PutChar(*pString++);??
  • ??}??
  • }??
  • ??
  • /*******************************************************************************?
  • *?Function?Name??:?UART0_printf?
  • *?Description????:?print?format?string.?
  • *?Input??????????:?fmt?
  • *?Output?????????:?None?
  • *?Return?????????:?None?
  • *******************************************************************************/??
  • void?UART0_printf(char?*fmt,?...)??
  • {??
  • ??char??????uart0_pString[101];??
  • ??va_list???uart0_ap;??
  • ??
  • ??va_start(uart0_ap,?fmt);??
  • ??vsnprintf(uart0_pString,?100,?fmt,?uart0_ap);??
  • ??UART0_PutString(uart0_pString);??
  • ??va_end(uart0_ap);??
  • }??
  • ??
  • /*******************************************************************************?
  • *?Function?Name??:?UART0_GetChar?
  • *?Description????:?print?format?string.?
  • *?Input??????????:?fmt?
  • *?Output?????????:?None?
  • *?Return?????????:?None?
  • *******************************************************************************/??
  • uint8_t?UART0_GetChar(uint8_t?*ch)??
  • {??
  • ??if(UART_op?!=?UARTCount)??
  • ??{??
  • ????*ch?=?UARTBuffer[UART_op];??
  • ????UART_op?++;??
  • ????if(UART_op?>=?UART0_RBUF_SIZE)??
  • ??????UART_op?=?0;??
  • ??
  • ????return?1;??
  • ??}??
  • ??
  • ??return?0;??
  • } ?
  • 總結

    以上是生活随笔為你收集整理的CortexM0开发 —— LPC11C14的UART使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。