OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4246|回复: 5

串口采用DMA的方式接收,在921600的波特率下,接收到乱码,不知道是什么原因,请各位大神指点一二

[复制链接]

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-9
在线时间
63 小时
发表于 2017-3-14 13:57:56 | 显示全部楼层 |阅读模式
程序如下:void USART_Configuration(void)
{
  USART_InitTypeDef  USART_InitStructure;

        USART_InitStructure.USART_BaudRate=921600;  
        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);
        //USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);  
        USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);  
        USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
        USART_Cmd(USART1,ENABLE);        
        USART_ClearFlag(USART1,USART_FLAG_TC);
}




void DMA_Configuration(void)
{
       
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        DMA_DeInit(DMA1_Channel5);  
        DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART1->DR;
        DMA_InitStructure.DMA_MemoryBaseAddr=(u32)receive_data;   
        DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;   
        DMA_InitStructure.DMA_BufferSize=UART_RX_LEN ;   
        DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;  
        DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;  
        DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;  
        DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;   
        DMA_InitStructure.DMA_Priority=DMA_Priority_High;  
        DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
        DMA_Init(DMA1_Channel5,&DMA_InitStructure);
        DMA_ITConfig (DMA1_Channel5,DMA_IT_TC,ENABLE);
        DMA_Cmd(DMA1_Channel5, ENABLE);   
}







void Usart1_Send(u8 *buf,u8 len)
{
        u8 t=0;
          for(t=0;t<len;t++)               
        {                  
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);          
                USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);               
}


void USART1_IRQHandler(void)
{
   u16 temp=0;


        if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)  
                {
                        USART_ClearITPendingBit( USART1, USART_IT_IDLE );  
                         temp= USART1->SR;
                         temp = USART1->DR;
                        DMA_Cmd(DMA1_Channel5, DISABLE );
                        temp = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Channel5);       
                  
                        printf ("The lenght:%d\r\n",temp);
                        printf ("The data:\r\n");
                        Usart1_Send(receive_data,temp);
                        printf ("\r\nOver! \r\n");
                       
                        //USART_ClearITPendingBit(USART1, USART_IT_IDLE);        
                        DMA_Cmd(DMA1_Channel5, DISABLE );                           DMA_SetCurrDataCounter(DMA1_Channel5,UART_RX_LEN);

                     DMA_Cmd(DMA1_Channel5, ENABLE);            
     }
               


}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

97

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
384
金钱
384
注册时间
2011-4-10
在线时间
72 小时
发表于 2017-3-14 16:43:21 | 显示全部楼层
会不会是外部硬件在波特率高的时候波形失真了
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-9
在线时间
63 小时
 楼主| 发表于 2017-3-15 08:22:43 | 显示全部楼层
kdtcf 发表于 2017-3-14 16:43
会不会是外部硬件在波特率高的时候波形失真了

也不是外部硬件的问题,我之前用中断的方式没问题啊
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-9
在线时间
63 小时
 楼主| 发表于 2017-3-15 08:23:08 | 显示全部楼层
yklstudent 发表于 2017-3-14 21:09
楼主接收都用DMA了,还判断从USART1->DR读取的数据

接收不完整啊
回复 支持 反对

使用道具 举报

4

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-3-9
在线时间
63 小时
 楼主| 发表于 2017-3-16 12:48:45 | 显示全部楼层
yklstudent 发表于 2017-3-15 19:44
接收不完整,那你该查查什么原因;

加了一个延时函数就OK了
回复 支持 反对

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-6-4 10:53:02 | 显示全部楼层
你的眼睛 发表于 2017-3-16 12:48
加了一个延时函数就OK了

我也遇到这个问题,在哪里加延时啊?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 23:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表