当前位置: 首页 > article >正文

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

目录

DMA介绍

STM32F1 DMA框图

DMA处理过程

DMA通道

DMA优先级

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直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAMIO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高

作用:为CPU减负

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

STM32F1 DMA框图

①,DMA请求:

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

②,DMA通道  :

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

DMA17个通道,DMA25个通道

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 连接:

__HAL_LINKDMA(&g_uart1_handle, hdmatx, g_dma_handle);

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

启动 UART 的 DMA 传输:

HAL_UART_Transmit_DMA(&g_uart1_handle, g_sendbuf, SEND_BUF_SIZE);

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

等待 DMA 传输完成:

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 传输。

http://www.kler.cn/a/473560.html

相关文章:

  • c++类和对象---上
  • 经典多模态模型CLIP - 直观且详尽的解释
  • jenkins 使用 ssh-agent向windows进行部署
  • 深入Android架构(从线程到AIDL)_18 SurfaceView的UI多线程02
  • 【机器学习】机器学习的基本分类-自监督学习(Self-supervised Learning)
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • Python入门教程 —— 网络编程
  • 机器学习算法的分类
  • 8_TypeScript String --[深入浅出 TypeScript 测试]
  • Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)
  • 【漏洞分析】DDOS攻防分析
  • 【修改mysql支持远程访问】
  • openai swarm agent框架源码详解及应用案例实战
  • Python数据可视化-Pandas
  • docker+ffmpeg+nginx+rtmp 拉取摄像机视频
  • 运放输入偏置电流详解
  • 4 驱动开发
  • Day10——爬虫
  • 【江协STM32】9-4/5 USART串口数据包、串口收发HEX数据包串口收发文本数据包
  • micro-app vite4接入vite6 遇到的问题
  • 数据库管理系统
  • 利用Java爬虫获取1688商品详情:API返回值说明及代码示例
  • VsCode对Arduino的开发配置
  • 【深度学习】布匹寻边:抓边误差小于3px【附完整链接】
  • 从零用java实现 小红书 springboot vue uniapp (9)消息推送功能
  • 【Unity3D】导出Android项目以及Java混淆