背景:
想以 RX IDLE + DMA 方式收不定长度数据. ( 发送频率低, 长度<16 )
USART1 RX 以 DMA Normal mode 驱动 ( Buffer & CNDTR = 80)
接收 不定个字符后, 等USART1触发 IDLE 中断 (其他 RXNEIE, TXEIE, TCIE关闭)
目前:
(a) DMA1 -> RX Buffer 数据正确
(b) USART1 触发 IDLE中断, 程序进入正常
问题发生在:
当我判断 USART_FLAG_IDLE 时, IDLE旗标它自己清除了!
实验发现, 似乎进了中断USART1_IRQHandler后就会清除.
断点 设在进入后第一个点, SR=0x000000D0
执行第一个指令后, 就变成 SR=0x000000C0
和规格书不一样, 是不是哪边看漏了?
void USART1_IRQHandler(void)
{
//if( RESET != USART_GetFlagStatus( USART1, USART_FLAG_IDLE ))
if( RESET != (USART_FLAG_IDLE & USART1->SR))
{
iRXLen = USART_BUFFER_SIZE - (uint16_t)(DMA1_Channel5->CNDTR);
if( iRXLen > 3) { gMessageIn=1; };
}
USART1->SR =0;
}
疑惑:
问了 AI, AI 说进ISR硬件就会清除IDLE! 这跟我的现象一致!
但RM0008 Reference Manual刚从ST网站下的, 上面明写着要软件清除.
CSDN 随便搜也有几十篇 USART IRQHandler 中 判断 IDLE 的.