项目场景:
芯片:HK32F103C8T6
代码实现效果:用DMA接收串口发送的数据;
实现方式:串口+DMA+空闲中断
问题描述:
进不了空闲中断。HK32F103的空闲中断的标志无法清除。
原因分析:
数据手册里说明了:IDLEF位不会被再次置位,直到RXDNE位被置位。所以要先将RXDNE置位,清除标志位,再打开IDLE中断。
解决方案:
中断函数如下:
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);
}
}
总结:
需要按照文中所写的方式进行处理,否则进不了空闲中断。