OpenEdv-开源电子网

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

STM32F407 串口DMA接收不到数据,接收缓冲区全为空

[复制链接]

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2021-6-25
在线时间
50 小时
发表于 2021-6-30 11:13:03 | 显示全部楼层 |阅读模式
1金钱
求助:串口助手发数据给USART2,由DMA进行接收,接收到的数据放在USART2_RX_BUF数组中,现在接收不到数据,但USART2->DR中有数据。          若单独用串口接收中断,不使用DMA传输,可以接收到数据,证明串口是通的,但是现在加上了DMA后,但USART2->DR中有数据,但是缓冲区USART2_RX_BUF没有数据。
将DMA初始化函数放在串口初始化函数之前也是同样无数据。

DMA配置似乎没错啊,查看了好多遍了~~~~~

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void usart2_dma_init( void )
{       
        DMA_InitTypeDef DMA_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);  
       
        DMA_DeInit(DMA1_Stream5);

        DMA_InitStructure.DMA_Channel = DMA_Channel_4;
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(USART2->DR);
        DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(u32)USART2_RX_BUF;

        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
       
        DMA_InitStructure.DMA_BufferSize = (u32)MAVLINK_MAX_PACKET_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_FIFOMode = DMA_FIFOMode_Disable;
        DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
        DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single


        DMA_Init( DMA1_Stream5, &DMA_InitStructure );
       
        DMA_ClearFlag( DMA1_Stream5, DMA_FLAG_TCIF5 );
       
        DMA_Cmd( DMA1_Stream5,ENABLE );
       
        USART_DMACmd( USART2, USART_DMAReq_Rx, ENABLE );

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void USART2_IRQHandler(void)
{

        if(USART_GetITStatus( USART2, USART_IT_IDLE ) != RESET )
        {
                       
                        USART2->SR;   
                        USART2->DR;   
                        USART_ClearITPendingBit( USART2, USART_IT_IDLE );       
                       
                        usart2_dma_setting();               

        }

}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void usart2_dma_setting( void )
{
        u32 buff_length;
       
        DMA_Cmd(DMA1_Stream5, DISABLE);
       
        DMA_ClearFlag( DMA1_Stream5, DMA_FLAG_TCIF5 );  
       
        buff_length = MAVLINK_MAX_PACKET_LEN - DMA_GetCurrDataCounter(DMA1_Stream5);

        USART2_RX_CNT = buff_length;
        USART2_RX_FRAME_OK = 1;
       
        DMA_SetCurrDataCounter( DMA1_Stream5, MAVLINK_MAX_PACKET_LEN );

        DMA_Cmd(DMA1_Stream5, ENABLE);      

}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

最佳答案

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

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(USART2->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(u32)USART2_RX_BUF; 这个应该为地址: DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART2->DR); DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&USART2_RX_BUF;
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2018-12-15
在线时间
33 小时
发表于 2021-6-30 11:13:04 | 显示全部楼层
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(USART2->DR);
   DMA_InitStructure.DMA_Memory0BaseAddr = (u32)(u32)USART2_RX_BUF;
这个应该为地址:
   DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&(USART2->DR);
   DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&USART2_RX_BUF;
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2021-6-25
在线时间
50 小时
 楼主| 发表于 2021-7-6 20:49:09 | 显示全部楼层
改了不行啊
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2018-12-15
在线时间
33 小时
发表于 2021-7-7 09:06:41 | 显示全部楼层
那还有别的问题  DMA中断服务程序有没有加
回复

使用道具 举报

5

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2021-6-25
在线时间
50 小时
 楼主| 发表于 2021-7-7 09:57:56 | 显示全部楼层

原因找到了,我把USART_DMACmd函数放在串口初始化函数里面就可以收到数据了。反之把这个函数放在DMA初始化函数里面就不行。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 07:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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