初学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 传输。
相关推荐
菜哥万岁万岁万万岁31 分钟前
STM32 USB组合设备 MSC CDC
stm32·单片机·嵌入式硬件
wenchm1 小时前
细说STM32F407单片机以DMA方式读写外部SRAM的方法
stm32·单片机·嵌入式硬件
电气_空空1 小时前
基于单片机的无人值守输液监控系统软件设计
单片机·嵌入式硬件·毕业设计·毕设
半个番茄1 小时前
STM32: 输入捕获基本结构
stm32·单片机
2301_805962931 小时前
NRF24L01模块STM32调试心得-调试顺序
stm32·单片机·嵌入式硬件
云山工作室3 小时前
基于单片机的智能婴儿监控系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·毕设
魂兮-龙游3 小时前
二、模型训练与优化(4):模型优化-实操
嵌入式硬件·mcu·ai·性能优化·tensorflow·keras·neo4j
云山工作室3 小时前
基于单片机的变频空调系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·毕设
田甲4 小时前
【STM32】无源蜂鸣器播放音乐《千与千寻》,HAL库
stm32·单片机·嵌入式硬件
qq_459730034 小时前
STM32-RTC实时时钟
stm32·单片机·实时音视频