OpenEdv-开源电子网

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

串口接收挂载DMA后数据有时会出错

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-11-15
在线时间
3 小时
发表于 2017-11-15 22:02:03 | 显示全部楼层 |阅读模式
2金钱
芯片是STM32F407
问题是这样的:我设置USART2的接收到DMA1,然后在DMA中断中解析数据。当我把USART2的引脚设置为PD5、PD6时解析得到的数据是正确的,当我把引脚改为PA2、PA3时解析到的数据就是错的。然后我把同样的程序下载到另一块芯片上,发现两种引脚都不行了,数据都是错的,症状一样。不知道这是为什么,求助。给串口发的数据和解析的程序确定是对的。
补充:第一块芯片是407VET6,第二块芯片是407ZGT6

[mw_shl_code=c,true]u8 sbus_rx_buffer[18];//为接收数据开辟的内存空间
void USART2_Init(u32 Baud, u8 NvicPP, u8 NvicSP)
{
        GPIO_InitTypeDef        gpio;
        USART_InitTypeDef        usart;
        NVIC_InitTypeDef        nvic;       
    DMA_InitTypeDef                dma;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,  ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,   ENABLE);
       
        /*usart gpio init config*/
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);//PA2:TX
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);//PA3:RX       

        gpio.GPIO_Pin   = GPIO_Pin_5;
        gpio.GPIO_Mode  = GPIO_Mode_AF;
        gpio.GPIO_Speed = GPIO_Speed_50MHz;
        gpio.GPIO_OType = GPIO_OType_PP;
        gpio.GPIO_PuPd  = GPIO_PuPd_UP;
        GPIO_Init(GPIOD, &gpio);
       
        gpio.GPIO_Pin   = GPIO_Pin_6;  
        gpio.GPIO_OType = GPIO_OType_OD;  
        gpio.GPIO_PuPd  = GPIO_PuPd_NOPULL;  
        GPIO_Init(GPIOD, &gpio);
       
        /*usart_dma init config*/
        DMA_Cmd(DMA1_Stream5, DISABLE);//先失能
        while(DMA_GetCmdStatus(DMA1_Stream5) != DISABLE);//等待DMA可配置       

    DMA_DeInit(DMA1_Stream5);

    dma.DMA_Channel             = DMA_Channel_4;
    dma.DMA_PeripheralBaseAddr  = (uint32_t)(&USART2->DR);
    dma.DMA_Memory0BaseAddr     = (uint32_t)sbus_rx_buffer;
        dma.DMA_DIR                 = DMA_DIR_PeripheralToMemory;
        dma.DMA_BufferSize          = 18;       
    dma.DMA_PeripheralInc       = DMA_PeripheralInc_Disable;
    dma.DMA_MemoryInc           = DMA_MemoryInc_Enable;
    dma.DMA_PeripheralDataSize  = DMA_PeripheralDataSize_Byte;
    dma.DMA_MemoryDataSize      = DMA_MemoryDataSize_Byte;
    dma.DMA_Mode                = DMA_Mode_Circular;
    dma.DMA_Priority            = DMA_Priority_VeryHigh;
       
    //指定如果FIFO模式或直接模式将用于指定的流_不使能FIFO模式
        dma.DMA_FIFOMode            = DMA_FIFOMode_Disable;
    //指定了FIFO阈值水平
        dma.DMA_FIFOThreshold       = DMA_FIFOThreshold_HalfFull;
        //指定的Burst转移配置内存传输
    dma.DMA_MemoryBurst         = DMA_MemoryBurst_Single;
        //指定的Burst转移配置外围转移
    dma.DMA_PeripheralBurst     = DMA_PeripheralBurst_Single;
       
    DMA_Init(DMA1_Stream5, &dma);
        DMA_Cmd(DMA1_Stream5, ENABLE);//再使能       

        /*dma channel nvic config*/
        nvic.NVIC_IRQChannel = DMA1_Stream5_IRQn;
        nvic.NVIC_IRQChannelPreemptionPriority = NvicPP;
        nvic.NVIC_IRQChannelSubPriority        = NvicSP;
        nvic.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&nvic);
       
        DMA_ITConfig(DMA1_Stream5, DMA_IT_TC, ENABLE);
       
        /*usart init config*/
        usart.USART_BaudRate   = Baud;
        usart.USART_WordLength = USART_WordLength_8b;
        usart.USART_StopBits   = USART_StopBits_1;
        usart.USART_Parity     = USART_Parity_Even;//偶校验
        usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        usart.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
        USART_Init(USART2, &usart);
               
        /*usart receive and transmit interrupt config*/
        USART_Cmd(USART2, ENABLE);
    USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);//usart2 挂接dma
}
[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

解决啦,是硬件问题,串口少一个取反电路。多谢原子哥。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2017-11-15
在线时间
3 小时
 楼主| 发表于 2017-11-15 22:02:04 | 显示全部楼层
解决啦,是硬件问题,串口少一个取反电路。多谢原子哥。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-11-16 01:18:53 | 显示全部楼层
试试不用dma,正常么?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-19 04:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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