发 帖  
原厂入驻New

[经验] STM32 DMA串口发送模式配置及使用简单分享

2019-7-1 13:52:27  4761 STM32 DMA 串口
分享
1
赠人玫瑰,手有余香;很感谢网上其他楼主的分享;我这个贴子是关于STM32 DMA USART 发送模式的调试分享,我为什么要建这个帖子呢,因为我不想看到还有其他人跟我一样,为了调通DMA串口,而花上大半天的时间,这很不利于大家高效率的开发,网上的经验都是从头教到尾的,内容极多,对于有点小经验的人,或者是想很快达到目的的人,这个很不适合他们;我的这个很简单(本帖不适合不熟悉配置STM32串口的玩家),他只是说串口的DMA怎么配置,还有我用的是DMA1_通道4,因为我的是串口1的TX长话短说:直接po代码:

  1. DMA_InitTypeDef DMA_InitStruct;                                //DMA类型声明
  2. RCC_AHBPeriphclockCmd(RCC_AHBPeriph_DMA1,ENABLE);        /打开RCC时钟
  3. DMA_InitStruct.DMA_PeripheralBaseAddr=        USART1_BASE+0x4;        //串口外设基础地址,好像只能是这个数值,至于为啥是0x4,我还没找到相关资料
  4.    DMA_InitStruct.DMA_MemoryBaseAddr= (u32)TEST;//这个我是一个字符串数组的首字母也就是u8 TEST[]        =""
  5.    DMA_InitStruct.DMA_DIR= DMA_DIR_PeripheralDST;//这个是发送模式
  6.    DMA_InitStruct.DMA_BufferSize=0;                                //缓冲大小,实际我们使用可以改变,现在可以随便填
  7.    DMA_InitStruct.DMA_PeripheralInc=  DMA_PeripheralInc_Disable ;//这个是外设偏移,是外设的地址偏移
  8.    DMA_InitStruct.DMA_MemoryInc=        DMA_MemoryInc_Enable;//内存偏移,是保存在内存中的数据偏移
  9.    DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  10.    DMA_InitStruct.DMA_MemoryDataSize= DMA_MemoryDataSize_Byte;
  11.    DMA_InitStruct.DMA_Mode=        DMA_Mode_Normal;//因为不需要循环发送所以使用这个模式就好
  12.    DMA_InitStruct.DMA_Priority=DMA_Priority_High;//优先级,有最高,高,中,低的哥档位
  13.    DMA_InitStruct.DMA_M2M= DMA_M2M_Disable;        //关闭就好
  14.    DMA_Init(DMA1_Channel4, & DMA_InitStruct);

  15.          DMA_Cmd(DMA1_Channel4, DISABLE);        //先关闭,要使用的时候才使能
  16.          USART_DMACmd(USART1,  USART_DMAReq_Tx,  ENABLE);//串口DMA使能,在串口的.h文档中可以找到。
复制代码

上面是我的DMA配置,接下来是实际在主函数中是怎么使用的:
     
  1.     DMA_Cmd(DMA1_Channel4, DISABLE);        //首先要关闭使能;
  2.           DMA1_Channel4->CNDTR =13;                        //给这个寄存器设定要发送的缓存大小,这个就是之前DMA配置的DMA_InitStruct.DMA_BufferSize=0;具体语句可以在dma.c中可以找到;
  3.           DMA_Cmd(DMA1_Channel4, ENABLE);//设定好了缓冲长度之后使能DMA,这个时候串口就会自动发送
  4. DMA_InitStruct.DMA_MemoryBaseAddr=&TEST这个地址的内容;         
  5. while(!DMA_GetFlagStatus(DMA1_FLAG_TC4))   ;//等待完成标志
  6.          DMA_CleaRFlag(DMA1_FLAG_TC4);                //清除完成标志
复制代码

可以我的代码就这两部分,最后说一说我花了大半天才得到的调试记录:
1)使用DMA串口发送和单纯的串口发送方法不一样,传统的是printf(),DMA就是上面我的第二段代码的操作;
2)DMA_PeripheralInc:要DIsable,因为这个是设定外设指向下个地址,而不是数据下个地址,设为Enable的话,系统会死机;
3)DMA_MemoryInc:要Enable,这个才是移动到下个字节的标志;不然的话,即使串口通了,他只会发送第一个字节的内容,而不是发送你整个字符串;通过这个设定我想到了,说明数据是会存入内存中的;
4)DMA_BufferSize:会自动识别,填写0也没问题;因为实际缓存多大取决于你实际使用时DMA1_Channel4->CNDTR的设定;
5)USART_DMACmd():这个函数记得要打开,他在串口的.h文档中;
6使用的方法就是我的第二段代码,先关闭DMA使能,再设定缓冲大小,再开启DMA使能;
相信这些点你都注意了,串口就可以正常发送数据啦;希望能够帮助你,祝你一臂之力,加油

相关经验

tanghuluguang 2019-7-1 14:40:43
好东西,下载下来学习学习

举报

QAQ嘤嘤嘤 2019-8-23 16:32:49
学习了,之前一直想去做一下这个的
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

发经验
课程
    关闭

    站长推荐 上一条 /10 下一条

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