初学stm32 --- DMA直接存储器

目录

DMA介绍

[STM32F1 DMA框图](#STM32F1 DMA框图)

DMA处理过程

DMA通道

DMA优先级

[DMA相关寄存器介绍 F1](#DMA相关寄存器介绍 F1)

DMA通道x配置寄存器(DMA_CCRx)

DMA中断状态寄存器(DMA_ISR)

DMA中断标志清除寄存器(DMA_IFCR)

DMA通道x传输数量寄存器(DMA_CNDTR)

DMA通道x外设地址寄存器(DMA_CPARx)

DMA通道x存储器地址寄存器(DMA_CMARx)

DMA相关HAL库驱动介绍

以DMA方式传输串口数据配置步骤

DMA介绍

DMA,全称Direct Memory Access,即直接存储器访问。

DMA传输 将数据从一个地址空间复制到另一个地址空间。 (数据搬运工)

DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高

作用:为CPU减负

传输方向:内存--->外设、外设--->内存、内存--->内存

STM32F1 DMA框图

①,DMA请求:

DMA传输数据,先向DMA控制器发送请求

②,DMA通道 :

不同外设向DMA的不同通道发送请求

DMA1有7个通道,DMA2有5个通道

③,DMA优先级:

多个DMA通道同时发来请求时,就有先后响应处理的顺序问题,这个由仲裁器管理

(优先级管理也分软件阶段和硬件阶段)

注意:DMA2仅存在大容量产品和互联型产品

DMA处理过程

DMA通道

DMA1

每个通道用来管理来自于一个或多个外设对存储器访问的请求。且都有一个仲裁器,用于处理DMA请求间的优先级。

DMA优先级

仲裁器管理DMA通道请求分为两个阶段:软件阶段(1)、硬件阶段(2)

第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,有四个等级:最高、高、中和低优先级。

第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。

(大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)

注意:多个请求通过逻辑或输入到DMA控制器,只能有一个请求有效。

DMA相关寄存器介绍 F1

DMA通道x****配置寄存器(DMA_CCRx

主要设置:

是否为存储器到存储器模式:MEM2MEM

数据传输方向:DIR

通道优先级:PL[1:0]

循环模式:CIRC

外设/存储器增量模式:PINC/MINC

外设/存储器数据宽度:PSIZE[1:0]/MSZE[1:0]

使能中断:TEIE传输错误中断、HTIE半传输中断、TCIE传输完成中断

开启通道:EN

DMA****中断状态寄存器(DMA_ISR

注意:当设置了允许中断时,将会产生中断

DMA****中断标志清除寄存器(DMA_IFCR

DMA通道x****传输数量寄存器(DMA_CNDTR

最大数据传输数目:65535

非循环模式下传输结束后,要开始新的DMA传输,需要在关闭DMA通道情况下,在该寄存器中重新写入传输数目。

DMA通道x****外设地址寄存器(DMA_CPARx

DMA通道x****存储器地址寄存器(DMA_CMARx

DMA相关HAL****库驱动介绍

DMA外设相关结构体:DMA_HandleTypeDef 和 DMA_InitTypeDef

DMA方式传输串口数据配置步骤

( USART1_TX DMA1_CH4**)**

1 、使能DMA时钟

__HAL_RCC_DMA1_CLK_ENABLE

2、初始化DMA

HAL_DMA_Init函数初始化DMA相关参数

__HAL_LINKDMA函数连接DMA和外设

3、使能串口的DMA发送,启动传输

HAL_UART_Transmit_DMA

查询DMA传输状态

__HAL_DMA_GET_FLAG 查询通道传输状态

__HAL_DMA_GET_COUNTER 获取当前传输剩余数据量

DMA中断使用

HAL_NVIC_EnableIRQ

HAL_NVIC_SetPriority

编写中断服务函数 xxx_IRQHandler

在使用DMA来搬运数据到串口UART中,需要注意的事项

将 DMA 与 USART1 连接:

cpp 复制代码
__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle);

__HAL_LINKDMA 宏用于将 DMA 句柄 (g_dma_handle) 与 USART1 的发送 DMA (hdmatx) 进行关联。这确保了 DMA 在发送数据时能够正确地与 UART1 进行交互。

启动 UART 的 DMA 传输:

cpp 复制代码
HAL_UART_Transmit_DMA(&g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);

使用 HAL_UART_Transmit_DMA 启动 UART 数据的 DMA 传输,其中 g_sendbuf 是待发送的数据缓冲区,SEND_BUF_SIZE 是数据的大小。

等待 DMA 传输完成:

cpp 复制代码
while (1)
{
    if ( __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4))   /* 等待 DMA1_Channel4 传输完成 */
    {
        __HAL_DMA_CLEAR_FLAG(&g_dma_handle, DMA_FLAG_TC4);
        HAL_UART_DMAStop(&g_uart1_handle);  /* 传输完成以后关闭串口DMA */
        break;
    }
  • 使用 __HAL_DMA_GET_FLAG 检查 DMA 是否完成传输,如果完成,则通过 __HAL_DMA_CLEAR_FLAG 清除 DMA 传输完成标志。
  • 然后调用 HAL_UART_DMAStop 停止 DMA 传输。
相关推荐
Wallace Zhang1 小时前
STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践
stm32·gcc·eide
RaLi和夕1 小时前
单片机学习笔记.C51存储器类型含义及用法
笔记·单片机·学习
ShiMetaPi1 小时前
操作【GM3568JHF】FPGA+ARM异构开发板 使用指南:蓝牙
arm开发·嵌入式硬件·fpga开发·rk3568
武文斌772 小时前
ARM工作模式、汇编学习
汇编·嵌入式硬件·学习·arm
月阳羊2 小时前
【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
java·单片机·嵌入式硬件·面试·职场和发展
wdfk_prog3 小时前
Python脚本深度解析:实现基于YMODEM的单片机固件自动化升级
python·单片机·自动化
纳祥科技3 小时前
分享:一种为蓝牙、WIFI、U段音频发射设备提供ARC回传数字音频桥接功能的方案
网络·单片机·音视频
代码总长两年半6 小时前
STM32物联网项目---ESP8266微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制---代码篇(四)
stm32·单片机·物联网
咕咚.萌西6 小时前
RISC-V体系架构
嵌入式硬件·架构·risc-v
玉~你还好吗7 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件