dma即direct memory access 直接儲存器訪問:將資料從乙個位址複製到另乙個位址,當cpu初始化dma控制器後,傳輸動作由dma控制器實現和完成
優點:無需cpu控制 或 中斷壓棧-出棧過程,讓ram與io裝置間可快速傳輸資料,減少cpu負載
雙ahb匯流排,乙個用於儲存器訪問,乙個用於外設訪問
程式設計介面僅支援32位訪問的ahb使用dma
最多2個dma控制器,總共2*8=16個資料流,每個dma控制器用於管理乙個或多個外設的訪問請求,每個資料流總共可以有8個通道(或請求),每個通道都有乙個仲裁器處理dma優先順序
每個資料流都有單獨的四級32位fifo,可用於fifo模式或直接模式,支援迴圈緩衝區管理
dma硬體配置:
要傳輸的資料數目由dma或外設管理
支援4個、8個、16個節拍的增量突發傳輸
迴圈模式
對每個dma資料流,在
達到半傳輸
傳輸完成
傳輸錯誤
fifo錯誤(上溢、下溢、fifo級別錯誤)
直接模式錯誤
時,會產生中斷,可使用單獨的中斷使能位以實現靈活性
1.將先前的資料塊dma傳輸在狀態暫存器中置1的所有資料流專用的位 置0
2.重新使能資料流
3.設定外設埠暫存器位址
4.設定儲存器位址
5.配置要傳輸的資料項總數,每出現一次外設時間或乙個節拍的突發傳輸,該值就會遞減
6.選擇dma通道
7.設定外設用作流控制器
8.配置資料流優先順序
9.配置fifo使用情況
10.配置資料傳輸方向
11.配置外設和儲存器模式、突發事件、資料寬度、迴圈模式、雙緩衝區模式、特殊情況中斷等
12.使能資料流
只要使能資料流後即可響應連線到資料流的外設發出的任何dma請求
1.使能dma時鐘
2.初始化dma通道引數
3.使能串列埠dma傳送
4.查詢dma的en位,確保資料流就緒,可以配置
5.設定通道當前剩餘資料量
6.使能dma1通道,啟動傳輸
7.查詢dma傳輸狀態
8.獲取/設定通道當前剩餘資料量
dma.c
#include
"dma.h"
//dma_streamx表示dma資料流,只能選擇dma1或dma2
//chx表示通道數
//par表示外設位址
//mar表示儲存器位址
//ndtr表示資料傳輸量
void
dma_config
(dma_stream_typedef* dma_streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
//3. 設定dma屬性
dma_initstructure.dma_channel=chx;
//選擇通道
dma_initstructure.dma_peripheralbaseaddr=par;
//外設位址
dma_initstructure.dma_memory0baseaddr=mar;
//dma 儲存器0位址
dma_initstructure.dma_dir=dma_dir_memorytoperipheral;
//選擇模式:儲存器mar>>外設par
dma_initstructure.dma_buffersize=ndtr;
//資料傳輸量
dma_initstructure.dma_peripheralinc=dma_peripheralinc_disable;
//外設增量模式關閉
dma_initstructure.dma_memoryinc=dma_memoryinc_enable;
;//儲存器增量模式開啟
dma_initstructure.dma_memorydatasize=dma_peripheraldatasize_byte;
//儲存器資料長度:位元組模式(8位)
dma_initstructure.dma_mode=dma_mode_normal;
//普通模式
dma_initstructure.dma_priority=dma_priority_medium;
//中等優先順序
dma_initstructure.dma_fifomode=dma_fifomode_disable;
//fifo模式:不使用fifo
dma_initstructure.dma_fifothreshold=dma_fifothreshold_full;
//fifo閾值設定:全滿時停止加入fifo
dma_initstructure.dma_memoryburst=dma_memoryburst_single;
//儲存器突發單次傳輸
dma_initstructure.dma_peripheralburst=dma_peripheralburst_single;
//外設突發單次傳輸
//應用設定
dma_init
(dma_streamx,
&dma_initstructure);}
void
dma_enable
(dma_stream_typedef* dma_streamx,u16 ndtr)
//6. 設定資料傳輸量
dma_setcurrdatacounter
(dma_streamx,ndtr)
;//7. 開啟dma傳輸
dma_cmd
(dma_streamx,enable)
;}
dma.h
#ifndef __dma_h
#define __dma_h
#include
"sys.h"
void
dma_config
(dma_stream_typedef* dma_streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
;//dma配置函式
void
dma_enable
(dma_stream_typedef* dma_streamx,u16 ndtr)
;//dma使能函式
#endif
main.c
#include
"sys.h"
#include
"delay.h"
#include
"usart.h"
#include
"dac.h"
#include
"dht11.h"
#include
"dma.h"
#define send_buf_size 8200
//傳送資料長度,最好等於sizeof(text_tosend)+2的整數倍
u8 send_buff[send_buf_size]
;const u8 text_to_send=
;int
main
(void
)else
}else}
i=0;while(1
)
process=
dma_getcurrdatacounter
(dma2_stream7)
;//得到當前剩餘資料數量
process=
1-process/send_buf_size;
//得到百分比
process*
=100
;//擴大100倍進行顯示
lcd_shownum(30
,170
,100,3
,16);
}lcd_shownum(30
,170
,100,3
,16);
//顯示100%
lcd_showstring(20
,150
,200,16
,16,"tansimit finished!");
//提示傳輸完成}
i++;delay_ms(10
);if(i==20)
}}
STM32F4外設配置速查 RTC部分
2個32位暫存器包含bcd格式的second minute hour 12 24小時制 day week month year 還可以提供二進位制的亞秒值 系統可自動將月份天數補償位28 29 30 31天,還可以進行夏令時補償 時鐘源 由rtc calr精密校準過的lse 32.768khz 時鐘...
STM32F4外設配置速查 FPU與DSP部分
詳細內容參考cortex m4核心程式設計手冊 stm32f4xx及更高配置stm32微控制器才有fpu支援 stm32f4帶有32位單精度硬體fpu,支援浮點指令集,整個fpu單元能被使能和關閉 使用協處理器控制暫存器 scb cpacr 中的cp11和cp10啟用 關閉fpu 晶元復位後,cp1...
STM32F4外設配置速查 低功耗喚醒部分
一般在系統或電源復位後,mcu在執行狀態下由hclk為cpu提供時鐘,核心執行 當cpu不需要執行時可利用多種低功耗模式來節省功耗,等待某事件觸發時才喚醒 stm32f4xx有三種低功耗模式 睡眠模式 僅核心停止,外設如nvic systick等仍執行 停止模式 所有時鐘停止,1.8v核心電源工作,...