搜索   Search
联系我们   Contact

精读OSAL --中断方式串行通信(_hal_uart_isr.c) TI

发布:2015-05-19 23:37 点击:

当在HAL里读完 _hal_uart_isr.c 就明白了TI的工程师写的发送接收算法.

 

[cpp] view plaincopy
 
  1. static void HalUARTInitISR(void)   
[cpp] view plaincopy
 
  1. static void HalUARTOpenISR(halUARTCfg_t *config)  


初始化和打开没什么好讲的,读文档就有了.

 

先在这里讲缓冲区算法

             |-------------------|

head-->|-------------------|

             |-------------------|

             |-------------------|

             |-------------------|

    tail-->|-------------------|

             |-------------------|

             |-------------------|

             |-------------------|

             |-------------------|

             |-------------------|

head和tail都是一个方向移动,当移到末位就回到开头位置.这个很重要..

读写函数不是真正的发送接改函数,他们只是负责将数填入上述的缓冲区,

或者从缓冲区中读出.

怎么操作呢? 读写函数只是将数填入或读出缓冲区,然后移动其中一个指针..

那么什么时候结束呢? 就是head==tail..

这里还有,另一个指针是在发送接收中断函数中移动.

这是这种你追我跑的方式发送接收.

 

这里开始读写函数

[cpp] view plaincopy
 
  1. /***************************************************************************** 
  2.  * @fn      HalUARTReadISR 
  3.  * 
  4.  * @brief   Read a buffer from the UART 
  5.  * 
  6.  * @param   buf  - valid data buffer at least 'len' bytes in size 
  7.  *          len  - max length number of bytes to copy to 'buf' 
  8.  * 
  9.  * @return  length of buffer that was read 
  10.  *****************************************************************************/  
  11. static uint16 HalUARTReadISR(uint8 *buf, uint16 len)  
  12. {  
  13.   uint16 cnt = 0;  
  14.   
  15.   while ((isrCfg.rxHead != isrCfg.rxTail) && (cnt < len))   //这是读结束条件  
  16.   {  
  17.     *buf++ = isrCfg.rxBuf[isrCfg.rxHead++];  
  18.     if (isrCfg.rxHead >= HAL_UART_ISR_RX_MAX)  
  19.     {  
  20.       isrCfg.rxHead = 0;  
  21.     }  
  22.     cnt++;  
  23.   }  
  24.   
  25.   return cnt;  
  26. }  
  27.   
  28. /****************************************************************************** 
  29.  * @fn      HalUARTWriteISR 
  30.  * 
  31.  * @brief   Write a buffer to the UART. 
  32.  * 
  33.  * @param   buf - pointer to the buffer that will be written, not freed 
  34.  *          len - length of 
  35.  * 
  36.  * @return  length of the buffer that was sent 
  37.  *****************************************************************************/  
  38. static uint16 HalUARTWriteISR(uint8 *buf, uint16 len)  
  39. {  
  40.   uint16 cnt;  
  41.   
  42.   // Enforce all or none.  
  43.   if (HAL_UART_ISR_TX_AVAIL() < len)   //判断长度是否大于当前有效长度  
  44.   {  
  45.     return 0;  
  46.   }  
  47.   
  48.   for (cnt = 0; cnt < len; cnt++)  
  49.   {  
  50.     isrCfg.txBuf[isrCfg.txTail] = *buf++;  
  51.     isrCfg.txMT = 0;  
  52.   
  53.     if (isrCfg.txTail >= HAL_UART_ISR_TX_MAX-1)  //缓冲区循环  
  54.     {  
  55.       isrCfg.txTail = 0;  
  56.     }  
  57.     else  
  58.     {  
  59.       isrCfg.txTail++;  
  60.     }  
  61.   
  62.     // Keep re-enabling ISR as it might be keeping up with this loop due to other ints.  
  63.     IEN2 |= UTXxIE;  
  64.   }  
  65.   
  66.   return cnt;  
  67. }  


 

 

这里是中断服务程序:

[cpp] view plaincopy
 
  1. /*************************************************************************************************** 
  2.  * @fn      halUartRxIsr 
  3.  * 
  4.  * @brief   UART Receive Interrupt 
  5.  * 
  6.  * @param   None 
  7.  * 
  8.  * @return  None 
  9.  ***************************************************************************************************/  
  10. #if (HAL_UART_ISR == 1)  
  11. HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )  
  12. #else  
  13. HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR )  
  14. #endif  
  15. {  
  16.   HAL_ENTER_ISR();  
  17.   
  18.   uint8 tmp = UxDBUF;  
  19.   isrCfg.rxBuf[isrCfg.rxTail] = tmp;  
  20.   
  21.   // Re-sync the shadow on any 1st byte received.  
  22.   if (isrCfg.rxHead == isrCfg.rxTail)  
  23.   {  
  24.     isrCfg.rxShdw = ST0;  
  25.   }  
  26.   
  27.   if (++isrCfg.rxTail >= HAL_UART_ISR_RX_MAX)  
  28.   {  
  29.     isrCfg.rxTail = 0;  
  30.   }  
  31.   
  32.   isrCfg.rxTick = HAL_UART_ISR_IDLE;  
  33.   
  34.   HAL_EXIT_ISR();  
  35. }  
  36.   
  37. /*************************************************************************************************** 
  38.  * @fn      halUartTxIsr 
  39.  * 
  40.  * @brief   UART Transmit Interrupt 
  41.  * 
  42.  * @param   None 
  43.  * 
  44.  * @return  None 
  45.  ***************************************************************************************************/  
  46. #if (HAL_UART_ISR == 1)  
  47. HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )  
  48. #else  
  49. HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )  
  50. #endif  
  51. {  
  52.   HAL_ENTER_ISR();  
  53.   
  54.   if (isrCfg.txHead == isrCfg.txTail)  
  55.   {  
  56.     IEN2 &= ~UTXxIE;  
  57.     isrCfg.txMT = 1;  
  58.   }  
  59.   else  
  60.   {  
  61.     UTXxIF = 0;  
  62.     UxDBUF = isrCfg.txBuf[isrCfg.txHead++];  
  63.   
  64.     if (isrCfg.txHead >= HAL_UART_ISR_TX_MAX)  
  65.     {  
  66.       isrCfg.txHead = 0;  
  67.     }  
  68.   }  
  69.   
  70.   HAL_EXIT_ISR();  
  71. }  


 都明白了吧?? 还有一个重要的东西:static void HalUARTPollISR(void)

这个函数是在OSAL每次循环中都调出一次,主要是设置事件,调用相应的回调函数.

 

[cpp] view plaincopy
 
  1. static void HalUARTPollISR(void)  
  2. {  
  3.   uint16 cnt = HAL_UART_ISR_RX_AVAIL();  
  4.   uint8 evt = 0;  
  5.   
  6.   if (isrCfg.rxTick)  
  7.   {  
  8.     // Use the LSB of the sleep timer (ST0 must be read first anyway).  
  9.     uint8 decr = ST0 - isrCfg.rxShdw;  
  10.   
  11.     if (isrCfg.rxTick > decr)  
  12.     {  
  13.       isrCfg.rxTick -= decr;  
  14.     }  
  15.     else  
  16.     {  
  17.       isrCfg.rxTick = 0;  
  18.     }  
  19.   }  
  20.   isrCfg.rxShdw = ST0;  
  21.   
  22.   if (cnt >= HAL_UART_ISR_RX_MAX-1)  
  23.   {  
  24.     evt = HAL_UART_RX_FULL;  
  25.   }  
  26.   else if (cnt >= HAL_UART_ISR_HIGH)  
  27.   {  
  28.     evt = HAL_UART_RX_ABOUT_FULL;  
  29.   }  
  30.   else if (cnt && !isrCfg.rxTick)  
  31.   {  
  32.     evt = HAL_UART_RX_TIMEOUT;  
  33.   }  
  34.   
  35.   if (isrCfg.txMT)  
  36.   {  
  37.     isrCfg.txMT = 0;  
  38.     evt |= HAL_UART_TX_EMPTY;  
  39.   }  
  40.   
  41.   if (evt && (isrCfg.uartCB != NULL))  
  42.   {  
  43.     isrCfg.uartCB(HAL_UART_ISR-1, evt);  
  44.   }  
  45. }  

 

其它函数就不太重要了.

知道这些就很好理解了.


关闭 大豪方案承接以下业务:

单片机开发
智能家居方案开发
ARM软件开发
手机APP软件开发
电子产品电路设计
电子产品开发
无线控制系统开发
产品老化测试系统定制
单片机工控系统定制
电子产品合作开发
动静态数据采集系统
应力应变测试开发
欢迎新老客户来电咨询! 13530382506