stm32寄存器版学习笔记 DMA
DMA(Direct Memory Access),直接存储器访问。DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高。stm32f103有2个DMA控制器,DMA1有7个通道,DMA2有5个通道,专门用来管理来自外设对存储器的访问请求,还有一个仲裁器来协调各个DMA请求的优先权。
一:DMA各通道请求
从外设产生的DMA请求通过逻辑"或"输入到DMA控制器,这就意味着同时只能有一个请求有效。
例如,串口1发送的DMA,就要用到DMA1的通道4(也就是说通道与各通讯口是相互对应的)
参考手册


二.DMA1通道4(串口1发送)配置步骤
①设置外设地址
DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)

Eg: DMA_CHx->CPAR=cpar; //DMA1 外设地址
或 DMA_CHx->CPAR=&USART1_DR;
②设置存储器地址
存储器地址通过DMA1_CMAR设置


Eg:DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
③设置传输数据量
DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

Eg:DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
④设置通道4的配置信息
若有多个通道,则要设置优先级,编号越小优先级越高。
DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)


⑤使能DMA1通道4,启动传输
DMAx_CCRx 最低位开启DMA传输。
注意要设置USART1的使能DMA传输位,通过USART1->CR3的第七位设置,这样就可以启动一次USART1的DMA传输了。
⑥DMA中断状态显示及清除
DMA中断状态寄存器(DMA_ISR)



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


Eg:if(DMA1->ISR&(1<<13))//等待通道4传输完成
{
DMA1->IFCR|=1<<13;//清除通道4传输完成标志
break;
}
三:示例程序
DMA1通道4(串口1发送)应用
1 u16 DMA1_MEM_LEN;//保存DMA每次数据传送的长度
2 //DMA1的各通道配置
3 //这里的传输形式是固定的,这点要根据不同的情况来修改
4 //从存储器->外设模式/8位数据宽度/存储器增量模式
5 //DMA_CHx:DMA通道CHx
6 //cpar:外设地址
7 //cmar:存储器地址
8 //cndtr:数据传输量
9 void MYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
10 {
11 RCC->AHBENR|=1<<0; //开启DMA1时钟
12 delay_ms(5); //等待DMA时钟稳定
13 DMA_CHx->CPAR=cpar; //DMA1 外设地址
14 DMA_CHx->CMAR=(u32)cmar; //DMA1,存储器地址
15 DMA1_MEM_LEN=cndtr; //保存DMA传输数据量
16 DMA_CHx->CNDTR=cndtr; //DMA1,传输数据量
17 DMA_CHx->CCR=0X00000000; //复位
18 DMA_CHx->CCR|=1<<4; //从存储器读
19 DMA_CHx->CCR|=0<<5; //普通模式
20 DMA_CHx->CCR|=0<<6; //外设地址非增量模式
21 DMA_CHx->CCR|=1<<7; //存储器增量模式
22 DMA_CHx->CCR|=0<<8; //外设数据宽度为8位
23 DMA_CHx->CCR|=0<<10; //存储器数据宽度8位
24 DMA_CHx->CCR|=1<<12; //中等优先级
25 DMA_CHx->CCR|=0<<14; //非存储器到存储器模式
26 }
27 //开启一次DMA传输
28 void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
29 {
30 DMA_CHx->CCR&=~(1<<0); //关闭DMA传输
31 DMA_CHx->CNDTR=DMA1_MEM_LEN; //DMA1,传输数据量
32 DMA_CHx->CCR|=1<<0; //开启DMA传输
33 }
浙公网安备 33010602011771号