四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3112|回复: 3

NXP的LPC11XX系列,串口中断收发使用

[复制链接]
  • TA的每日心情
    郁闷
    2016-1-18 09:58
  • 7

    主题

    30

    帖子

    326

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    326
    发表于 2015-11-26 09:48:48 | 显示全部楼层 |阅读模式
    最近在用NXP的LPC1111在做一个光感自动无线开关灯的东西,需要用到串口,因为之前公司有人用过,只做了一些简单的修改,注释,使用时发现了一些关于串口的小问题,先附上串口部分代码:
    1. <p>#include "UART.H"
    2. #include <LPC11xx.h>

    3. static u8 g_UART_Sendcount = 0;
    4. u8 UART_New =0;
    5. u8 g_UART_Sendlen = 0;
    6. u8 g_UART_Rcvlen =0;
    7. u8 UART_SendBuf[UARTRCVBUFMAX]={0};
    8. u8 UART_RcvBuf[UARTRCVBUFMAX]={0};

    9. UART_SEND()
    10. {
    11.         while(g_UART_Sendlen > 0)         
    12.         {
    13.                 LPC_UART->THR = UART_SendBuf[g_UART_Sendcount++];
    14.                 g_UART_Sendlen--;
    15.         }
    16.         LPC_UART->IER = 0x01;                                //只开接收中断
    17.         g_UART_Sendcount = 0;         
    18. }


    19. UART_RCV()
    20. {
    21.         u8 unuseful;
    22.         switch (LPC_UART->IIR & 0x0e)                                                                                //判断状态        
    23.         {   
    24.                 case 0x04:                           //010,接收数据可用
    25.                         if(g_UART_Rcvlen < UARTRCVBUFMAX)         
    26.                         {
    27.                                 UART_RcvBuf[g_UART_Rcvlen] = LPC_UART->RBR;
    28.                                 g_UART_Rcvlen++;
    29.                                 UART_New=1;
    30.                         }
    31.                         else
    32.                         {
    33.                                 unuseful = LPC_UART->RBR;
    34.                                 unuseful =0;
    35.                                 UART_New=unuseful;
    36.                                 g_UART_Rcvlen=unuseful;
    37.                         }
    38.                         break;
    39.                 case 0x0C:                    //110,接收超时
    40.                         while(LPC_UART->LSR & 0x01)          //还有字符没有读取   
    41.                         {                        
    42.                                 if(g_UART_Rcvlen < UARTRCVBUFMAX)
    43.                                 {
    44.                                         UART_RcvBuf[g_UART_Rcvlen] = LPC_UART->RBR;
    45.                                         g_UART_Rcvlen++;
    46.                                         UART_New=1;
    47.                                 }
    48.                                 else
    49.                                 {
    50.                                         unuseful = LPC_UART->RBR;                                
    51.                                         unuseful =0;
    52.                                         UART_New=unuseful;
    53.                                         g_UART_Rcvlen=unuseful;
    54.                                 }
    55.                         }
    56.                         break;        
    57.                 default:
    58.                         unuseful =0;
    59.                         UART_New=unuseful;
    60.                         g_UART_Rcvlen=unuseful;
    61.                 break;
    62.         }
    63. }


    64. void UART_Init(void)
    65. {        
    66.         u16 temp;
    67.         NVIC_DisableIRQ(UART_IRQn);             //禁能UART        
    68.         LPC_SYSCON->SYSAHBCLKCTRL |= (1ul << 16);    //使能AHB时钟,否则无法配置ICON
    69.   LPC_IOCON->PIO1_6 |= 0x01;              //UART RXD
    70.         LPC_IOCON->PIO1_7 |= 0x01;              //UART TXD
    71.         
    72.   LPC_SYSCON->SYSAHBCLKCTRL |= (1ul << 12);  // 使能UART时钟      
    73.         LPC_SYSCON->UARTCLKDIV     = 0x01;         // UART时钟不分频
    74.         LPC_UART->LCR  = 0x83;                                //长度为8,1位停止位,奇校验   
    75.         
    76.         temp = 48000000/16/UART_BPS;   //设置波特率        
    77.         LPC_UART->DLM  = temp / 256;
    78.         LPC_UART->DLL  = temp % 256;
    79.         
    80.   LPC_UART->LCR  = 0x03;    //锁定波特率                           
    81.   LPC_UART->FCR  = 0x87;   // 使能FIFO,8字节触发                  
    82.   LPC_UART->IER  = 0x03;                //使能收发中断                                                                                                                                                                                                                                   
    83.         LPC_UART->TER  = 0x80;                        //发送使能                                                                                 
    84.         NVIC_EnableIRQ(UART_IRQn);    //使能UART中断         
    85. }


    86. void UART_IRQHandler(void)
    87. {
    88.         int tmp = LPC_UART->LSR;
    89.         if((tmp  & 0x20) == 0x20)   //判断是不是发送READY中断
    90.         {
    91.                 UART_SEND();
    92.         }
    93.         if((tmp  & 0x01) == 0x01)           //判断是不是接收中断
    94.         {
    95.                 UART_RCV();
    96.         }
    97. }</p>
    复制代码

    一开始使用时是这样的:
    1.         len=sizeof(connect);  //connect是一个要发送的数组
    2.         for(i=0;i<len;i++)
    3.         {
    4.                 UART_SendBuf[i]=connect[i];
    5.         }
    6.         g_UART_Sendlen=len;
    7.         LPC_UART->IER |= 0x02;                                //开发送中断
    复制代码

    发现使用的时候会出现发送不正常,接收到数据,或者先LPC_UART->THR =0xA5随便发一个数据后就正常了,原因嘛,很明显,修改如下搞定:
    1.         len=sizeof(connect);    //connect是一个要发送的数组
    2.         for(i=0;i<len;i++)
    3.         {
    4.                 UART_SendBuf[i]=connect[i];
    5.         }
    6.         g_UART_Sendlen=len;
    7.         LPC_UART->IER = 0x02;                                //开发送中断
    8.         UART_IRQHandler();
    复制代码

  • TA的每日心情
    开心
    2018-7-4 09:31
  • 365

    主题

    740

    帖子

    9624

    积分

    超级版主

    Rank: 8Rank: 8

    积分
    9624
    发表于 2015-11-26 14:06:31 | 显示全部楼层
    整体来说,这个利用串口中断收发数据的架构设计的还是不好,可以自己再优化一下!
  • TA的每日心情
    开心
    2018-7-4 09:27
  • 76

    主题

    369

    帖子

    6325

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    6325
    发表于 2015-11-26 21:06:08 | 显示全部楼层
    牛X,这里有Linux高手没?
  • TA的每日心情
    慵懒
    2017-2-13 10:59
  • 9

    主题

    24

    帖子

    168

    积分

    注册会员

    Rank: 2

    积分
    168
    发表于 2019-7-8 10:55:49 | 显示全部楼层
            2019年6月18日,上海诚实果品新总部正式落户上海虹桥国际商务区,并举行了新总部剪彩仪式。为提升企业文化,上海市静安区书协副主席朱亚东先生应邀出席,并现场挥毫。
            诚实果品所属上海诚实果篮果品有限公司成立于2014年,是国内水果行业“仓储连锁”模式的开创者和引领者。
    [wmv]http://player.youku.com/embed/XNDI1ODM4Njc4MA==[/wmv]
    朱亚东先生现场挥毫之一
    [wmv]http://player.youku.com/embed/XNDI1ODM5MDE5Ng=='[/wmv]
    朱亚东先生现场挥毫之二
    [wmv]http://player.youku.com/embed/XNDI1ODM5MTA4OA==[/wmv]
    朱亚东先生现场挥毫之三





    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2019-12-6 01:38 , Processed in 0.213113 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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