6.STM32 HAL库实现UART的不定长度DMA数据传输(一)

 

                  STM32 HAL库实现UART的不定长度DMA数据传输(一)

一、开发环境

  • 软件环境:keil、STM32CubeMX
  • 硬件环境:STM32F407VGT7

二、项目需求

  • 实现UART的不定长度DMA数据传输
  • 要求使用HAL库

三、实现步骤

1.STM32CubeMX软件的基本配置
(1)下载接口配置
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第1张图片
下载方式设置成SWD下载方式
(2)时钟配置
  • RCC的HSE时钟控制打开
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第2张图片
  • 时钟配置为168MHz,采用HSE的控制方式
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第3张图片
    其余时钟采用默认的配置方式,都达到了最大的时钟。
    至此,基本的时钟就配置好了。
(3)LED配置与测试
  • LED对应的引脚配置成输出模式
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第4张图片
  • 对相应的引脚进行简单的配置
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第5张图片
    以LED3为例,这里设置初始化电平为低,输出模式为推挽输出,电平的变化速度设置为高,最后设置对应的引脚标号为LED3,这样GPIO的配置就基本搞定了。
  • 下面进行简单的配置,然后生成代码,添加相关的执行代码进行简单的测试。
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第6张图片
  • 下载至板卡,发现LED灯正常的亮灭,说明程序编写正常。
(4)UART基本配置
  • 首先,配置相应的引脚为串口,这里以UART4_TX为例
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第7张图片
  • 然后,打开相应的串口进行配置
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第8张图片
    一般使用异步通信模式就够了,暂时用不到更加高级的模式。
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第9张图片
  设置串口的波特率为115200Baud,数据位为8位,停止位为1位,无校验位。
  • 串口参数配置
    • 基本参数设置
    • DMA设置
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第10张图片
    设置为地址自增的模式,数据宽度设置为字节,DMA的优先级设置为Low。
 
  • 中断设置
    默认DMA的中断是打开的,这里只需要打开串口的中断就行了,而且串口的中断是必须打开的,否则会出现错误。
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第11张图片
    设置串口2的优先级为2、0,串口4的优先级为2、1。
    这样基本的配置就搞定啦,点击generate code生成相关代码。
 
2.Keil软件开发
(1)UART printf实现
  • 添加串口printf打印的补充代码
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第12张图片
  • 编译后,会报错,如下图所示。
 
  • 需要添加才能解决问题。
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第13张图片
  • 在主函数中直接添加打印代码即可。
 
  • 这样就可以在主函数中打印需要打印的内容。
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第14张图片
(2)UART DMA发送实现
  • 定义需要发送的内容
 
  • 在主函数中发送数据
 
  • 在串口调试助手中查看结果
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第15张图片
(3)UART DMA接收实现
  • 定义发送的数据和接收的缓存
 
  • UART DMA初始化
 
  • 中断接收部分操作具体化
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第16张图片
  • 查看结果
    没有正常的数据显示,这样的话,就是有问题的,需要进行修正。
(4)UART DMA不定长接收实现
  参考链接: https://www.cnblogs.com/jinxueHou/p/9483413.html

四、程序调试

1.UART DMA接收实现
(1)查找资料
    找到如下链接 https://blog.csdn.net/u012780337/article/details/100640423,文章中指出了UART DMA接收需要注意的问题有两个:
  • 必须使能串口中断
  • DMA最好使用循环模式
(2)修改代码,增加DMA接收部分代码,重复调用
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第17张图片
(3)查看结果
  6.STM32 HAL库实现UART的不定长度DMA数据传输(一)_第18张图片
    经过串口调试助手查看结果,数据正常。
    说明这样代码的添加是可行的,否则需要将DMA接收模式修改为循环Circular模式。
 
 

你可能感兴趣的:(STM32项目笔记)