STM32串口中断处理中.是否需要清除接受/发送完成/中断 标志位的问题. | 您所在的位置:网站首页 › 串口标识符 › 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 SR = (uint16_t)~itmask; } USART_IT_TC/RXNE 的值分别是 0x626 0x525 右移8位后分别是 0110 (6) / 0101(5) 0x01 左移 5/6位 两函数功能一样!!! |
CopyRight 2018-2019 实验室设备网 版权所有 |