微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 不用库函数自己动手配置STM32中的DMA

不用库函数自己动手配置STM32中的DMA

时间:11-26 来源:互联网 点击:
今天调试的STM32DMA部分,第一次接触这部分,8位的单片机没有这部分的功能,一开始感觉这东西很神秘,所以怀着敬畏的心情来学习它。慢慢的发现这确实是个好东西,功能强大,可以分担CPU的任务。但它没有想象中那么棘手。

DMA英文全称是Direct Memory Access,意思是直接存储器访问。他的作用就是不需要经过CUP进行数据传输,也就是替CPU分担点事情做,什么事情?数据传输方面的事情。也就是说,你只要使能并配置好了DMA,DMA就可以将一批数据从源地址搬运到目的地址去而不经过CPU的干预,这样可以为CPU节省好多精力去干更重要的事情很人性化。就像我们人一样,我们平常习惯性的动作是不用经过大脑思考的,比如说眨眼睛,呼吸等。DMA就是负责这些工作的,但它没人这么智能,需要将它设置好了它才会正常工作。

要进行数据传输就必须有两个条件:数据从哪传(源地址),数据传到哪里去(目的地址)。是的DMA的确有这两项设置,通过软件设置,设置好源地址和目的地址。在一个重要的条件就是触发源是什么,就是说什么时候进行DMA数据传输呢?这叫触发信号。也可以通过软件编程设置具体时间,具体条件来触发DMA数据传输。

总之,要使用DMA就要将各种参数,条件配置好才可以用。就提的DMA寄存器说明见STM32的参考手册。下面举一简单的历程来说明DMA的用法,本历程将串口数据发送设置为DMA模式,串口1将持续从RAM中的一段连续的地址中取数据,然后发送出去。用串口调试助手可以监测DMA的工作和CPU互不冲突,串口发送就相当于后台运行的一段程序。具体配置如下:

寄存器定义:

//*************************************************************************

//

// DMA-Register

//

//*************************************************************************

#define DMA_ISR(*((volatile unsigned long *)0x40020000)) //中断状态寄存器

#define DMA_IFCR(*((volatile unsigned long *)0x40020004))//中断标志清零寄存器

#define DMA_CCR1(*((volatile unsigned long *)0x40020008))//通道1配置寄存器

#define DMA_CCR2(*((volatile unsigned long *)0x4002001C))//通道2配置寄存器

#define DMA_CCR3(*((volatile unsigned long *)0x40020030))//通道3配置寄存器

#define DMA_CCR4(*((volatile unsigned long *)0x40020044))//通道4配置寄存器

#define DMA_CCR5(*((volatile unsigned long *)0x40020058))//通道5配置寄存器

#define DMA_CCR6(*((volatile unsigned long *)0x4002006C))//通道6配置寄存器

#define DMA_CCR7(*((volatile unsigned long *)0x40020080))//通道7配置寄存器

#define DMA_CNDTR1(*((volatile unsigned long *)0x4002000C))//通道1传输数量寄存器

#define DMA_CNDTR2(*((volatile unsigned long *)0x40020020))//通道2传输数量寄存器

#define DMA_CNDTR3(*((volatile unsigned long *)0x40020034))//通道3传输数量寄存器

#define DMA_CNDTR4(*((volatile unsigned long *)0x40020048))//通道4传输数量寄存器

#define DMA_CNDTR5(*((volatile unsigned long *)0x4002005C))//通道5传输数量寄存器

#define DMA_CNDTR6(*((volatile unsigned long *)0x40020070))//通道6传输数量寄存器

#define DMA_CNDTR7(*((volatile unsigned long *)0x40020084))//通道7传输数量寄存器

#define DMA_CPAR1(*((volatile unsigned long *)0x40020010))//通道1外设地址寄存器

#define DMA_CPAR2(*((volatile unsigned long *)0x40020024))//通道2外设地址寄存器

#define DMA_CPAR3(*((volatile unsigned long *)0x40020038))//通道3外设地址寄存器

#define DMA_CPAR4(*((volatile unsigned long *)0x4002004C))//通道4外设地址寄存器

#define DMA_CPAR5(*((volatile unsigned long *)0x40020060))//通道5外设地址寄存器

#define DMA_CPAR6(*((volatile unsigned long *)0x40020074))//通道6外设地址寄存器

#define DMA_CPAR7(*((volatile unsigned long *)0x40020088))//通道7外设地址寄存器

#define DMA_CMAR1(*((volatile unsigned long *)0x40020014))//通道1存储器地址寄存器

#define DMA_CMAR2(*((volatile unsigned long *)0x40020028))//通道2存储器地址寄存器

#define DMA_CMAR3(*((volatile unsigned long *)0x4002003C))//通道3存储器地址寄存器

#define DMA_CMAR4(*((volatile unsigned long *)0x40020050))//通道4存储器地址寄存器

#define DMA_CMAR5(*((volatile unsigned long *)0x40020064))//通道5存储器地址寄存器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top