[技术文档] HK32F103无法进空闲中断的解决办法

[复制链接]
1570|3
 楼主| 过期的塔头 发表于 2022-1-26 22:44 | 显示全部楼层 |阅读模式
项目场景:[color=rgba(0, 0, 0, 0.75)]

芯片:HK32F103C8T6
代码实现效果:用DMA接收串口发送的数据;
实现方式:串口+DMA+空闲中断


问题描述:

进不了空闲中断。HK32F103的空闲中断的标志无法清除。


原因分析: 4038261f15e5446415.png

 楼主| 过期的塔头 发表于 2022-1-26 22:54 | 显示全部楼层
数据手册里说明了:IDLEF位不会被再次置位,直到RXDNE位被置位。所以要先将RXDNE置位,清除标志位,再打开IDLE中断。
 楼主| 过期的塔头 发表于 2022-1-26 23:06 | 显示全部楼层
解决方案:
中断函数如下:
  1. void USART1_IRQHandler(void)                       
  2. {
  3.         u8 USART1_RX_LEN = 0;       
  4.        
  5.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)          //串口1空闲中断
  6.         {
  7.                 USART1->DR;
  8.         }else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
  9.         {
  10.                 USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
  11.                 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                       
  12.                
  13.                 USART1_RX_LEN = USART1_MAX_RX_LEN - DMA1_Channel5->CNDTR;         //接收到的字节数               
  14.                 DMA_Cmd(DMA1_Channel5, DISABLE );                                                    //关闭USART1 TX DMA1 所指示的通道
  15.                 DMA1_Channel5->CNDTR = USART1_MAX_RX_LEN;                                        //DMA通道的DMA缓存的大小,重置CNDTR
  16.             DMA_Cmd(DMA1_Channel5, ENABLE );
  17.         }else
  18.         {
  19.                 USART1->SR;
  20.             USART1->DR;                        //软件序列清除IDLE标志位
  21.             USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
  22.                 USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
  23.         }
  24. }
 楼主| 过期的塔头 发表于 2022-1-26 23:10 | 显示全部楼层
总结:
需要按照文中所写的方式进行处理,否则进不了空闲中断。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

85

主题

999

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部