嵌入式--DMA实验及相关库函数

一、DMA原理

1.DMA 全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。作用:为CPU减负。 

2.STM32最多有2个DMA控制器(DMA2仅存在大容量产品中),DMA1有7个通道。DMA2有5个通道。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁起来协调各个DMA请求的优先权。

3.DMA框图 

4.DMA主要特性

①每个通道都直接连接专用的硬件DMA请求,都支持软件触发,这些通过软件来配置。
②在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相等优先权时由硬件决定(请求0优先于请求1,依此类推) 。

③ 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

④ 支持循环的缓冲器管理。

⑤ 每个通道都有3个事件标志(DMA 半传输,DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

⑥ 外设和存储器,存储器和外设的传输 ,存储器和存储器间的传输。

⑦ 闪存、SRAM、外设的SRAM、APB1 APB2和AHB外设均可作为访问的源和目标。

⑧ 可编程的数据传输数目:最大为65536

 5.外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。

 6.DMA处理

7.仲裁器根据通道请求的优先级来启动外设/存储器的访问。
优先权管理分2个阶段:
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
─ 最高优先级
─ 高优先级
─ 中等优先级
─ 低优先级
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。举个例子,通道2优先于通道4。
注意: 在大容量产品和互联型产品中, DMA1控制器拥有高于DMA2控制器的优先级

8.地址增量

通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以
有选择地完成自动增量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量
值,增量值取决与所选的数据宽度为1、 2或4。第一个传输的地址是存放在DMA_CPARx
/DMA_CMARx寄存器中地址。在传输过程中,这些寄存器保持它们初始的数值,软件不能改变
和读出当前正在传输的地址(它在内部的当前外设/存储器地址寄存器中)。
当通道配置为非循环模式时,传输结束后(即传输计数变为0)将不再产生DMA操作。要开始新的
DMA传输,需要在关闭DMA通道的情况下,在DMA_CNDTRx寄存器中重新写入传输数目。
在循环模式下,最后一次传输结束时, DMA_CNDTRx寄存器的内容会自动地被重新加载为其初
始数值,内部的当前外设/存储器地址寄存器也被重新加载为DMA_CPARx/DMA_CMARx寄存器
设定的初始基地址。

9.中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考
虑,通过设置寄存器的不同位来打开这些中断。

10.通道配置过程

1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将
是数据传输的源或目标。
2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数
据将从这个地址读出或写入这个地址。
3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。
5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外
设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。
一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。
当传输一半的数据后,半传输标志(HTIF)被置1,当设置了允许半传输中断位(HTIE)时,将产生
一个中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,当设置了允许传输完成中断位
(TCIE)时,将产生一个中断请求
11.六个DMA寄存器

(1)DMA中断状态寄存器(DMA_ISR)

(2)DMA中断标志清除寄存器(DMA_IFCR)
(3)DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)

(4)DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)
(5)DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)

(6)DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)

二、DMA寄存器

1.DMA中断状态寄存器(DMA_ISR)

 2.DMA中断标志清除寄存器(DMA_IFCR)

3.DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)
 

 4.DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

 5.DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)

6.DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)

三、DMA相关寄存器库函数功能及作用

1.void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);

 将DMAyChannelx寄存器的初始化为其默认值

2.void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);

 对DMA初始化,1.选择DMA通道。2.对DMA参数进行配置,主要包括(1)DMA_PeripheralBaseAddr外设地址(2)DMA_MemoryBaseAddr存储器地址(3)DMA_DIR传输方向(4)DMA_BufferSize设置一次传输数据量的大小(5)DMA_PeripheralInc设置传输数据的时候外设地址是不变还是递增。(6)DMA_MemoryInc设置传输数据时候内存地址是否递增(7)DMA_PeripheralDataSize设置外设的传输数据长度,分别是8/16/32(8)DMA_MemoryDataSize用来设置内存的传输数据长度。(9)DMA_Mode传输模式,循环模式/正常模式,循环模式是数据传输完继续从头传输。(10)DMA_Priority用来设置通道的优先级。(11)DMA_M2M是否是存储器和存储器之间进行传输。

3.void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct)

对DMA进行结构体初始化,但都是默认值

4.void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);

对DMA进行使能,1.选择DMA通道。2.使能

5.void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); 

DMA 中断配置, 1.选择DMA通道。2.选择中断形式。3.使能中断

6.void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); 

设置通道传输数量

7.uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); 

获取当前通道数据的数量

8.FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); 

获取DMA标志状态,主要是对中断状态寄存器 DMA_ISR 进行操作

9.void DMA_ClearFlag(uint32_t DMAy_FLAG);

清除DMA标志状态, 主要是对清除中断状态寄存器 DMA_IFCR进行操作

10.ITStatus DMA_GetITStatus(uint32_t DMAy_IT);

 获取DMA中断状态

11.void DMA_ClearITPendingBit(uint32_t DMAy_IT);

清除DMA中断标志位

 四、DMA实验配置步骤

使能DMA时钟RCC_AHBPeriphClockCmd();

初始化DMA通道参数DMA_Init();

使能串口DMA发送,串口DMA使能函数:USART_DMACmd();

使能DMA1通道,启动传输。DMA_Cmd();

查询DMA传输状态DMA_GetFlagStatus();

⑥获取/设置通道当前剩余数据量:

  DMA_GetCurrDataCounter();

  DMA_SetCurrDataCounter();

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值