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 }  

 

posted @ 2021-04-13 15:47  一个爱搬运的球  阅读(1180)  评论(0)    收藏  举报