查看: 1570|回复: 1

[分享] LPC1768之串口UART0

[复制链接]
  • TA的每日心情
    开心
    2020-12-11 09:21
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    2

    主题

    46

    帖子

    0

    注册会员

    Rank: 2

    积分
    101
    最后登录
    2023-2-15
    发表于 2020-12-2 17:30:18 | 显示全部楼层 |阅读模式
    LPC1768之串口UART0

    串口操作,首先是功率,时钟控制打开。
    然后是管脚选择,设置为串口模式。
    然后设定串口传输数据格式。
    波特率设置,(主意有小数位和没小数位时候不一样,有小数位需要设置DIVADDL和MULVAL)。
    然后锁存波特率。
    设定控制UARTn RX和TX FIFO的操作。
    最后打开系统中UART0的中断,使能接收中断。
    详见代码,代码中有详细注释。
    1. /*************************************************************************************         
    2. *        main.c:  the main file
    3. *        NXP --> LPC1768
    4. *
    5. *   
    6. *        Author        :        light                                       
    7. *        Date        :        2012-4-17  
    8. *
    9. ***************************************************************************************/

    10. #include<LPC17XX.h>


    11. #define FOSC                        12000000                            /*  振荡器频率                  */

    12. #define FCCLK                      (FOSC  * 8)                          /*  主时钟频率<=100Mhz          */
    13.                                                                         /*  FOSC的整数倍                */
    14. #define FCCO                       (FCCLK * 3)                          /*  PLL频率(275Mhz~550Mhz)      */
    15.                                                                         /*  与FCCLK相同,或是其的偶数倍 */
    16. #define FPCLK                      (FCCLK / 4)                          /*  外设时钟频率,FCCLK的1/2、1/4*/
    17.                                                                         /*  或与FCCLK相同               */
    18. int Uart0RecvBuf;                                          // UART0 RX DATA
    19. /********************************************************************************
    20. ** Descriptions                        :Uart0 Initial
    21. **
    22. ** parameters                        :baud rate
    23. ** Returned value                :None
    24. *********************************************************************************/
    25. void Uart0Init(uint32_t bps)
    26. {
    27.         LPC_SC->PCONP |= (1<<3);                                //打开UART0功率、时钟控制位

    28.         LPC_PINCON->PINSEL0 = 0X00000050;                //P0.2 P0.3设置为串口

    29.         LPC_UART0->LCR = 0x83;                                        //设置串口数据格式,8位字符长度,1个停止位,无校验,
    30.                                                                                         //使能访问除数锁存器 ,设定波特率
    31.         LPC_UART0->DLM = ((FPCLK/16)/bps) / 256;        //除数高八位  , 没有小数情况
    32.         LPC_UART0->DLL = ((FPCLK/16)/bps) % 256;         //除数第八位

    33.         LPC_UART0->LCR = 0x03;                                          //禁止访问除数锁存器,锁定波特率

    34.         LPC_UART0->FCR  = 0x07;                                 //控制UARTn RX和TX FIFO的操作。接收数据一个字节触发中断

    35.         NVIC_EnableIRQ(UART0_IRQn);              /* enable irq in nvic              */
    36.         LPC_UART0->IER = 0x01;                                        //使能接收中断
    37. }
    38. /********************************************************************************
    39. ** Descriptions                        :Uart0 Receive Data
    40. **
    41. ** parameters                        :None
    42. ** Returned value                :Received Data
    43. *********************************************************************************/
    44. int Uart0RecvByte(void)          //查询法
    45. {
    46.         //当UnRBR包含未读字符时,UnLSR[0]就会被置位;当UARTn RBR FIFO为空时,UnLSR[0]就会被清零
    47.         //0  -  UnRBR为空
    48.         //1  -  UnRBR包含有效数据
    49.         while(!((LPC_UART0->LSR) & 0x01));                //等待判断LSR[0]是否是1,1时表示RBR中接收到数据               
    50.         
    51.         return(LPC_UART0->RBR);                                          //读取接收数据
    52. }
    53. /********************************************************************************
    54. ** Descriptions                        :Uart0 Send Data
    55. **
    56. ** parameters                        :None
    57. ** Returned value                :None
    58. *********************************************************************************/
    59. int Uart0SendByte(int buf)
    60. {
    61.         //当检测到UARTn THR已空时,THRE就会立即被设置。写UnTHR会清零THRE
    62.         //0  -  UnTHR包含有效字符
    63.         //1  -  UnTHR为空
    64.         while(!((LPC_UART0->LSR) & 0x01));                //等待判断LSR[5](即THRE)是否是1,1时表示THR中为空               
    65.         
    66.         LPC_UART0->THR = buf;                                          //发送数据

    67.         return 0;
    68. }
    69. /********************************************************************************
    70. ** Descriptions                        :Uart0 Interrupt Receive Data
    71. **
    72. ** parameters                        :None
    73. ** Returned value                :Received Data
    74. *********************************************************************************/
    75. void UART0_IRQHandler(void)
    76. {
    77.         Uart0RecvBuf = LPC_UART0->RBR;                //读取接收数据        

    78.         Uart0SendByte(Uart0RecvBuf);                //发送接收到的数据
    79. }

    80. /*----------------------------------------------------------------------------
    81.   The main Function
    82. *----------------------------------------------------------------------------*/
    83. int main(void)
    84. {
    85.         int temp;

    86.         SystemInit();
    87.         Uart0Init(115200);

    88.         while(1)
    89.         {
    90.                                        
    91.         //        temp = Uart0RecvByte();                        //查询接收数据
    92.         //        Uart0SendByte(temp);                        //发送数据

    93.         }

    94. }
    复制代码


    签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-10 22:38
  • 签到天数: 1335 天

    [LV.10]以坛为家III

    88

    主题

    4292

    帖子

    12

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    9049
    最后登录
    2024-4-13
    发表于 2020-12-2 17:33:15 | 显示全部楼层
    LPC1768在接收中断里面不需要手动清除中断标志位吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-27 00:40 , Processed in 0.110433 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表