做HLW8032电能表项目中关于USART使用DMA接收定长数据的问题
1:由于HLW8032芯片一上电,芯片就会通过串口每隔50ms向STM32发送24字节的数据,且我不能通过STM32控制HLW8032发送数据,由于STM32初始化需要一段时间,所以当STM32接收数据时会出现丢包的情况。。
2:解决方法:使用USART空闲中断,在初始化时先不使能串口DMA,只打开串口,在STM32串口空闲时,跳入串口空闲中断,
先判断数据是否正确,是否接收到24个字节的数据,如果数据校验错误,将缓冲区清零,如果数据正确,关掉串口空闲中断,最后使能串口DMA和DMA。
//串口1中断
//做数据发送结束判断
void USART1_IRQHandler()
{
uint32_t clear=0;
uint8_t i=0;
if(USART_GetITStatus(DEBUG_USARTx,USART_IT_IDLE)!=RESET)
{
//判断数据是否正确
if(DMA_GetCurrDataCounter(DMA1_Channel5)!=24||Check_True_Data()==0)
{
//数组清零
for(i=0;i<24;i++)
{
DMA_Recive_Data[i]=0;
}
}
else if(DMA_GetCurrDataCounter(DMA1_Channel5)==24&&Check_True_Data()==1)
{
//关闭串口空闲中断
USART_ITConfig(USART1,USART_IT_IDLE, DISABLE);
}
}
//注意:只有读取寄存器DR SR才能清楚空闲中断标志位
clear=USART1->DR;
clear=USART1->SR;
//使能DMA1,通道5
DMA_Cmd(DMA1_Channel5,ENABLE);
//使能串口DMA
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
}
来源:https://www.cnblogs.com/chengeputongren/p/12177447.html