STM32F4 DISCO 學習之DMA雙緩衝機制

2021-08-15 10:06:47 字數 1965 閱讀 9374

dma具備雙緩衝機制,可以讓資料在傳輸時候不斷流,也就是我們所謂的ping-pong-buffer,也就是說有ab兩個buffer,dma訪問a時候,cpu訪問b,dma訪問b時候,cpu訪問a.這種實現導致匯流排矩陣相對複雜,所以,一般低端mcu也不會有這個機制.但是在做這個機制的試驗時候,雖然可以做到ping-pong buffer的傳輸,但是..卻有點小意外.其實雙緩衝,在配置過程並不難,比如提供乙個配置參考:

dma_deinit(dma1_stream4);

dma_structinit(&dma_initstructure);

dma_initstructure.dma_channel = dma_channel_7;

dma_initstructure.dma_peripheralbaseaddr = (uint32_t)&usart3->dr; //資料傳輸的外設首位址

dma_initstructure.dma_memory0baseaddr = (uint32_t)buffer0; //自己定義待傳送陣列的首位址,要強制轉換為32位

dma_initstructure.dma_dir = dma_dir_memorytoperipheral; //資料傳輸方向選擇為記憶體->外設

dma_initstructure.dma_buffersize = 4; //傳輸資料大小為8,大小要配合定義的陣列型別和外設資料型別,否則會丟失或補充資料

dma_initstructure.dma_peripheralinc = dma_peripheralinc_disable; //外設位址暫存器自動增加禁止,因為這裡只用到了 dr 資料暫存器

dma_initstructure.dma_memoryinc = dma_memoryinc_enable; //記憶體位址自增允許,因為要讀取乙個陣列

dma_initstructure.dma_peripheraldatasize = dma_peripheraldatasize_byte; //外設的資料大小,因為 usart3_dr 資料暫存器為8位,故選byte

dma_initstructure.dma_memorydatasize = dma_memorydatasize_byte; //這裡也選 byte

dma_initstructure.dma_mode = dma_mode_circular; //dma 傳輸模式為 dma_mode_normal,如果為 dma_mode_circular,將會迴圈傳輸

dma_initstructure.dma_priority = dma_priority_low; //優先順序為 high

dma_initstructure.dma_fifomode = dma_fifomode_disable;

dma_initstructure.dma_fifothreshold = dma_fifothreshold_1quarterfull;

dma_initstructure.dma_memoryburst = dma_memoryburst_single;

dma_initstructure.dma_peripheralburst = dma_peripheralburst_single;

dma_doublebuffermodeconfig(dma1_stream4, (uint32_t)buffer1, dma_memory_0);

dma_doublebuffermodecmd(dma1_stream4, enable);

我們用了dma1中stream4的ch7,所以這麼初始化,並填入雙buffer,每個buffer長度是4.因為用到的是stream4,所以查詢dma_it_tcif4,然後再通過dma_getcurrentmemorytarget,就可以知道該換那個buffer,查到是在用1的buffer,我們就填0號陣列,否則填1號陣列,就這麼簡單.

void dma1_stream4_irqhandler(void)

}else}}

}

STM32 STM32f4學習之路 嘀嗒定時器

嘀嗒定時器,作為stm32特有的系統定時器,它的出現,旨在為使用者在使用os以及延時的時候提供乙個精確的定時。systick 是 mdk 定義了的乙個結構體 在 core m4.h 裡面 裡面包含 ctrl load val calib 等 4 個暫存器 ctrl暫存器 顧名思義就是systick的...

基於stm32f407建立stm32F427工程

分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...

STM32F4 IAP學習筆記

這裡預設是未定義vect tab sram,因此需要設定scb vtor的值,如下 scb vtor flash base vect tab offset 其中vect tab offset 0x10000,即偏移量,根據實際情況設定。為了方便修改,以及不改動系統檔案,將其放在main函式最開始處即...