串口DMA接收怎么不可靠啊

boyeexie   2009-9-23 09:07 楼主
我是用57600波特率接收两个CPU数据信息,用电脑串口监测数据的情况。
我发现一个问题:
    电脑开机的时候,电脑上电,STM32的串口(DMA接收),不接收数据了,用串口发送数据(DMA发送)正常。
    程序里面已经做了处理,如果DMA不接受数据,重新初始化串口和DMA,可串口就是不接受数据。
    我在调试的时候,发现经常DMA不接受数据,就在程序里面加料错误处理,如果DMA接收不可靠,我估计要得改成串口中断接收了。
    那位高手遇到过这样的问题,怎么才能DMA串口不接收数据了,程序怎么做,能继续接收数据

回复评论 (10)

这是不能接受数据,复位串口的代码:
    USART_InitTypeDef USART_InitStructure;

        USART_Cmd(USART1, DISABLE);

        DMA_tx_Configuration(1);//发送1个数据的代码
        DMA_rx_Configuration(1);//接收数据的复位代码
        USART_InitStructure.USART_BaudRate = 57600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          USART_InitStructure.USART_StopBits = USART_StopBits_1;
          USART_InitStructure.USART_Parity = USART_Parity_No;
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
          USART_Init(USART1, &USART_InitStructure);
          /* Enable USART1 DMA Rx and TX request */
          USART_DMACmd(USART1, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
        /* Enable DMA1 Channel4 */
          DMA_Cmd(DMA1_Channel4, ENABLE);
          /* Enable DMA1 Channel5 */
          DMA_Cmd(DMA1_Channel5, ENABLE);
        /* Enable the USART1 */
          USART_Cmd(USART1, ENABLE);
        DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
          DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); //使能DMA传输完成中断
点赞  2009-9-23 15:10
在关电脑的时候,会跟串口发送不正常数据,出现错误可以忽略,但是代码检测的错误后复位串口接收,应该还得能接受数据,现在问题一旦有错误,DMA串口就不接收了。

现在问题很纳闷
       我软件仿真的时候,复位,串口DMA接收正常。程序所有的初始化全部代码不接收数据都初始化(包括系统时钟都初始化了)。串口DMA就是不接收数据.

现在用什么方法复位串口DMA?串口DMA才能接收数据啊?
点赞  2009-9-23 15:13
                                 DMA完成接收工作任务,你的PC还拼命向它灌水啊~,不淹死才怪!
点赞  2009-9-23 15:51
                                 STM32 DMA接收是主机。总线的数据是靠查询的方法,查询别的单片机数据,然后别的单片机返回数据。我PC只是看传的数据,并不发送数据
点赞  2009-9-23 16:03
DMA的中断后,
   清串口的 RXNE 和 溢出 ORE
    在单缓冲器模式里,由软件读USART_DR 寄存器完成对RXNE 位清除。
   RXNE 标志也可以通过对它写0 来清除。RXNE 位必须在下一字符接收结束前被清零,以避免溢出错误。   

其实就是 每次DMA中断后重新初始化DMA通道,在清标志。。。
点赞  2009-9-23 16:08
DMA的中断后,
   清串口的 RXNE 和 溢出 ORE
    在单缓冲器模式里,由软件读USART_DR 寄存器完成对RXNE 位清除。
   RXNE 标志也可以通过对它写0 来清除。RXNE 位必须在下一字符接收结束前被清零,以避免溢出错误。   

其实就是 每次DMA中断后重新初始化DMA通道,在清标志。。。
点赞  2009-9-23 16:08
问题找出来了
我打开了串口错误中断,出现问题后,程序一直进入错误中断,我清除了10个中断源,还是一直进入中断。怎么把错误中断清除啊?

                USART_ClearITPendingBit(USART1,USART_IT_PE);//奇偶错误中断
                USART_ClearITPendingBit(USART1,USART_IT_TXE);//发送中断
                USART_ClearITPendingBit(USART1,USART_IT_TC);
                USART_ClearITPendingBit(USART1,USART_IT_IDLE);
                USART_ClearITPendingBit(USART1,USART_IT_LBD);
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                USART_ClearITPendingBit(USART1,USART_IT_ORE);
                USART_ClearITPendingBit(USART1,USART_IT_NE);
                USART_ClearITPendingBit(USART1,USART_IT_FE);
                USART_ClearITPendingBit(USART1,USART_IT_PE);
点赞  2009-9-23 17:34
                                 netjob说的很正确,问题的症结就是这里。可怎么把中断源去掉啊?
点赞  2009-9-23 17:36
我仿真过了
电脑的开关机会出现ORE  NE  TE错误,可我在程序中加了清除这些标志错误:
        DMA_ClearFlag(DMA1_FLAG_TE5);
                USART_ClearITPendingBit(USART1,USART_IT_PE);//奇偶错误中断
                USART_ClearITPendingBit(USART1,USART_IT_TXE);//发送中断
                USART_ClearITPendingBit(USART1,USART_IT_TC);
                USART_ClearITPendingBit(USART1,USART_IT_IDLE);
                USART_ClearITPendingBit(USART1,USART_IT_LBD);
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                USART_ClearITPendingBit(USART1,USART_IT_ORE);
                USART_ClearITPendingBit(USART1,USART_IT_NE);
                USART_ClearITPendingBit(USART1,USART_IT_FE);
                USART_ClearITPendingBit(USART1,USART_IT_PE);
        //}
          
                   USART_ClearFlag(USART1,USART_FLAG_PE);//奇偶错误中断
                USART_ClearFlag(USART1,USART_FLAG_TXE);//发送中断
                USART_ClearFlag(USART1,USART_FLAG_TC);
                USART_ClearFlag(USART1,USART_FLAG_IDLE);
                USART_ClearFlag(USART1,USART_FLAG_LBD);
                USART_ClearFlag(USART1,USART_FLAG_RXNE);
                USART_ClearFlag(USART1,USART_FLAG_ORE);
                USART_ClearFlag(USART1,USART_FLAG_NE);
                USART_ClearFlag(USART1,USART_FLAG_FE);
                USART_ClearFlag(USART1,USART_FLAG_PE);

可这些错误怎么清补掉啊?
点赞  2009-9-23 18:39
加班到8点,处理好了

清楚错误标志先读USART_SR,再读USART_DR.
我总是用51核思维去用STM32
点赞  2009-9-24 08:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复