问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32 HAL库详解:DMA与串口通信的完美结合

创作时间:
作者:
@小白创作中心

STM32 HAL库详解:DMA与串口通信的完美结合

引用
CSDN
1.
https://blog.csdn.net/m0_73409202/article/details/140618237

STM32系列微控制器在嵌入式系统开发中占据重要地位,而DMA(直接存储器访问)技术则能显著提升数据传输效率。本文将详细介绍如何在STM32中使用HAL库实现DMA与串口的结合使用,包括理论原理、代码实现和实验验证,帮助开发者更好地掌握这一关键技术。

DMA技术简介

DMA(Direct Memory Access,直接存储器访问)是一种数据传输机制,能够将数据从一个地址空间复制到另一个地址空间,被誉为“数据搬运工”。与传统的CPU控制传输方式相比,DMA传输不需要CPU直接参与,也不涉及中断处理时的现场保留和恢复,而是通过硬件开辟一条RAM和IO设备之间的直接传输通道,从而大大提高CPU的效率。

STM32F1 DMA架构

DMA请求与通道

  • DMA请求:数据传输前,外设向DMA控制器发送请求。
  • DMA通道:不同外设通过不同的DMA通道发送请求。STM32F1的DMA1有7个通道,DMA2有5个通道(DMA2仅存在于大容量产品和互联型产品中)。

DMA优先级管理

当多个DMA通道同时发出请求时,仲裁器会根据优先级顺序进行处理。优先级管理分为两个阶段:

  1. 软件阶段:每个通道的优先级可以在DMA_CCRx寄存器中设置,分为最高、高、中、低四个等级。
  2. 硬件阶段:如果两个请求具有相同的软件优先级,较低编号的通道将获得较高优先级。在大容量芯片中,DMA1控制器的优先级高于DMA2控制器。

DMA与串口通信的HAL库函数

以下是使用HAL库实现DMA与串口通信的主要步骤:

  1. 使能DMA时钟

    _HAL_RCC_DMA1_CLK_ENABLE
    
  2. 初始化DMA

  • 使用HAL_DMA_Init函数初始化DMA相关参数
  • 使用_HAL_LINKDMA函数连接DMA和外设
  1. 使能串口的DMA发送并启动传输

    HAL_UART_Transmit_DMA
    
  2. 查询DMA传输状态

  • 使用_HAL_DMA_GET_FLAG查询传输状态
  • 使用_HAL_DMA_GET_COUNTER获取当前传输剩余数据量
  1. DMA中断使用
  • 使用HAL_NVIC_EnableIRQ使能中断
  • 使用HAL_NVIC_SetPriority设置中断优先级
  • 编写中断服务函数xxx_IRQHandler

实战演练

配置USART1及相应中断

配置DMA

中断优先级设置

生成Keil工程

DMA+串口发送字符串

main函数的while(1)循环中实现字符串发送。

DMA+串口接收空闲中断

  1. uart.huart.c中定义接收数组、数据长度和接收完成标志。
  2. uart.c的初始化函数中使能IDLE中断。
  3. main.c中封装接收和发送函数。
  4. stm32f4xx_it.c中包含usart.h并编写中断服务函数。
  5. main.cwhile循环中实现发送以及接收标志清除。

实验现象

  • 打开串口监视器,如果没有接收到数据,串口会每隔500ms发送SendBuff数组中的数据。
  • 接收到数据时,会触发IDLE中断并进行相应处理。

通过本实验,读者可以掌握STM32中DMA与串口通信的结合使用方法,为更复杂的嵌入式系统开发打下坚实基础。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号