您的位置 首页 5G

ARM学习《十一》—不必库函数自己着手装备STM32中的DMA

今天调试的STM32的DMA部分,第一次接触这部分,8位的单片机没有这部分的功能,一开始感觉这东西很神秘,所以怀着敬畏的心情来学习它。慢慢…

今日调试的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存储器地址寄存器

#define DMA_CMAR6(*((volatile unsigned long *)0x40020078))//通道6存储器地址寄存器

#define DMA_CMAR7(*((volatile unsigned long *)0x4002008C))//通道7存储器地址寄存器

装备DMA,手册上一共能够将串口UART1的发送Tx功用装备为DMA发送,在DMA通道4:

void DMA_configration(void)

{

//DMA设置:

//设置DMA源:内存地址&串口数据寄存器地址

//方向:内存–>外设

//每次传输位:8bit

//传输巨细:10字节

//地址自增形式:外设地址不增,内存地址自增1

//DMA形式:循环

//优先级:高

RCC_AHBENR|=0x00000001; //位0 DMAEN DMA时钟使能

DMA_CCR4&=0xFFFF800E;//0:通道禁用

DMA_CPAR4=(unsigned long)&USART1_DR;

DMA_CMAR4=(unsigned long)Data_Buffer;

DMA_CNDTR4=10;

DMA_CCR4=0x00000000;

DMA_CCR4|=0x000030B0;

//DMA_CCR4|=0x00000001;//DMA使能

}

Main函数:

unsigned char Data_Buffer[10]={0x11,0x22,0x33,0x44,0x55};

//将Data_Buffer设为全局变量

int main()

{

SystemInit0();//体系(时钟)初始化

stm32_UsartSetup ();//串口初始化,前面的文章中有介绍

DMA_configration();// DMA装备

USART1_CR3|=0x00000080; //将USART1模块发送数据Tx设置成DMA方法作业

DMA_CCR4|=0x00000001;//使能DMA

while(1)

{

//CPU能够不受打扰的做其他作业

}

}

翻开串口帮手就能够看到Data_Buffer[]中的数据,其实这仅仅一个简略的演示实例,DMA的用途是很大的,先学会装备,今后会有它大显神通的时分。

USART1_CR3|=0x00000080; //将USART1模块发送数据Tx设置成DMA方法作业

DMA_CCR4|=0x00000001;//使能DMA

上面这两句便是触发源,你能够把这两句放到守时器TIMx中,比方守时1S触发DMA,这些都是能够恣意设置的,不难吧!

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/264445.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部