STM32——DMA


宗旨:技术的学习是有限的,分享的精神是无限的。


DMA 是为CPU分担数据转移的工作。因为DMA的存在CPU才被解放出来,它可以在 DMA 转移数据的过程中同时进行数据运算、响应中断,大大提高效率。

1、DMA工作分析

数据传输的过程中,不需要内核的全程参与,所以内核可以同时进行数据运算。DMA 方式是点到点的数据转移,而不使用 DMA 方式还要以内核来作为中转站,显然 DMA 传输方式的效率更高。

要使用 DMA,需要确定一系列的控制参数,如外设数据的地址、内存地址、传输方向等,在开启 DMA 传输前还要先发出 DMA 请求。

2、 初始化DMA

typedef struct
{uint32_t DMA_PeripheralBaseAddr;uint32_t DMA_MemoryBaseAddr;uint32_t DMA_DIR;uint32_t DMA_BufferSize;uint32_t DMA_PeripheralInc;uint32_t DMA_MemoryInc;uint32_t DMA_PeripheralDataSize;uint32_t DMA_MemoryDataSize;uint32_t DMA_Mode;uint32_t DMA_Priority;uint32_t DMA_M2M;
} DMA_InitTypeDef;

(1)DMA_PeripheralBaseAddr:这个成员保存的是外设数据寄存器的基地址,这个地址作为传输的源或目标。DMA 具有地址自增的功能,地址自增功使得可以方便地读取连续的 数据单元 。现在给这个成员的赋USART1_DR_Base,是一个自定义的宏:

#define USART1_DR_Base 0x40013804【串口外设会自动把数据寄存器中的数据,送入它的移位寄存器,然后由硬件按照串口协议把该数据发送出去。】

(2)DMA_MemoryBaseAddr:保存了内存的基地址,同样,这个地址可作为传输的源或目标。在使用时通常会给这个成员赋值为某个数组的基地址,然后利用 DMA 的地址自增功能把数组一个个地填满。在本代码中向这个成员赋值为 SendBuff,这是一个自定义的数组变量名。

(3)DMA_DIR:保存了 DMA 数据传输方向,可以选择是外设到内存还是内存到外设。

(4)DMA_BufferSize:保存了 DMA 要传输的数据总大小,其单位为后面结构体成员。

(5)DMA_PeripheralInc/DMA_MemoryInc:分别为外设和内存的地址是否开启自增功能。

(6)DMA_PeripheralDataSize/ DMA_MemoryDataSize:分别为外设和内存的数据单元大小。可以为字节、半字和字。

(7)DMA_Mode:保存了 DMA 的模式,可以为循环模式或正常模式,循环模式即在传输完一轮数据之后再重新传输,这种方式很适合 ADC 不断采集数据的场合。

(8)DMA_Priority:DMA 通道的优先级,总线矩阵根据其 DMA 通道的优先级进行总线协调分配。

(9)DMA_M2M:保存了是否内存到内存的 DMA 传输。DMA 传输可以在外设与内存、外设与外设以及内存与内存之间进行。

// 初始化DMA主要是开启外设时钟、填充初始化结构体以及使能外设。
void USART1_DMA_Config(void)
{DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /*开启 DMA 时钟*/DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*设置 DMA 源:串口数据寄存器地址*/DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; /*内存地址(要传输的变量的指针)*/DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /*方向:从内存到外设*/DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*传输大小DMA_BufferSize=SENDBUFF_SIZE*/DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*外设地址不增*/DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*内存地址自增*/DMA_InitStructure.DMA_PeripheralDataSize =   DMA_PeripheralDataSize_Byte; /*外设数据单位*/DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*内存数据单位 8bit*/DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /*DMA 模式:不断循环*/DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*优先级:中*/DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /*禁止内存到内存的传输 *//*配置 DMA1 的 4 通道  根据 DMA 的请求映像来设置 */DMA_Init(DMA1_Channel4, &DMA_InitStructure);DMA_Cmd (DMA1_Channel4, ENABLE);  /*使能 DMA*/
//DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置 DMA 发送完成后产生中断
}

STM32——DMA相关推荐

  1. stm32 DMA使用详解

    转自:http://www.cnblogs.com/121792730applllo/p/3154447.html STM32 DMA使用详解 DMA部分我用到的相对简单,当然,可能这是新东西,我暂时 ...

  2. STM32 DMA传输

    STM32 DMA(Direct Memory Access)直接存储器访问 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.无须CPU干预,数据可以通过DMA ...

  3. 带内部参考电压(VREFINT)校正的STM32 DMA 内置温度采集

    笔者今天来介绍一下STM32ADC内置温度的采集,重点是通过内置参考电压来避免ADC参考电压VDDA对温度ADC采集的影响. 1.STM32ADC简介   stm32F4系列ADC,逐次趋近型AD.1 ...

  4. stm32 DMA 配置 串口程序

    STM32的串口1发送.接收DMA模式函数配置,已经调试可用,大家可以交流学习下 /********************************************************** ...

  5. DMA工作原理-STM32 DMA和ARM9 DMA,彻底理解DMA

    前序 网上文章一大堆都有介绍DMA的作用,是直接内存获取控制器,但由于用途的局限或者用在了复杂的外设上面,导致没有很好的把DMA的作用说的很系统,本人也是根据网上的资料,进行一些DMA的总结,个人觉得 ...

  6. STM32 DMA串口方式获取GPS经纬度和时间数据

    由于STM32需要同时处理三个串口的实时通讯消息,使用串口接收中断接收GPS信息非常占单片机运行资源,所以采用串口数据接收空闲中断和串口dma接收互相结合的办法节省资源 //DMA初始化函数 void ...

  7. STM32+DMA串口+RC信号控制舵机

    文章目录 前言 一.RC遥控器PWM信号 二.关于舵机 三.STM32串口DMA 四.CUBEMX配置设置 五.串口+DMA通讯 六.PWM输出 七.串口控制舵机 八.通讯测试 九.PWM输出测试 十 ...

  8. STM32 DMA正常模式等待传输完成和开始下一次传输

    选择DMA的正常模式,即DMA只传输一次.如果当传输完一次后,还想再传输一次,就需要重启DMA: DMA_Cmd(DMA1_Channel6,DISABLE);  重新设置源地址  重新设置目的地址  ...

  9. STM32 DMA详解

    目录 1.综述 2.DMA事务 3.通道选择 4.仲裁器 5.DMA数据流 6.源.目标和传输模式 6.1.外设到存储器模式 6.2 存储器到外设模式 6.3 存储器到存储器模式 7.指针递增 8.循 ...

最新文章

  1. printf/scanf格式控制符的完整格式
  2. Android如何使用NoHttp
  3. baidumap vue 判断范围_vue 数据渲染
  4. Citrix 实践中的问题及解决
  5. FFMPEG结构体分析:AVFrame
  6. 数据结构——树的概述
  7. OPENROWSET访问CSV格式文件
  8. 全民农场服务器维护上不去,全民农场微信授权失败登录不上解决方法
  9. Lowe的SIFT(尺度不变特征变换)程序使用详细说明
  10. win7 下搭建基于jdk1.7 android开发环境
  11. ofo小黄车仍在自动续费!如何关闭微信自动扣费?
  12. [附源码]计算机毕业设计JAVA新能源汽车租赁管理系统
  13. 解决phpstorm运行很卡问题
  14. 如何安装Python的PIL库
  15. 【数据库】数据库管理系统(Database Management Systems)
  16. SQL内连接简单详解
  17. 专利申请的费用和提交材料
  18. 贯标企业注意了!申报两化融合需要具备这八个条件!
  19. mysql级别_mysql事务级别
  20. python股权变动监控系统_每天5分钟玩转Python(12) - 生成器(下)

热门文章

  1. 学成在线--17.我的课程
  2. java样式是什么_java css样式 css样式的种类 选择器 文本相关样式 背景相关样式 边框 盒子模式...
  3. 深度学习之生成式对抗网络 GAN(Generative Adversarial Networks)
  4. 深度学习案例之基于 CNN 的 MNIST 手写数字识别
  5. Falsk session 源码解析
  6. html颜色叠加代码,html代码大全(基础使用代码)(颜色代码完整版)
  7. 部署到gcp_GCP 网络系统Andromeda --- 概述篇
  8. springboot springmvc mybatis_12道重点的Spring Boot面试题,帮你整理好了!
  9. 【Python基础入门系列】第05天:Python函数
  10. xwpftablecell设置字体样式_HTML的文字样式