DMA,意思為直接存儲器訪問。
DMA 可 用于實現外設與存儲器之間或者存儲器與存儲器之間數據高效傳輸。
因為 DMA 傳輸數據移動過程無需 CPU 直接操作,這樣節省的 CPU 資 源就可供其它操作使用。
從硬件層面來理解,DMA 就好像是 RAM 與 I/O 設備間數 據傳輸的通路,外設與存儲器之間或者存儲器與存儲器之間可以直接在這條通路 上進行數據傳輸。
這里說的外設一般指外設的數據寄存器,比如 ADC、SPI、I2C、 DCMI 等外設的數據寄存器,存儲器一般是指片內 SRAM、外部存儲器、片內 Flash 等。
STM32F1 最多有 2 個 DMA 控制器,DMA1 有 7 個通道。 DMA2 有 5 個通道。每個通道專門用來管理來自于一個或多個外設 對存儲器訪問的請求。還有一個仲裁器來協調各個 DMA 請求的優先權。
DMA1通道對應外設請求
DMA2通道對應外設請求
DMA就像一個中轉站一樣,里面有源地址和目標地址,多通道并用可以配置優先級,
只要開啟DMA就可以直接實現源地址里的內容傳送給目標地址,不需要CPU來管理,它就像個通道一樣,開啟就傳輸。
dma.c
#include "dma.h"
/*******************************************************************************
* 函 數 名 : DMAx_Init
* 函數功能 : DMA初始化函數
* 輸 入 :
DMAy_Channelx:DMA通道選擇,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
par:外設地址
mar:存儲器地址
buff_size:數據傳輸量
* 輸 出 : 無
*******************************************************************************/
void DMAx_Init(DMA_Channel_TypeDef* DMA1_Channelx,u32 par,u32 mar,u16 buff_size)
{
DMA_InitTypeDef DMA_InitStructure;
//1*開啟相應時鐘
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//2*DMA結構體配置
DMA_InitStructure.DMA_PeripheralBaseAddr = par; //外設目標地址
DMA_InitStructure.DMA_MemoryBaseAddr = mar; //存儲器源地址
DMA_InitStructure.DMA_DIR =DMA_DIR_PeripheralDST ; //方向是DMA存儲器到外設寄存器。方向還有外設到存儲器,存儲器到存儲器
DMA_InitStructure.DMA_BufferSize = buff_size; //傳輸的字節數目
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設寄存器地址自遞增,外設通常是一個不需要遞增
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryInc_Enable; //傳輸數據多字節時需要地址自增,實現開啟就全部傳輸完
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //DMA傳輸模式,單次傳輸
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //優先級配置,用于多通道時
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //存儲器到存儲器時打開
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //存儲器數據長度為1Byte,8位
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外設接收數據長度為必須要存儲器發送數據長度一樣
DMA_Init(DMA1_Channelx,&DMA_InitStructure);
}
/*******************************************************************************
* 函 數 名 : DMAx_Enable
* 函數功能 : 開啟一次DMA傳輸
* 輸 入 : DMAy_Channelx:DMA通道選擇,@ref DMA_channel DMA_Channel_0~DMA_Channel_7
buff_size:數據傳輸量,傳輸時再賦值一遍防止出錯
* 輸 出 : 無
*******************************************************************************/
//3*開啟DMA
void DMAx_ENABLE(DMA_Channel_TypeDef* DMA1_Channelx,u16 buff_size)
{
DMA_Cmd(DMA1_Channelx,DISABLE); //先關閉DMA使能來賦
DMA_SetCurrDataCounter(DMA1_Channelx,buff_size);
DMA_Cmd(DMA1_Channelx,ENABLE);
}
dma.h
#ifndef _dma_H
#define _dma_H
#include "system.h"
void DMAx_Init(DMA_Channel_TypeDef* DMA1_Channelx,u32 par,u32 mar,u16 buff_size);
void DMAx_ENABLE(DMA_Channel_TypeDef* DMA1_Channelx,u16 buff_size);
#endif
main.c
#include "systick.h"
#include "led.h"
#include "system.h"
#include "key.h"
#include "usart.h"
#include "dma.h"
#define data_size 5000
u8 data[data_size];
//數組賦值專用函數
void Data_zhuang(u8 *p)
{
u16 i;
for(i=0;i *p = '5'; p++; } } int main() { u8 i=0; u8 key; SysTick_Init(72); //系統時鐘初始 LED_INIT(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); USART1_Init(9600); KEY_INIT(); Data_zhuang(data); //給數組賦值 DMAx_Init(DMA1_Channel4,(u32)&USART1->DR,(u32)data,data_size); //DMA初始化,(u32)&USART1->DR是串口1的數據寄存器,(u32)data是我們在內存中造的數組 while(1) { key = KEY_Scan(0); if(key==KEY_UP) { USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //是哪個外設就開啟哪個的DMA功能 DMAx_ENABLE(DMA1_Channel4,data_size); //使能DMA while(1) { if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==1) //判斷DMA1的通道4是否傳輸完成 { DMA_ClearFlag(DMA1_FLAG_TC4); //清除傳輸完成標志 break; } led2=!led2; delay_ms(300); } } i++; if(i%20==0) //200ms變換一次 { led1=!led1; } } }
上一篇:stm32---DS18b20
下一篇:stm32---DAC
推薦閱讀
史海拾趣
ABB公司是一家全球性的工程技術公司,提供電力和自動化技術解決方案。以下是該公司發展的五個相關故事:
公司成立和早期發展: ABB公司成立于1883年,最初名為“Brown, Boveri & Cie”,總部位于瑞士蘇黎世。公司的創始人是查爾斯·布朗和沃爾夫岡·鮑弗里。在早期,ABB專注于電力系統和電機的研發與制造,為當時的工業革命提供了關鍵的技術支持。
國際化戰略和全球擴張: 隨著技術的進步和市場的變化,ABB積極推動國際化戰略,加速在全球范圍內的擴張。公司通過收購和合并,逐步建立了全球化的生產和銷售網絡。截至2022年,ABB已在100多個國家設有分支機構和辦事處。
技術創新和產品多樣化: ABB一直致力于技術創新,不斷推出新產品和解決方案,以滿足不同行業和領域的需求。公司在電力輸送、工業自動化、機器人技術等方面處于行業領先地位,為客戶提供了全面的電力和自動化解決方案。
可持續發展和環保責任: ABB積極推動可持續發展和環保責任,在產品設計、生產和運營過程中注重減少能源消耗和減排,促進清潔能源的應用和利用。公司致力于推動能源效率和環境保護,為全球可持續發展做出貢獻。
未來展望和發展方向: ABB將繼續致力于技術創新和市場拓展,加強在電力和自動化領域的領先地位。公司將加大在數字化技術和人工智能領域的投入,推動工業智能化和數字化轉型,為客戶提供更智能、更高效的解決方案。
隨著全球對環保和可持續發展的重視,Fox Electronics積極響應行業趨勢,將綠色生產理念融入企業運營中。公司投資引進先進的環保設備和生產工藝,減少生產過程中的廢棄物排放和能源消耗。同時,Fox Electronics還推出了一系列符合RoHS(限制有害物質)指令的產品,滿足市場對環保產品的需求。這些舉措不僅提升了公司的社會責任感,也為其在綠色電子市場贏得了良好的聲譽。
為了進一步擴大市場份額,ECO開始積極尋求國際合作。公司與國際知名電子制造商建立了戰略合作關系,共同研發和推廣新產品。這些合作不僅為ECO帶來了更多的訂單和收入,還提升了公司的國際知名度。同時,ECO還積極參加國際電子展會和論壇,展示公司的技術實力和產品優勢。
酷宅科技自成立以來,一直致力于智能家居技術的研發和應用。2016年,酷宅與榮事達品冠達成戰略協議,共同打造智能家居開放平臺。這一平臺不僅集成了酷宅先進的物聯網應用技術和穩定的云端服務,還整合了榮事達在智能家居領域的豐富經驗和資源。通過合作,雙方共同推動智能家居產業的發展,為消費者提供更加便捷、智能的家居生活體驗。
面對激烈的市場競爭,DSMI Electronics SA公司始終堅持創新驅動的發展戰略。公司投入大量資源進行技術研發和產品創新,不斷推出具有更高性能、更低功耗、更小體積的新產品。這些創新產品不僅滿足了市場的多樣化需求,還引領了行業的技術發展方向。同時,DSMI還積極申請專利保護,保護自己的創新成果。
國盛科技在發展過程中獲得了多項認證與榮譽。例如,公司獲得了知識產權管理體系認證證書,榮登《人民代表報》全國兩會特刊,成為“中國質量萬里行促進會”會員并獲得“收錄企業”榮譽稱號等。這些認證與榮譽的獲得,充分證明了國盛科技在電子行業的領先地位和企業實力的不斷提升。
用tornado時 build沒問題,但download時報錯 程序就是想打印BIOS中的時間:年 原程序如下: #include #include #include #include void biostime() { struct tm ahora; int cYear; sysOutByte(0x70,0x09); ...… 查看全部問答∨ |
|
美國EETimes雜志剛剛發布了2010年全球電子工程師收入調查結果。數據表明,中國的電子工程師收入最低,僅相當于北美同行的16%,然而他們的付出卻是全球最高的。報告稱,工程師得不到休息是全球性問題,尤其是對于中國的工程師而言。中國最近超 ...… 查看全部問答∨ |
C8051F020單片機主要特性 高速流水線結構的8051 兼容的CIP-51 內核可達25MIPS 全速非侵入式的在系統調試接口片內 真正12 位C8051F020 100 ksps 的8 通道ADC 帶PGA和模擬多路開關&nb ...… 查看全部問答∨ |
如果您厭倦于做工程師的枯燥,或者希望尋求新的職場機遇,如果您對自己的文字表達能力有信心,了解主流電子技術概念,并具有一定英文技術資料閱讀能力,您不妨發送簡歷給我們,為您打開全新的職場空間?。ㄅ?...… 查看全部問答∨ |
針對目前采用的簡易氣象綜合觀測儀,存在著實時性差、精度不夠、作業時間長以及不能直接計算射擊條件修正量和地面風修正量等諸多問題,本文提出基于MSP430F149單片機設計一種炮兵氣象儀,以滿足炮兵分隊射擊時的簡易氣象條件和火箭炮地面風修正的 ...… 查看全部問答∨ |
Cyclone V板卡試用報告三 --- 初識Cyclone V PCIe硬核接口 Cyclone V的板卡上有一個PCIE的接口為了試用一下這個接口對PCIe進行了一些學習。 主要參考資料是Cyclone V Hard IP for PCI Express User Guide.pdf在Altera的官方網址都可以下載到。 PDF中主要介紹了Cyclone V系列FPGA的硬核PCIe的配置方法,IP ...… 查看全部問答∨ |
rt 打算實現一個單片機把溫度值顯示 并在另一個單片機上用數碼管顯示 求大神看一下哪里錯了 #include#include#define uchar unsigned char#define uint unsigned intsbit DS=P2^4; uint temp;& ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 納祥科技2W 24位數字功放NX4920,可用于AI語音播報、WIFI播放器
- 常用解調器的定義和工作原理
- 從性能與網絡傳輸出發,講講鐵威馬MAX系列為什么一騎絕塵
- 惠普選中Hailo下一代人工智能加速器,革新零售業與酒店業運營模式
- 跨國商務溝通困局破解之道:時空壺 W4Pro 全場景應用解析
- 從矢量降噪到雙向同傳,時空壺 W4Pro 如何重構 AI 同傳技術標準?
- LoRa+NB-IoT雙模融合,地下車庫信號盲區電梯場景等的冗余通信
- LoRa與UWB的“定位之戰”,成本敏感場景高精度需求的場景切割
- 時空壺X1再升級:引領AI同傳新時代,革新演講翻譯體驗
- ARXML 規則下 ECU 總線通訊與 ADTF 測試方案