DMA可以認(rèn)為連接兩個(gè)“地址”數(shù)據(jù)通道。DMA共享系統(tǒng)總線,不占用CPU,所以可以實(shí)現(xiàn)快速數(shù)據(jù)傳輸。
這里以DMA連接存儲(chǔ)器(數(shù)組)和串口(USART1->DR)為例。
1 void DMA_init(void)
2 {
4 RCC->AHBENR|=1<<0;//時(shí)能DMA1時(shí)鐘
5
7 DMA1_Channel4->CPAR=(u32)&USART1->DR;//讀外設(shè)串口數(shù)據(jù)寄存器
8 DMA1_Channel4->CMAR=(u32)tbuff;//存儲(chǔ)器地址為temp地址
9 DMA1_Channel4->CNDTR=10;//一次接收字節(jié)數(shù)DMA_BUFF_SIZE
11 //DNA->CCR配置
12 DMA1_Channel4->CCR=0x00000000;//復(fù)位DMA
13 DMA1_Channel4->CCR|=0<<14;//非存儲(chǔ)器到存儲(chǔ)器模式
14 DMA1_Channel4->CCR|=1<<12;//13,12設(shè)置通道優(yōu)先級(jí)
15 DMA1_Channel4->CCR|=0<<10;//10,11存儲(chǔ)器數(shù)據(jù)寬度
16 DMA1_Channel4->CCR|=0<<8;//9,8外設(shè)數(shù)據(jù)寬度8位
17 DMA1_Channel4->CCR|=1<<7;//存儲(chǔ)器地址增量模式
18 DMA1_Channel4->CCR|=0<<6;//外設(shè)地址增量模式
19 DMA1_Channel4->CCR|=0<<5;//循環(huán)模式
20 DMA1_Channel4->CCR|=1<<4;//數(shù)據(jù)傳輸方向0:從外設(shè)讀,即從外設(shè)到存儲(chǔ)器 1:從存儲(chǔ)器讀,即從存儲(chǔ)器到外設(shè)
21 DMA1_Channel4->CCR|=0<<3;//允許傳輸錯(cuò)誤中斷
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); //系統(tǒng)時(shí)鐘設(shè)置
32 delay_init(72); //延時(shí)初始化
33 uart_init(72,9600); //串口初始化為9600
34 LED_Init(); //初始化與LED連接的硬件接口
35 DMA_init();
36 LED0=0;
37
38 USART1->CR3|=1<<7;//記得要把串口配置為DMA使能,否則DMA不會(huì)工作
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 }





