找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13224|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

Cortex-M3學(xué)習(xí)LPC1768 - UART0實驗

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:81272 發(fā)表于 2015-5-27 19:22 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 xiongxiao 于 2015-5-27 19:25 編輯

LPC1768含有4 個符合16C550工業(yè)標(biāo)準(zhǔn)的異步串口UATR0-UART3,其中UART1具有標(biāo)準(zhǔn)的MODEM接口和RS232。至于RS232的標(biāo)準(zhǔn)是什么樣的,這里不在總結(jié)了,如果哪位有興趣可以上網(wǎng)查一下維基百科。RS-485是后期出現(xiàn)的一個傳輸標(biāo)準(zhǔn),關(guān)于它們的特性,下面列表總結(jié)一下:

RS-232特性
RS-485特性
最高速率約為20kb/s
與TTL電平兼容
傳輸最大距離約為15m
傳輸距離實際達(dá)1200m
共模抑制比能力差
共模抑制比能力強(qiáng)
UATR0/2/3可以工作在UART模式下,也可以工作在IrDA模式下, IrDA是紅外數(shù)據(jù)組織(Infrared Data Association)的簡稱,目前廣泛采用的IrDA紅外連接技術(shù)就是由該組織提出的。到目前為止,全球采用IrDA技術(shù)的設(shè)備超過了5000萬部。IrDA已經(jīng)制訂出物理介質(zhì)和 協(xié)議層規(guī)格,以及2個支持IrDA標(biāo)準(zhǔn)的設(shè)備可以相互監(jiān)測對方并交換數(shù)據(jù)。 初始的IrDA1.0 標(biāo)準(zhǔn)制訂了一個串行,半雙工的同步系統(tǒng),傳輸速率為2400bps到115200bps,傳輸范圍1 m,傳輸半角度為15度到30度。最近IrDA擴(kuò)展了其物理層規(guī)格使數(shù)據(jù)傳輸率提升到4Mbps。IrDA數(shù)據(jù)協(xié)議由物理層,鏈路接入層和鏈路管理層三個基本層協(xié)議組成,另外,為滿足各層上的應(yīng)用的需要,IrDA棧支持IrLAP, IrLMP, IrIAS, IrIAP, IrLPT, IrCOMM, IrOBEX和IrLAN等。IrDA的優(yōu)點是成本低,體積小、功耗低,數(shù)據(jù)傳輸干擾小等。關(guān)于IrDA的協(xié)議與應(yīng)用這里暫時先不總結(jié),后續(xù)學(xué)習(xí)中會再慢慢涉及到,屆時將做深入研究。UATR1具有MODEM接口,能過該接口可以接入電話網(wǎng)絡(luò),實現(xiàn)遠(yuǎn)距離通訊。至于怎么通訊,這里也暫時不總結(jié),因為這一塊懶貓也沒有深入研究。
關(guān)于串口的配置主要涉及到引腳的配置,波特率的配置,幀格式的設(shè)置及FIFO設(shè)置等。涉及到的寄存器主要有接收緩沖寄存器,它包含即將讀取的接收數(shù)據(jù)。發(fā)送保持寄存器,它主要是用來寫入發(fā)送數(shù)據(jù)的,中斷使能寄存器IER,若是用到中斷接收或發(fā)送時需配置些寄存器,與之相關(guān)聯(lián)的寄存器還有中斷標(biāo)志寄存器IIR。還有FIFO控制寄存器FCR,它是用來配置先進(jìn)先出相關(guān)的東東的。線控制寄存器LCR,這個寄存器主要就是用來設(shè)置幀格式的,與這個寄存器相關(guān)聯(lián)的寄存器是線狀態(tài)寄存器LSR,用來讀取幀格式狀態(tài)的寄存器。當(dāng)然還有緩存寄存器SCR,這個與串口操作關(guān)系不大。還有自動波特率控制器ACR,配置程序自適應(yīng)波特率的。還有IrDA控制寄存器,它與紅外發(fā)送與接收有關(guān)。小數(shù)分頻寄存器FDR,它是波特率配置有關(guān)。傳輸使能寄存器TER,如果這個寄存器的TXEN配置為1,剛只要緩存中有有效數(shù)據(jù),就可以通過發(fā)送引腳把數(shù)據(jù)發(fā)送出去。還有一個寄存器FIFO等級寄存器FIFOLVL,它是個只讀寄存器,用來讀取當(dāng)前FIFO等級狀態(tài)。此次實驗我是用查詢方式發(fā)送字符到串口,所以很大寄存器沒有用到,關(guān)于寄存器的詳細(xì)說明可以參考LPC1768的數(shù)據(jù)手冊,這里就不再照搬手冊了。下面簡單說一下這次實驗電路圖,主要是一個 按鍵,8個LED燈,還有串口0,功能就是按一下按鍵亮一個燈,等全亮?xí)r,再按按鍵燈全來,然后再按按鍵時第按一下點亮一個,循環(huán)往復(fù),同時哪個燈亮,就發(fā)送字符“Led  X  on”,下面是這次實驗的電路圖:


                                      圖 1-1 實驗電路圖
下面簡單說一下這個軟件,軟件主要分為兩大部分,一個是關(guān)于串口配置及常用的函數(shù),另一個就是主LED點燈程序,分別在UART.C與MAIN.C兩個源文件中,下面把部分代碼帖出來,完整部分請參閱附件:
1)、 uart.c源文件
#include "includes.h"
/********************************************************************************
* 函數(shù)名稱 :uint32_t UARTInit( uint32_t PortNum, uint32_t baudrate )
* 函數(shù)功能 : 串口初始化
* 入口參數(shù) : uint32_t PortNum  -- 端口號(0、1)
*            uint32_t baudrate -- 波物率
* 出口參數(shù) : 返回真或假
* 備    注 :如果中斷句柄沒有建立在向量表中則返回false
*******************************************************************************/
void UARTInit( uint32_t PortNum, uint32_t baudrate )
{
  uint32_t Fdiv;

  if ( PortNum == 0 )
  {
    PINCON->PINSEL0 |= (1 << 4);             /* Pin P0.2 -- TXD0 (Com0) */
    PINCON->PINSEL0 |= (1 << 6);             /* Pin P0.3 -- RXD0 (Com0) */
            UART0->LCR  = 0x83;                       /* 8 bits, 無校驗, 1 個停止位 */
    Fdiv = (SystemFrequency/4/ 16) / baudrate;/* 設(shè)置波特率 */
    UART0->DLM  = Fdiv / 256;
    UART0->DLL  = Fdiv % 256+1;
    UART0->LCR  = 0x03;                       /* 鎖定波特率  */
    UART0->FCR  = 0x07;                       /* 串口先進(jìn)先出控制寄存器設(shè)置*/

  }
  else if ( PortNum == 1 )
  {
               PINCON->PINSEL4 |= (1<<1);                /* Pin P2.0 -- TXD1 (Com1)*/
          PINCON->PINSEL4 |= (1<<3);                /* Pin P2.1 -- RXD1 (Com1)*/
   
               UART1->LCR = 0x83;                                  /* 8 bits, 無校驗, 1 個停止位 */
    Fdiv = (SystemFrequency/4/16)/ baudrate ; /* 設(shè)置波特, Fpclk: 18MHz */
    UART1->DLM = Fdiv/256;                                                                                             
    UART1->DLL = (Fdiv%256)+1;
               UART1->LCR = 0x03;                                   /* DLAB = 0 */
    UART1->FCR = 0x07;                             /* 使能TX與 RX 并初始化FIFO. */

  }
}

/********************************************************************************
* 函數(shù)名稱 :void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )
* 函數(shù)功能 : 從串口發(fā)送一串?dāng)?shù)據(jù)
* 入口參數(shù) : uint32_t PortNum   -- 端口號(0、1)
*            uint8_t *BufferPtr -- 緩沖指針
*           uint32_t Length    -- 數(shù)據(jù)長度
* 出口參數(shù) : 無
* 備    注 :無
*******************************************************************************/
void UARTSend( uint32_t portNum, uint8_t *BufferPtr, uint32_t Length )
{
  if ( portNum == 0 )
  {
    while ( Length != 0 )
    {
                 while ( !(UART0->LSR & 0x20) );   /* 檢測串口狀態(tài),是否包含有效數(shù)據(jù) */
                 UART0->THR = *BufferPtr;           /* 輸出數(shù)據(jù) */
                 BufferPtr++;                       /* 指向下一個數(shù)據(jù) */
                 Length--;                          /*  數(shù)據(jù)長度減1 */
               }
  }
  else
  {
               while ( Length != 0 )
    {
                 while ( !(UART1->LSR & 0x20));    /* 檢測串口狀態(tài),是否包含有效數(shù)據(jù) */
                 UART1->THR = *BufferPtr;                                         /* 輸出數(shù)據(jù) */
                 BufferPtr++;                                                                                  /* 指向下一個數(shù)據(jù) */
                 Length--;                                                                                         /*  數(shù)據(jù)長度減1 */
    }
  }
  return;
}
/********************************************************************************
* 函數(shù)名稱 :int UART0_SendByte (int ucData)
* 函數(shù)功能 : 串口0發(fā)送數(shù)據(jù)
* 入口參數(shù) : int ucData - 要發(fā)送的數(shù)據(jù)
* 出口參數(shù) : 無
* 備    注 :無
*******************************************************************************/
int UART0_SendByte (int ucData)
{
               while (!(UART0->LSR & 0x20));
    return (UART0->THR = ucData);
}
/********************************************************************************
* 函數(shù)名稱 :void UART0_SendString (unsigned char *s)
* 函數(shù)功能 : 串口0發(fā)送字符串
* 入口參數(shù) : unsigned char *s -- 要發(fā)送的字符串
* 出口參數(shù) : 無
* 備    注 :無
*******************************************************************************/
void UART0_SendString (unsigned char *s)
{
            while (*s != '\0')
               {
                        UART0_SendByte(*s++);
               }
}
2)、 main.c源文件
  1. /*********************************************************************************
  2. 工程名稱:lesson4
  3. 功    能: 學(xué)習(xí)使用LPC1768的串口通訊                                                      
  4. 編譯環(huán)境: MDKV4.12                                                   
  5. 時    鐘: 外部12Mhz                                                                                           
  6. 日    期: 11/08/19                                                        
  7. 作    者: 懶貓愛飛
  8. 版本  號:V1R0
  9. ---------------------------------------------------------------------------------
  10. 修改內(nèi)容:NULL
  11. 修改日期:
  12. 修改人員:
  13. ---------------------------------------------------------------------------------
  14.                                                                                                                                                                                                                          
  15. **********************************************************************************/


  16. /*********************************************************************************
  17. 文件名稱:mian.c
  18. 功    能: 主要調(diào)度函數(shù)及應(yīng)用函數(shù)                                                         
  19. 編譯環(huán)境: MDKV4.12                                                   
  20. 時    鐘: 外部12Mhz                                                                                           
  21. 日    期: 11/08/19                                                        
  22. 作    者: 懶貓愛飛
  23. 備    注:NULL
  24. ---------------------------------------------------------------------------------
  25. 修改內(nèi)容:NULL
  26. 修改日期:XXXX年xx月xx日      xx時xx分
  27. 修改人員:xxx xxx xxx
  28.                                                                                                          
  29. **********************************************************************************/
  30. #include"includes.h"
  31.                                                                             
  32. volatile unsigned long SysTickCnt;                   /* 用于系統(tǒng)時鐘計數(shù) */

  33. unsigned char LedOnMeg[] = "Led 1 On!\r\n";
  34. unsigned char LedOffMeg[] = "Led all Off!\r\n";
  35. unsigned char KeyMeg[] = "key push down \r\n";
  36. unsigned char OpenString[][50] = {
  37.                                 "**********************************************\r\n",
  38.                                 "****             --歡迎光臨--             ****\r\n",
  39.                                                                 "**** 小野獸的小草窩^_^                    ****\r\n",
  40.                                                                 "**** http://blog*ednchina*com/ytfdhb/     ****\r\n",
  41.                                                                 "**** 我是懶貓愛飛,我的口號是:           ****\r\n",
  42.                                                                 "**** 每天進(jìn)步一點點,開心多一點^_^        ****\r\n",
  43.                                                                 "**********************************************\r\n"
  44.                                                             };

  45. unsigned int key_sta = 0;              /* 按鍵狀態(tài) */
  46. unsigned int key_pre = 1;                   /* 按鍵當(dāng)前狀態(tài)值 */
  47. unsigned int key_old = 1;                           /* 按鍵前一個狀態(tài)值 */
  48. unsigned int led_flag = 0;

  49. unsigned int  StepCnt = 0;        /* 狀態(tài)計數(shù) */

  50. /********************************************************************************
  51. * 函數(shù)名稱 :void SysTick_Handler (void)
  52. * 函數(shù)功能 : 系統(tǒng)節(jié)拍定時器中斷函數(shù),每1ms計數(shù)一次
  53. * 入口參數(shù) : 無
  54. * 出口參數(shù) : 無
  55. * 備    注 :無
  56. *******************************************************************************/
  57. void SysTick_Handler (void)
  58. {         
  59.   SysTickCnt++;
  60. }

  61. /********************************************************************************
  62. * 函數(shù)名稱 :void Delay (unsigned long tick)  
  63. * 函數(shù)功能 : 毫秒級延時函數(shù)
  64. * 入口參數(shù) : unsigned long tick -- 延時時長
  65. * 出口參數(shù) : 無
  66. * 備    注 :無
  67. *******************************************************************************/
  68. void DelayMs (unsigned long tick)
  69. {      
  70.   unsigned long systickcnt;

  71.   systickcnt = SysTickCnt;
  72.   while ((SysTickCnt - systickcnt) < tick);
  73. }
  74. /********************************************************************************
  75. * 函數(shù)名稱 :void PortInit(void)  
  76. * 函數(shù)功能 : 端口初始化
  77. * 入口參數(shù) : 無
  78. * 出口參數(shù) : 無
  79. * 備    注 :無
  80. *******************************************************************************/
  81. void PortInit(void)
  82. {
  83.    GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
  84.    GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
  85.    LedAllOff();                                                         /* 初始化時熄滅所有的燈 */
  86. }

  87. /********************************************************************************
  88. * 函數(shù)名稱 :void KeyScan(void)
  89. * 函數(shù)功能 : 按鍵掃描
  90. * 入口參數(shù) : 無
  91. * 出口參數(shù) : 無
  92. * 備    注 :現(xiàn)在只掃描一個按鍵
  93. *******************************************************************************/
  94. void KeyScan()
  95. {
  96.         key_pre = KEY_EN ;
  97.         if(!KEY_EN )                      /* 如果按鍵按下 */
  98.         {
  99.                 if(key_old)
  100.                 {
  101.                     if(key_pre == 0)         /* 下降沿有效 */
  102.                     {
  103.                          key_sta = 1;            /* 記錄按鍵狀態(tài) */
  104.                     }       
  105.             }
  106.         }
  107.         key_old = key_pre;
  108. }

  109. /********************************************************************************
  110. * 函數(shù)名稱 :void KeyHandle(void)
  111. * 函數(shù)功能 : 按鍵處理函數(shù)
  112. * 入口參數(shù) : 無
  113. * 出口參數(shù) : 無
  114. * 備    注 :無
  115. *******************************************************************************/
  116. void KeyHandle(void)
  117. {
  118.     if(key_sta == 1)
  119.     {
  120.             StepCnt++;                        /* 執(zhí)行下一步*/
  121.                 if(StepCnt == 9)
  122.                 {
  123.                         UART0_SendString (LedOffMeg); /* 顯示LED狀態(tài)信息 */               
  124.                 }
  125.                  if(StepCnt < 9)
  126.                 {
  127.                         LedOnMeg[4] = StepCnt+0x30;       /* 轉(zhuǎn)換成字符 */
  128.                 UART0_SendString (LedOnMeg);      /* 顯示LED狀態(tài)信息 */                       
  129.                 }
  130.                 key_sta = 0;                         /* 按鍵狀態(tài)清零,保證只執(zhí)行一次 */
  131.         }       
  132. }
  133. void LedHandle()
  134. {
  135.         switch(StepCnt)
  136.         {
  137.                 case 1:Led1On();   /* LED1 點亮*/
  138.                        break;
  139.                 case 2:Led2On();   /* LED2 點亮*/
  140.                        break;
  141.             case 3:Led3On();   /* LED3 點亮*/
  142.                        break;
  143.             case 4:Led4On();   /* LED4 點亮*/
  144.                        break;
  145.                 case 5:Led5On();   /* LED5 點亮*/
  146.                        break;
  147.                 case 6:Led6On();   /* LED6 點亮*/
  148.                        break;
  149.                 case 7:Led7On();   /* LED7 點亮*/
  150.                        break;
  151.                 case 8:Led8On();   /* LED8 點亮*/
  152.                        break;
  153.             case 9:LedAllOff();        /* 熄滅所有的LED燈*/
  154.                        StepCnt = 0;        /* 重新開始 */
  155.                        break;
  156.                 default:break;
  157.         }
  158. }

  159. /********************************************************************************
  160. * 函數(shù)名稱 :int main(void)
  161. * 函數(shù)功能 : 主函數(shù)
  162. * 入口參數(shù) : 無
  163. * 出口參數(shù) : 無
  164. * 備    注 :無
  165. *******************************************************************************/
  166. int main(void)
  167. {
  168.     unsigned int i = 0;
  169.         SystemInit();       /* 系統(tǒng)初始化,函數(shù)在system_LPC17xx.c文件夾中定義 */
  170.         SysTick_Config(SystemFrequency/1000 - 1);/* 配置節(jié)拍定時器中斷,每1ms中斷一次 */
  171.                                                 
  172.     PortInit();                              /* 端口初始化 */

  173.         UARTInit(0,19200);                             /* 設(shè)置串口0波特率 */
  174.         for(i=0;i<7;i++)
  175.         {
  176.                 UARTSend(0,OpenString[i],50);            /* 發(fā)送歡迎信息 */
  177.         }
  178. //LedOnMeg[4] = 4+0x30;                    /* 轉(zhuǎn)換成字符 */
  179. //UART0_SendString (KeyMeg);
  180.         while(1)
  181.         {
  182.           KeyScan();   // 按鍵掃描
  183.           KeyHandle(); // 按鍵處理
  184.           LedHandle(); // Led處理程序
  185.         }
  186. }




復(fù)制代碼



程序不是太難,只是簡單的實驗,各個部分都有詳細(xì)的注釋,這里不在總結(jié),下面是挨靠結(jié)果串口調(diào)試助手截圖:


圖 1-2 串口助手截圖
好了,先總結(jié)到這吧,最近手頭上的事有點多,所以寫日志的時間就有點緊張,不過,工作歸工作,該學(xué)習(xí)的東東還是要堅持學(xué)習(xí)的,沒有足夠的時間,那就見縫插針的學(xué)吧。最后再來吼一下懶貓的口號,來鼓勵一下自己:每天進(jìn)步一點點,開心多一點^_^

完整程序源代碼工程文件下載地址: SW.rar (188.86 KB, 下載次數(shù): 83)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:84761 發(fā)表于 2015-7-4 16:21 | 只看該作者
這個非常有用啊,感謝樓主。
回復(fù)

使用道具 舉報

板凳
ID:93684 發(fā)表于 2015-10-26 21:48 | 只看該作者
哈哈 不錯不錯 學(xué)習(xí)下
回復(fù)

使用道具 舉報

地板
ID:93888 發(fā)表于 2015-10-28 17:14 | 只看該作者
新手真在整這個  
回復(fù)

使用道具 舉報

5#
ID:105898 發(fā)表于 2016-2-20 10:08 | 只看該作者
多謝樓主,下來看看,多謝多謝
回復(fù)

使用道具 舉報

6#
ID:123407 發(fā)表于 2016-5-26 21:16 | 只看該作者
樓主能不能給我發(fā)一份呢?840515756@qq.com
回復(fù)

使用道具 舉報

7#
ID:127673 發(fā)表于 2016-6-22 15:32 | 只看該作者
樓主 能不能發(fā)給我一份
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表