硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5535|回复: 6
收起左侧

[有问必答] stm32f407串口1dma发送第一个字节为0?

[复制链接]

32

主题

115

回帖

211

积分

高级会员

积分
211
发表于 2021-5-18 16:47:13 | 显示全部楼层 |阅读模式
很基础 例程,配置串口,配置dma,然后把数组的内容通过dma发送到串口调试助手,但是第一个字符就是0。很奇怪。
现象如下:
dma发送bug.png
代码如下
  1. int main(void)
  2. {
  3.         u32 i = 500;
  4.        
  5.         uint8_t TestBuff[20] = "testprintf我是中国人";
  6. //        NVIC_DEBUG_Cfg();
  7.         Debug_USART1_Cfg();
  8.         USART1->SR;
  9.         USART1_DMA_Cfg();
  10.         for(i = 0;i<10;i++)
  11.         {
  12.                 test[i] = 'A';
  13.         }
  14.         for(i = 10;i<20;i++)
  15.         {
  16.                 test[i] = 'B';
  17.         }
  18.         for(i = 20;i<30;i++)
  19.         {
  20.                 test[i] = 'C';
  21.         }
  22.         for(i = 30;i<40;i++)
  23.         {
  24.                 test[i] = 'D';
  25.         }
  26.         for(i = 40;i<50;i++)
  27.         {
  28.                 test[i] = 'E';
  29.         }
  30.        
  31.         USART_DMACmd( USART1, USART_DMAReq_Tx,ENABLE);
  32.         while(1)
  33.         {       
  34. //                DEBUG_USART1_SendStr(TestBuff,20);
  35.                 if(DMA_GetFlagStatus(DMA2_Stream7, DMA_FLAG_TCIF7)==1)
  36.                 {
  37. //                        DEBUG_USART1_SendStr(RX_Buff,RXMAX);
  38.                         DMA_ClearFlag(DMA2_Stream7, DMA_FLAG_TCIF7);
  39.                 }
  40.         }
  41. }
复制代码
usart1配置
  1. void Debug_USART1_Cfg(void)
  2. {
  3.         USART_InitTypeDef USART_InitStructure;
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         /*打开PA口和串口1的时钟*/
  6.         RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  8.         /*配置PA9 PA10的复用功能,不能按位或*/
  9.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
  10.         GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
  11.         USART1->SR;
  12.         /* USART1 Tx PA9的GPIO配置,参考官方库  */
  13.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  14.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

  16.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;//速度这里比官方库慢
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  19.        
  20.         /* USART1 Rx PA10的GPIO配置,参考官方库  */
  21.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  22.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  23.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  24.        
  25.         USART_InitStructure.USART_BaudRate = 115200;
  26.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  27.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  28.         USART_InitStructure.USART_Parity = USART_Parity_No;
  29.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  30.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  31.        
  32.         USART_Init(USART1, &USART_InitStructure);
  33.        
  34.         USART_Cmd(USART1, ENABLE);
  35. //        USART_ClearFlag( USART1, USART_FLAG_TC);
  36. //        USART_ClearFlag( USART1, USART_FLAG_TXE);
  37.         USART1->SR;
复制代码

dma配置
  1. void USART1_DMA_Cfg(void)
  2. {
  3.         DMA_InitTypeDef DMA_InitStructure;
  4.       
  5.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
  6.           
  7.         DMA_InitStructure.DMA_BufferSize        =        50;//用宏定义,方便改
  8.         /*usart1发送是数据流7通道4,接收是数据流2通道4*/
  9.         DMA_InitStructure.DMA_Channel           =        DMA_Channel_4;
  10.         DMA_InitStructure.DMA_DIR               =        DMA_DIR_MemoryToPeripheral;
  11.         DMA_InitStructure.DMA_FIFOMode          =        DMA_FIFOMode_Disable;
  12.         DMA_InitStructure.DMA_FIFOThreshold     =        DMA_FIFOThreshold_1QuarterFull;//FIFO没用,这个没影响
  13.         DMA_InitStructure.DMA_Memory0BaseAddr   =        (u32)(&test);
  14.         DMA_InitStructure.DMA_MemoryBurst       =        DMA_MemoryBurst_Single;
  15.         DMA_InitStructure.DMA_MemoryDataSize    =        DMA_MemoryDataSize_Byte;
  16.         DMA_InitStructure.DMA_MemoryInc         =        DMA_MemoryInc_Enable;
  17.         DMA_InitStructure.DMA_Mode              =        DMA_Mode_Normal;
  18.         DMA_InitStructure.DMA_PeripheralBaseAddr=        (u32)(USART1_BASE+0x04);//USART1->DR;
  19.         DMA_InitStructure.DMA_PeripheralBurst   =                   DMA_PeripheralBurst_Single;
  20.         DMA_InitStructure.DMA_PeripheralDataSize=            DMA_PeripheralDataSize_Byte;
  21.         DMA_InitStructure.DMA_PeripheralInc     =        DMA_PeripheralInc_Disable;
  22.         DMA_InitStructure.DMA_Priority          =        DMA_Priority_Medium;
  23.    
  24.    /*USART1接收在DMA2的通道4,数据流2,发送在通道4,数据流7*/
  25.         DMA_Init(DMA2_Stream7, &DMA_InitStructure);
  26.    
  27.         DMA_Cmd(DMA2_Stream7, ENABLE);
  28.    
  29.         while(DMA_GetCmdStatus(DMA2_Stream7) != ENABLE);
  30. }
复制代码




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-18 17:15:40 | 显示全部楼层

回帖奖励 +3 个金币

看下不使用DMA是不是也有0发送出来,另外注意这个问题


STM32的串口使能后,TC发送完成中断标志和TXE发送空标志是置位的,用户请根据需要清除
https://forum.anfulai.cn/forum.p ... 1240&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2021-5-18 21:18:11 来自手机 | 显示全部楼层
eric2013 发表于 2021-5-18 17:15
看下不使用DMA是不是也有0发送出来,另外注意这个问题



直接用dma发送还和串口的tc  txe有关吗?
回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2021-5-19 08:12:19 | 显示全部楼层
eric2013 发表于 2021-5-18 17:15
看下不使用DMA是不是也有0发送出来,另外注意这个问题

硬汉哥,不经过dma发送是正常的,没有最开始的0/。不知道咋弄了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-19 08:23:42 | 显示全部楼层
伊森亨特 发表于 2021-5-18 21:18
直接用dma发送还和串口的tc  txe有关吗?

清除了保险。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-19 08:25:23 | 显示全部楼层
别的问题看不出来了,并行参考我这个试试

基于V6的CMSIS-Driver串口应用,支持8串口DMA不定长收发,比CubeMX还要省事
https://forum.anfulai.cn/forum.p ... 3714&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-5-19 20:03:19 | 显示全部楼层
发送完 把USART_DMACmd跟DMA一起关了 再开再发就好了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:33 , Processed in 0.047139 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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