项目场景:
芯片:HK32F103C8T6 代码实现效果:用DMA接收串口发送的数据; 实现方式:串口+DMA+空闲中断
问题描述:
调试时发现无法进入空闲中断,同样的代码在STM32F103的板子上运行正常,但在HK32F103上就出现了问题。
原因分析:
HK32F103的空闲中断的标志无法清除,按照HK32的用户手册上所写的方式也不行。
解决方案:
初始化: 开启RXNE中断,关闭IDLE中断 中断函数: 1、检测RXNE中断,触发后清除RXNE标志; 2、清除IDLE中断标志,开启IDLE中断,关闭RXNE中断; 3、检测IDLE中断,触发后关闭IDLE中断、开启RXNE中断、处理数据等;
void USART1_IRQHandler(void)
{
u8 USART1_RX_LEN = 0;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
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 );
DMA1_Channel5->CNDTR = USART1_MAX_RX_LEN;
DMA_Cmd(DMA1_Channel5, ENABLE );
}else
{
USART1->SR;
USART1->DR;
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
}
}
总结:
如果是STM32,那么处理方式比较简单,只需开启IDLE中断,然后在中断函数中检测即可。但是HK32芯片比较麻烦,需要按照文中所写的方式进行处理,否则中断函数进不了中断。
|