打印
[技术文档]

HK32F103无法进空闲中断的解决办法

[复制链接]
1335|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
项目场景:[color=rgba(0, 0, 0, 0.75)]

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


问题描述:

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


原因分析:

使用特权

评论回复

相关帖子

沙发
过期的塔头|  楼主 | 2022-1-26 22:54 | 只看该作者
数据手册里说明了:IDLEF位不会被再次置位,直到RXDNE位被置位。所以要先将RXDNE置位,清除标志位,再打开IDLE中断。

使用特权

评论回复
板凳
过期的塔头|  楼主 | 2022-1-26 23:06 | 只看该作者
解决方案:
中断函数如下:
void USART1_IRQHandler(void)                        
{
        u8 USART1_RX_LEN = 0;       
       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)          //串口1空闲中断
        {
                USART1->DR;
        }else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
        {
                USART_ITConfig(USART1, USART_IT_IDLE, DISABLE);
                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                       
               
                USART1_RX_LEN = USART1_MAX_RX_LEN - DMA1_Channel5->CNDTR;         //接收到的字节数               
                DMA_Cmd(DMA1_Channel5, DISABLE );                                                    //关闭USART1 TX DMA1 所指示的通道
                DMA1_Channel5->CNDTR = USART1_MAX_RX_LEN;                                        //DMA通道的DMA缓存的大小,重置CNDTR
            DMA_Cmd(DMA1_Channel5, ENABLE );
        }else
        {
                USART1->SR;
            USART1->DR;                        //软件序列清除IDLE标志位
            USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
        }
}

使用特权

评论回复
地板
过期的塔头|  楼主 | 2022-1-26 23:10 | 只看该作者
总结:
需要按照文中所写的方式进行处理,否则进不了空闲中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

908

帖子

0

粉丝