打印

串口DMA接收怎么不可靠啊

[复制链接]
3448|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinjing999|  楼主 | 2009-9-23 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用57600波特率接收两个CPU数据信息,用电脑串口监测数据的情况。
我发现一个问题:
    电脑开机的时候,电脑上电,STM32的串口(DMA接收),不接收数据了,用串口发送数据(DMA发送)正常。
    程序里面已经做了处理,如果DMA不接受数据,重新初始化串口和DMA,可串口就是不接受数据。
    我在调试的时候,发现经常DMA不接受数据,就在程序里面加料错误处理,如果DMA接收不可靠,我估计要得改成串口中断接收了。
    那位高手遇到过这样的问题,怎么才能DMA串口不接收数据了,程序怎么做,能继续接收数据
沙发
jinjing999|  楼主 | 2009-9-23 15: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传输完成中断

使用特权

评论回复
板凳
jinjing999|  楼主 | 2009-9-23 15:13 | 只看该作者
在关电脑的时候,会跟串口发送不正常数据,出现错误可以忽略,但是代码检测的错误后复位串口接收,应该还得能接受数据,现在问题一旦有错误,DMA串口就不接收了。

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

现在用什么方法复位串口DMA?串口DMA才能接收数据啊?

使用特权

评论回复
地板
jinjing999|  楼主 | 2009-9-23 16:03 | 只看该作者
STM32 DMA接收是主机。总线的数据是靠查询的方法,查询别的单片机数据,然后别的单片机返回数据。我PC只是看传的数据,并不发送数据

使用特权

评论回复
5
jinjing999|  楼主 | 2009-9-23 17:34 | 只看该作者
问题找出来了
我打开了串口错误中断,出现问题后,程序一直进入错误中断,我清除了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);

使用特权

评论回复
6
jinjing999|  楼主 | 2009-9-23 17:36 | 只看该作者
netjob说的很正确,问题的症结就是这里。可怎么把中断源去掉啊?

使用特权

评论回复
7
jinjing999|  楼主 | 2009-9-23 18:39 | 只看该作者
我仿真过了
电脑的开关机会出现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);

可这些错误怎么清补掉啊?

使用特权

评论回复
8
jinjing999|  楼主 | 2009-9-24 08:51 | 只看该作者
加班到8点,处理好了

清楚错误标志先读USART_SR,再读USART_DR.
我总是用51核思维去用STM32

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

73

主题

363

帖子

1

粉丝