找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2063|回复: 0
打印 上一主题 下一主题
收起左侧

基于原子stm32 dma详细讲解

[复制链接]
跳转到指定楼层
楼主
ID:224778 发表于 2017-8-4 18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于正点原子Stm32f103DMA详细介绍
          By 小泽
(1)DMA通俗的讲就是可以将一个区域的数据复制到另一个区域来,可为cpu减负。
以下是STM32F103DMA的特点:



(2)stm32f103大容量芯片中具有两个DMA,DMA1具有7个不同的通道DAM2有5个通道,当选择好固定的通道时,所选择的外设也就固定了。
以下是通道对应的具体外设:



(3)DMA的操作大致分为3步,涉及4个重要的寄存器
第一步:在DMA_cpar寄存器中选择外设基地址作为传输的源头或目标
具体寄存器列表如下:

第二步:在DMA_cmar寄存器中选择存储器基地址作为传输的目标或源头
具体寄存器列表如下:

第三步:在通道配置寄存器(dma_ccrx)中的DIR寄存器中设置传输方向
当其设置为0时将外设设为目标源,当其设置为1时将存储器设为目标源
具体寄存器操作如下:

PS:每传送一次数据执行一次DAM_cndtr(数据传输量)寄存器递减操作,所以该寄存器包含尚未完成的操作项目(cndtr只能在dma_ccrx的en=0时写入)。



(4)其他的一些重要寄存器:
1.DMA_ccrx中的pl寄存器,该寄存器充当仲裁器可为每个通道配置优先等级

2.DMA_ccrx中有msize和psize寄存器分别设置存储器和外设的数据宽度


当宽度一致时很好理解,当不一致的时候需要参考该表



3.DMA_ccrx中的minc和pinc寄存器分别用来开启存储器和地址的指针增量


4.DMA_ccrx寄存器中的circ寄存器用于设置循环模式,当一次数据传输完成
后,还可以无限多次的传输数据。


5.DMA_ccrx中有MEM2MEM寄存器用来开启存储器到存储器的数据传输,一
旦开启这个模式,将不能再使用循环模式



(4)中断:半传输标志位(HTIF),传输完成标志位(TCIF),传输错误标志(TEIF)

(5)关于DMA配置问题怎么快速找到外设使能函数:
在FWLIB下找到相应的“xx.c”文件 在里面直接搜索DMA即可




其实外设地址也可以设置为你定义的内存基地址



Dst就是将所谓的外设基地址设置为目标
Src就是将所谓的外设基地址设置为源头



设置cndtr寄存器,可查看剩余的数据



可以设置外设或寄存器地址自增与否


是否开启循环模式




(7)一定要开启相应外设的时钟



由这段代码可以清晰看到是要发送的字节长度,是要发送的数据量,所以要发送的数据量为(8200*8bit
)这两者是有区别的为了进一步佐证我的想法我查看的buffsize的具体数值

0x10000转化为10进制为65536 说明我的想法是正确的。






注意事项!!!!一定要注意!!!!!
(1)一旦开始存储到存储之间的数据传输,不能开启连续转换模式
(2)cndtr只能在dma_ccrx的en=0时写入对应的具体代码

(3)一定要开启相应外设的时钟
(4)就是我在上面说过的关于buffsize的问题 ,一定要区分好字节和数据




                                                                       2017 .8.3
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表