完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
①:DMA即Direct Memory Access(直接存储器存取),是STM32特有的外设。大容量STM32产品集成了两个DMA,分别是DMA1和DMA2,。其中DMA1有7个通道,DMA2有5个通道,具体每个通道连接的外设可以参考STM32芯片的数据手册。
②:通过DMA可以将数据在两个不同的地址之间进行传递,如存储器到外设寄存器,外设寄存器到存储器,也可以从存储器到存储器之间。 ③:当两个数据在不同的地址之间传递时,需要在程序配置中确定每次传输的字节数,确定是字节、半字还是字。 ④:DMA的每个通道优先级是可变的。以DMA1为例,它有7个通道,可以配置每个通道的优先级为很高、高、中,低四种中的一种。若两个通道的优先级一样,当两个通道同时有DMA请求时,通道号小的优先级则高。 ⑤:DMA每次传输的数据量是可变的,DMA中有一个专门的寄存器用于存储这个数据量值。这个寄存器是32位的,但高16位全部保留为0,实际上起作用的是低16位,所以每次传输的最大数据量值是65536。 ⑥:⑤中所示,比如设置数据量值为100,若DMA传输设置为循环模式,则100个数据传输完成后,将自动进行下一轮传输。若设置成非循环模式,则需要先关闭DMA,再设置数据量值,再开启DMA,才能进行下一轮传输。 ⑦:DMA在传输过程中,常用的有3种标志位–传输完成一半、传输全部完成,传输过程发生错误。可以在程序中设置开启对应标志位的中断,当标志位到来时,会执行中断服务程序。也可不开启相应标志位的中断。 ⑧:确定好要传输的外设和存储器地址之后,需要在程序中设置传输方向,即传输方向是从外设到寄存器,还是从寄存器到外设。 ⑨:DMA一般用来在外设和存储器之间进行数据传输,所以还要设置外设地址及存储器地址是否递增。例如定义一个数组,char data[100],外设地址为&UART->TX,若将数组中的100个数据传输到UART->TX中,则存储器地址需要每次递增,而外设地址不需要递增。 DMA配置过程: ①:确定传输数据的外设和寄存器地址 ②:确定传输方向 ③:确定每次传输的数据量值 ④:确定传输数据的字节数 ⑤:配置通道优先级 ⑥:确定传输是循环模式还是非循环模式 ⑦:如若需要开启中断,则开启响应位中断 注意:DMA也可以从存储器到存储器,但存储器到存储器过程只能为非循环模式。 一、如何理解DMA 对于DMA,打个比方就很好理解: 角色预设: 淘宝店主 —- STM32 MCU 快递员 —- 外设(如UART,SPI) 发货室 —- DMA 1、首先你是一个淘宝店主,如果每次发货收货都要跟快递沟通交涉会很浪费时间和精力。 2、然后你就自己建了一个发货室,发货室里有好多个货柜箱子,每个箱子上都写着快递名字(如果申通快递,顺丰快递等)。 3、每次发什么快递,你就找到对应的货柜箱子,把货物放进去即可,然后跟快递通知一声。 4、快递取走快件。 5、如果是收货,快递直接把快件放到对应的柜子,然后通知你一下。 6、你过来提取货物。 通过上面的方式,你可以不需要直接跟快递打交道,就可以轻松发货成功,DMA处理方式跟上面例子是一样的。如下图: 那么DMA在STM32上是具体怎么实现的呢? 我们先了解一下STM32关于DMA的相关配置。 1、两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道) ps:对应我们例子,就是有两个大的发货室,一个有7个货柜,另个有5个货柜。 2、在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) ps: 店主可以跟每个快递公司签订协议,可以在货柜前贴上加急(很高),很急(高),急(中),一般(低), 如果同时有几个快递员过来取货,优先根据上面的优先级先取件。 3、独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。 ps: 指的是货件大小 4、支持循环的缓冲器管理(会把原来的数据覆盖) 5、每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。 ps: 送快递出现的异常情况(送到了一半,送完,快递出错) 解释到这里,不知道大家能不能理解呢。后面是具体的配置。 1、DMA 对应通道如下图 DMA1: DMA2: 2、DMA配置 1)数据传输的目的地和来源 对应我的例子,就是送快递还是取快递。 2)定义DMA通道的DMA缓存的大小 ps: 即货柜大小,能存多少个快件 3)外设地址寄存器递增与否 4)内存地址寄存器递增与否 5)设定了外设数据宽度 6)设定了内存数据宽度 7)设置了DMA的工作模式 8)DMA通道的软件优先级 9)使能或关闭DMA通道的内存到内存传输 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:19 , Processed in 1.074902 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号