以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除錯以及燒錄執行都是可以的,但是當隨著通訊頻率的增加以及執行時間的加長,系統會出現 宕機 即,不停的進入...