程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> DMA(STM32),dmastm32

DMA(STM32),dmastm32

編輯:關於C語言

DMA(STM32),dmastm32


1.DMA:data memory access //實際的內存存儲

注:DMA干活的時候是不需要CPU干涉的

2.

①內存(定義的變量)---外設(寄存器);

②內存---內存

③外設---外設(一個外設的寄存器到另一個外設的寄存器)

3.

STM32有兩個DMA控制器

如圖:

4.舉例說明:(內存到外設,串口1 TX DMA)

 1 void USART1_DMA_Config(void)
 2 {
 3         DMA_InitTypeDef DMA_InitStructure;
 4     
 5         /*Open the DMA clock*/
 6         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 7 
 8         /*Set the DMA source: serial port data register address*/
 9         DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;       
10 
11         /*Memory address,(A pointer to the variable transmission)*/
12         DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
13 
14         /*Direction:From memory to the peripherals*/        
15         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;    
16 
17         /*Transmission size:DMA_BufferSize=SENDBUFF_SIZE*/    
18         DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
19 
20         /*It does not increase peripheral address*/        
21         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; 
22 
23         /*Memory address since the increase*/
24         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;    
25 
26         /*A peripheral unit of data*/    
27         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
28 
29         /*Memory data unit:8bit*/
30         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;     
31 
32         /*The DMA mode: cycle*/
33         //DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
34         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;     
35 
36         /*priority:medium*/    
37         DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;  
38 
39         /*Memory to memory transmission is prohibited*/
40         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
41 
42         /*Configuration of the channel 4*/           
43         DMA_Init(DMA1_Channel4, &DMA_InitStructure);        
44         
45         /*enable DMA1_Channel4*/
46         DMA_Cmd (DMA1_Channel4,ENABLE);                    
47         //DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);  //Configuration after completion of the DMA interrupt
48 }

①USART1_TX掛載在DMA1的通道4(每個DMA有7個通道,對應不同外設)如圖:

②程序第九行source(源)

即:源頭地址(外設地址)

 1 #define USART1_DR_Base 0x40013804 // 0x40013800 + 0x04 = 0x40013804 

怎麼算出來的呢?

請來看:

 

基地址是什麼呢?

 

故:串口1的數據寄存器地址:

// 0x40013800 + 0x04 = 0x40013804

③內存地址,自己定義的數組

④方向:內存到外設

⑤傳輸大小:5000個字節

⑥外設地址不增,內存地址自增,把5000個字節循環發完

⑦發送模式:有Normal:送完5000個字節工作就結束了,circular則是循環發送

⑧優先級:假如在一個程序裡面有幾個外設同時申請了DMA請求,則根據優先級不同來選擇配置那個

⑨禁止內存到內存的傳輸

4.看看main函數

            uint16_t i;
            
            /*Filling is going to send data*/
            for(i=0;i<SENDBUFF_SIZE;i++)
            {
                SendBuff[i]     = 'A';
            }
        
        /* USART1向DMA發出TX請求*/
        USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

        /* 此時CPU是空閒的,可以來做別的事情*/
        
        //LED  At the same time scintillation
        for(;;)
        {
            LED1(ON);
            Delay(0xFFFFF);
            LED1(OFF);
            Delay(0xFFFFF);
        }

注:這樣串口1不斷向外發送數據,不影響CPU運行,CPU可以籐下時間做別的事情;(同事干兩件事情)
 

M3裡面的DMA只能軟件觸發,有的芯片可以外部的脈沖觸發;

 


STM32中DMA通道

呵呵,你這個應該是的stm32的固件庫函數的修改版吧。
DMA_Channel_TypeDef*指的是DMA_Channel_TypeDef的指針,它指向一個地址。
DMA_CHx應該是一個宏定義,它定義了這個地址。
x值代表DMA的通道號,根據芯片不同,可能有1~7不等。
如果想要明白些,用goto difinition查看宏定義即可。

歡迎追問
 

STM32 配置DMA的時: Error: L6218E: Undefined symbol DMA_Cmd (referred from maino) keil 412

還要將XXX_DMA.C添加到工程的StdPeriph_Driver文件夾下
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved