關於是否在串口中斷服務程序中
是否加清除標誌位操作.
手冊有說明
正常的讀寫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位
兩函數功能一樣!!!