吕傑森 2023-10-05 19:11 采纳率: 40%
浏览 47
已结题

STM32F103C8 USART1 IDLE旗标进中断后, 会自动清除?

背景:
想以 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 的.

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-10-05 23:42
    关注

    引自强大而免费的微信小程序:皆我百晓生。


    在STM32F103C8芯片上,当USART1的IDLE标志位触发中断时,该标志位会自动清除。这与RM0008参考手册中的描述是一致的,RM0008中明确指出,软件需要在主程序中读取SR寄存器的IDLE标志位来清除该标志位。由于硬件自动清除IDLE标志位,所以在USART1_IRQHandler中使用USART1->SR = 0来清除IDLE标志位是多余的操作,不需要进行。

    至于为什么AI会说进入ISR硬件会清除IDLE标志位,可能是因为在某些其他型号的STM32芯片上,IDLE标志位可能在进入ISR时自动清除,造成了一些误解。但对于STM32F103C8来说,是需要通过软件来清除IDLE标志位的。

    所以,在你的代码中,只需要使用if( RESET != (USART_FLAG_IDLE & USART1->SR))来判断IDLE标志位是否触发,而不需要手动清除IDLE标志位。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月7日
  • 已采纳回答 10月7日
  • 修改了问题 10月5日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 带序列特征的多输出预测模型
  • ¥15 VB.NET读取电脑主板序列号
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)
  • ¥30 comfyui openpose报错
  • ¥20 Wpf Datarid单元格闪烁效果的实现
  • ¥15 图像分割、图像边缘提取
  • ¥15 sqlserver执行存储过程报错