STM32串口遇到的一个问题

做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);
}

 

猜你喜欢

转载自www.cnblogs.com/chengeputongren/p/12177447.html
今日推荐