STM32 HAL库实现UART的不定长度DMA数据传输(一)
一、开发环境
-
软件环境:keil、STM32CubeMX
-
硬件环境:STM32F407VGT7
二、项目需求
-
实现UART的不定长度DMA数据传输
-
要求使用HAL库
三、实现步骤
1.STM32CubeMX软件的基本配置
(1)下载接口配置

下载方式设置成SWD下载方式
(2)时钟配置
-
RCC的HSE时钟控制打开

-
时钟配置为168MHz,采用HSE的控制方式

其余时钟采用默认的配置方式,都达到了最大的时钟。
至此,基本的时钟就配置好了。
(3)LED配置与测试
-
LED对应的引脚配置成输出模式

-
对相应的引脚进行简单的配置

以LED3为例,这里设置初始化电平为低,输出模式为推挽输出,电平的变化速度设置为高,最后设置对应的引脚标号为LED3,这样GPIO的配置就基本搞定了。
-
下面进行简单的配置,然后生成代码,添加相关的执行代码进行简单的测试。

-
下载至板卡,发现LED灯正常的亮灭,说明程序编写正常。
(4)UART基本配置
-
首先,配置相应的引脚为串口,这里以UART4_TX为例

-
然后,打开相应的串口进行配置

一般使用异步通信模式就够了,暂时用不到更加高级的模式。

设置串口的波特率为115200Baud,数据位为8位,停止位为1位,无校验位。
-
串口参数配置
-
基本参数设置
-
DMA设置
-

设置为地址自增的模式,数据宽度设置为字节,DMA的优先级设置为Low。
-
中断设置
默认DMA的中断是打开的,这里只需要打开串口的中断就行了,而且串口的中断是必须打开的,否则会出现错误。

设置串口2的优先级为2、0,串口4的优先级为2、1。
这样基本的配置就搞定啦,点击generate code生成相关代码。

2.Keil软件开发
(1)UART printf实现
-
添加串口printf打印的补充代码

-
编译后,会报错,如下图所示。

-
需要添加<stdio.h>才能解决问题。

-
在主函数中直接添加打印代码即可。

-
这样就可以在主函数中打印需要打印的内容。

(2)UART DMA发送实现
-
定义需要发送的内容

-
在主函数中发送数据

-
在串口调试助手中查看结果

(3)UART DMA接收实现
-
定义发送的数据和接收的缓存

-
UART DMA初始化

-
中断接收部分操作具体化

-
查看结果
没有正常的数据显示,这样的话,就是有问题的,需要进行修正。
(4)UART DMA不定长接收实现
四、程序调试
1.UART DMA接收实现
(1)查找资料
找到如下链接
https://blog.youkuaiyun.com/u012780337/article/details/100640423,文章中指出了UART DMA接收需要注意的问题有两个:
-
必须使能串口中断
-
DMA最好使用循环模式
(2)修改代码,增加DMA接收部分代码,重复调用

(3)查看结果

经过串口调试助手查看结果,数据正常。
说明这样代码的添加是可行的,否则需要将DMA接收模式修改为循环Circular模式。