DMA配置

DMA可以认为连接两个“地址”数据通道。DMA共享系统总线,不占用CPU,所以可以实现快速数据传输。
这里以DMA连接存储器(数组)和串口(USART1->DR)为例。

 1 void DMA_init(void)
 2 {
 4 RCC->AHBENR|=1<<0;//时能DMA1时钟
 5 
 7 DMA1_Channel4->CPAR=(u32)&USART1->DR;//读外设串口数据寄存器
 8 DMA1_Channel4->CMAR=(u32)tbuff;//存储器地址为temp地址
 9 DMA1_Channel4->CNDTR=10;//一次接收字节数DMA_BUFF_SIZE
11  //DNA->CCR配置
12  DMA1_Channel4->CCR=0x00000000;//复位DMA
13  DMA1_Channel4->CCR|=0<<14;//非存储器到存储器模式
14  DMA1_Channel4->CCR|=1<<12;//13,12设置通道优先级
15  DMA1_Channel4->CCR|=0<<10;//10,11存储器数据宽度
16  DMA1_Channel4->CCR|=0<<8;//9,8外设数据宽度8位
17  DMA1_Channel4->CCR|=1<<7;//存储器地址增量模式
18  DMA1_Channel4->CCR|=0<<6;//外设地址增量模式
19  DMA1_Channel4->CCR|=0<<5;//循环模式
20  DMA1_Channel4->CCR|=1<<4;//数据传输方向0:从外设读,即从外设到存储器 1:从存储器读,即从存储器到外设
21  DMA1_Channel4->CCR|=0<<3;//允许传输错误中断
22  DMA1_Channel4->CCR|=0<<2;//允许半传输中断
23  DMA1_Channel4->CCR|=0<<1;//允许传输完成中断
24  DMA1_Channel4->CCR|=0<<0;//通道开启
25 }

28 int main(void)
29 {            
31     Stm32_Clock_Init(9); //系统时钟设置
32     delay_init(72);         //延时初始化 
33     uart_init(72,9600);     //串口初始化为9600
34     LED_Init();               //初始化与LED连接的硬件接口 
35     DMA_init(); 
36     LED0=0;  
37 
38     USART1->CR3|=1<<7;//记得要把串口配置为DMA使能,否则DMA不会工作
39     while(1)
40     {
41             
42         DMA1_Channel4->CCR&=~(1<<0);
43         DMA1_Channel4->CNDTR=10;
44         DMA1_Channel4->CCR|=1<<0;
45     
46         while(1)
47         {
48          if(DMA1->ISR&(1<<13))
49          {
50          delay_ms(100);
        LED0=~LED0;
51 DMA1->IFCR|=1<<13; 52 break; 53 } 54 } 55 } 56 }

 

 
posted @ 2013-08-07 10:45  Skey Studio  阅读(1114)  评论(0编辑  收藏  举报