| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> DMA简介及编程要点 -> 正文阅读 |
|
[嵌入式]DMA简介及编程要点 |
DMA简介Data Memory Access 直接存储器访问 DMA在接收到CPU的指令后,他可以搬运数据,而不再需要CPU来工作,此时CPU可以做其他的事情,无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件IO设备和RAM开辟一条直接传输数据的通道 作用:为CPU减负 DMA1 : P->M ,M->P 可以把外设的数据搬到SRAM,也可以把SRAM搬到外设 DMA2除了可以实现上述功能外,还能实现M->M (flash->SRAM),这是因为DMA2通过总线矩阵连接了FLASH 和SRAM的,而DMA1是直接连在了外设上。从下图中可以看出,DMA1的存储区端口比DMA2减少了AHB2外设的访问权,同时外设端口没有连接总线矩阵,所以DMA1是不能将存储器之一作为外设来实现存储器到存储器的传输的。 常见的外设有ADC, SPI, I^2C ,DCMI 等外设的数据寄存器,存储器一般指的是片内的SRAM, 外部存储器, 片内FLASH等。 传输的方向有以下几种: (1)外设到存储器传输,把外设数据寄存器中的内容转移到指定的内存空间,e.g. 利用DMA把AD转换数据转移到定义的存储器中,对于多通道采集,采样频率高,连续输出的AD采集是非常高效的处理方法。 (2) 存储器到外设传输,把特定存储区的内容转移到外设的数据寄存器中, 多用于外设的发送通信; (3) 存储器到存储器的传输,就是把数据从一个存储区复制到另一个存储区,功能类似于memcpy的操作。使用DMA传输可获得更高的传输效率,因为他不占用CPU,可以节省CPU资源。 通道和流 每个DMA有8个数据流,每个数据流又有8个通道(有的只有6个或7个),每个通道都有一个仲裁器,用于处理DMA的优先级。 DMA控制器 通过DMA数据流x配置寄存器DMAA_SxCR(x为0-7 对应的是8个DMA数据流)的CHSEL[2:0]位来选择对应通道作为数据流的目标外设,下面是DMA1 DMA2对应通道的映射关系 DMA1 的通道映射
DMA2的通道映射
每个外设都占用一个数据通道,相同外设可以请求占用不同的数据通道,比如SPI3_RX既可以用stream 0的channel 0 也可以用stream 2 的channel 0. 当然要注意的是,如果选择了channel 0 的stream 0 ,那么就不能再选择 channel 0 的stream 1 了,所以这样一对多的映射关系是为了尽可能的保证不会出现诸多外设均需要使用DMA时无法协调的情况。 仲裁器 简单来说,就是用来管理stream的。 比如说,使用同一个DMA控制器(DMA1/DMA2) 来应对多个外设请求时,必然要使用多个stream,那么如果外设都发送了DMA请求时,哪个stream具有优先传输的权利就由仲裁器 来进行管理。 仲裁分为两个阶段: (1)软件阶段 配置寄存器的DMA_SxCR寄存器的PL[1:0]位,可以设为从非常高到低的四挡; (2)硬件阶段 软件配置相同时,优先级取决于硬件流的编号,编号越低越具有优先权。 FIFO : 源和目标的数据中转站, 大小为4个字(1word = 4 byte = 4*8=32bit, for stm32), MA_SxFCR可以禁止直接模式或者使用直接模式,即选择是使用直接模式还是FIFO模式。
选用直接模式时,A放到FIFO中后,直接就传个B ,不在FIFO中做任何停留。 如果选用FIFO模式,则可以配置DMA_SxFCR中的 FTH(FIFO Threshod)位来选择FIFO的阈值级别,可以选择阈值级别为1/4 ,1/2, 3/4,或者满,意思是,A的数据放入FIFO,放到1/4(其他值同理)FIFO,也就是1个字(4个字节)时,FIFO把数据再给B。 这4个字节又怎么传呢? 一个一个传还是打包成一个字来传? 这需要配置MBURST/PBURST。突发传输与 FIFO 密切相关,突发传输需要结合 FIFO 使用,具体要求 FIFO 阈值一定要是内存发传输数据量的整数倍。FIFO 阈值选择和存储器突发大小必须配合使用,具体参考下表。 一个节拍就当成MSIZE就行了,比如对于MSIZE为字节时,一个节拍就是一个字节,对于半字而言,一个节拍就是一个半字(2个字节) DMA的数据配置
DMA初始化结构体
固件库函数
M TO M编程要点 1.在FLASH中定义好要传输的数据,在SRAM中定义好要放的位置,定义好用来接收Flash数据的变量即可,在c语言中采用const关键字修饰后可以把数据放在FLASH里面,所以先定义了一个常亮的数组,作为我们要传输的数据。
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:22:38- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |