詳細理解STM32F42x系列的DMA配置

2021-10-14 01:31:26 字數 2434 閱讀 3831

以spi2 為例,將儲存器中的資料,通過dma方式搬運到外設,也就是往外發spi_tx,dma配置步驟:

1、選擇dma1還是dma2:通過圖1可檢視到spi2是在dma1表裡,所以選擇dma1。

rcc_ahb1periphclockcmd(rcc_ahb1periph_dma1,enable);

2、選擇資料流:該配置應該放在所有資訊配置完在使能。

dma_cmd(dmax_streamy, enable);

其中x = 1、2,y=0、1…7,有兩個dma,分別是dma1和dma2,每個dma控制器有又有8個資料流。

3、通道選擇,有8個通道,不是隨便選擇的,得檢視圖1和圖2,spi2外設所對應的通道0。

dma_initstructure.dma_channel = dma_channel_0;

4、設定外設基位址。

dma_initstructure.dma_peripheralbaseaddr = 0***xx;

5、設定儲存資料的位址,dma從儲存器取資料,該儲存器在記憶體中的的首位址。

u32 buffer = ;

dma_initstructure.dma_memory0baseaddr = (u32) buffer;
6、設定dma傳輸方向(儲存器到外設、儲存器到儲存器或外設到儲存器)

dma_initstructure.dma_dir = dma_dir_memorytoperipheral; //儲存器到外設

7、設定dma 緩衝區的容量大小,檢視資料,圖6,dma傳輸最大的數量是65535。

8、設定外設和儲存器位址是否要遞增

dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; //外設遞增不位址,是一直從spi2位址上獲取資料的

dma_initstructure.dma_memoryinc = dma_memoryinc_enable; //儲存器位址要遞增,否則資料會被覆蓋掉

9、 設定dma 工作模式,有兩種模式dma_mode_normal 和 dma_mode_circular。

(1)、正常模式,即dma只傳輸一次。當傳輸完一次後,還想再傳一次,需重啟dma_cmd(dma1_stream4, enable);

(2)、迴圈模式可用於處理迴圈緩衝區和連續資料流(例如adc掃瞄模式)。

dma_initstructure.dma_mode = dma_mode_normal; //如果是單次讀取,可用正常模式

dma_initstructure.dma_mode = dma_mode_circular ;//掃瞄讀取可用迴圈模式,儲存器到儲存器不能選擇迴圈模式

10、設定dma優先順序(有四種低、中、高、最高),多個外設需要用到dma時,就需要設定優先順序。

dma_initstructure.dma_priority = dma_priority_high;

11、設定fifo模式,用於在源資料傳輸到目標 之前 臨時存放 這些資料,也就是說資料先存放到fifo中,待fifo資料量達到一定閾值,再將資料傳輸到目標。

dma_initstructure.dma_fifomode = dma_fifomode_disable;//不使用fifo模式

dma_initstructure.dma_fifothreshold = dma_fifothreshold_halffull;//可選擇1/4、1/2、3/4和full四種,不使用fifo模式,這引數沒必要寫

12、設定外設和儲存器突發傳輸,dma控制可以產生單次傳輸或4個、8個和16個節拍的增量突發傳輸

(1)、單次傳輸時,每個dma請求產生一次(乙個節拍,這樣好理解突發傳輸)資料傳輸(傳輸資料寬度可以是位元組、半字和字為單位)。

(2)、突發傳輸時,每個dma請求相應地生成4個、8個或16個節拍傳輸資料(傳輸資料寬度可以是位元組、半字和字為單位),期間不被中斷。

比如:此例子中傳輸資料寬度設定是半字,即16bit

dma緩衝區大小設定的是最大值65535

單次傳輸,dma請求產生一次(乙個節拍)資料傳輸,總共傳輸資料 16 / 8* 65535 = 131070byte, 大概傳輸了128kbyte
突發傳輸4個節拍,4*128 = 513kbyte

突發傳輸8個節拍,8*128 = 1mbyte

突發傳輸16個節拍,16*128 = 2mbyte

一次dma請求傳輸的資料量越大,占用dma時間越長,期間不會被中斷,如果系統還有其他外設需要用dma時,就得考慮一次傳輸的資料量了。
dma_initstructure.dma_memoryburst = dma_memoryburst_single; //選擇單次傳輸

dma_initstructure.dma_peripheralburst = dma_peripheralburst_single; // 選擇單次傳輸

STM32F10x系列 中斷

概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...

STM32F1x系列 定時器中斷

一 通用定時器的工作過程如下圖 二 計數器模式 1 向上計數模式 計數器從0計數到自動載入值,然後重新從0開始計數並且產生乙個計數器溢位事件 2 向下計數模式 計數器從自動裝入的值開始向下計數到0,然後從自動裝入的值重新開始,並產生乙個計數器向下溢位的事件 3 對齊模式 向上 向下計數 計數器從0開...

STM32F10x系列UART中斷異常除錯經歷

硬體環境 stm32f105rct6 軟體環境 freertosv8 問題描述 採用中斷方式接收資料,然後將收到的一幀資料放入訊息佇列,然後有專門的乙個任務用來從訊息佇列中取資料並處理。jlink除錯以及燒錄執行都是可以的,但是當隨著通訊頻率的增加以及執行時間的加長,系統會出現 宕機 即,不停的進入...