四联光电智能照明论坛

标题: NXP的LPC11XX系列,串口中断收发使用 [打印本页]

作者: 魔幻使者Jack    时间: 2015-11-26 09:48
标题: NXP的LPC11XX系列,串口中断收发使用
最近在用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();
复制代码


作者: gxm771208    时间: 2015-11-26 14:06
整体来说,这个利用串口中断收发数据的架构设计的还是不好,可以自己再优化一下!
作者: linux    时间: 2015-11-26 21:06
牛X,这里有Linux高手没?
作者: 一不小心爱上    时间: 2019-7-8 10:55
        2019年6月18日,上海诚实果品新总部正式落户上海虹桥国际商务区,并举行了新总部剪彩仪式。为提升企业文化,上海市静安区书协副主席朱亚东先生应邀出席,并现场挥毫。
        诚实果品所属上海诚实果篮果品有限公司成立于2014年,是国内水果行业“仓储连锁”模式的开创者和引领者。
http://player.youku.com/embed/XNDI1ODM4Njc4MA==
[wmv]http://player.youku.com/embed/XNDI1ODM4Njc4MA==[/wmv]
朱亚东先生现场挥毫之一
http://player.youku.com/embed/XNDI1ODM5MDE5Ng==\'
[wmv]http://player.youku.com/embed/XNDI1ODM5MDE5Ng=='[/wmv]
朱亚东先生现场挥毫之二
http://player.youku.com/embed/XNDI1ODM5MTA4OA==
[wmv]http://player.youku.com/embed/XNDI1ODM5MTA4OA==[/wmv]
朱亚东先生现场挥毫之三










欢迎光临 四联光电智能照明论坛 (http://5xhome.com/) Powered by Discuz! X3.2