做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
时间: 2024-10-10 08:57:16