STM32串口中斷處理中.清除接受/發送完成/中斷 標誌位的問題.

關於是否在串口中斷服務程序中 

是否加清除標誌位操作.

手冊有說明





正常的讀寫DR寄存器都能達到清楚標誌的效果.所以除了多緩存通信的情況下,沒必要增加清除標誌位.

兩個清除函數.USART_ClearFlag 清除完成標誌位  USART_ClearITPendingBit清除中斷標誌位

據說二者功能一樣. 我還沒細看.是否一樣,待定吧.程序如下.總之之後進行讀寫DR操作都會把他們清除.所以無論兩個函數功能是否一樣,進行DR讀寫之後,都會對SR寄存器進行一致的處理. 

void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG)

{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_FLAG(USART_FLAG));
  /* The CTS flag is not available for UART4 and UART5 */
  if ((USART_FLAG & USART_FLAG_CTS) == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  } 
   
  USARTx->SR = (uint16_t)~USART_FLAG;

}

USART_FLAG_TC/RXNE的值分別是 u16型 二進制5/6位 (對應寄存器TC,RXNE)爲1.

void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT)
{
  uint16_t bitpos = 0x00, itmask = 0x00;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_CLEAR_IT(USART_IT));
  /* The CTS interrupt is not available for UART4 and UART5 */
  if (USART_IT == USART_IT_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }   
  
  bitpos = USART_IT >> 0x08;
  itmask = ((uint16_t)0x01 << (uint16_t)bitpos);
  USARTx->SR = (uint16_t)~itmask;

}

USART_IT_TC/RXNE 的值分別是 0x626  0x525  右移8位後分別是 0110 (6) / 0101(5)

0x01 左移 5/6位   

 兩函數功能一樣!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章