dma(direct memory access,直接儲存器訪問) 是所有現代電腦的重要特色,它允許不同速度的硬體裝置來溝通,而不需要依賴於 cpu 的大量中斷負載。否則,cpu 需要從**把每一片段的資料複製到暫存器,然後把它們再次寫回到新的地方。在這個時間中,cpu 對於其他的工作來說就無法使用。
dma 傳輸將資料從乙個位址空間複製到另外乙個位址空間。當cpu 初始化這個傳輸動作,傳輸動作本身是由 dma 控制器來實行和完成。
在實現dma傳輸時,是由dma控制器直接掌管匯流排,因此,存在著乙個匯流排控制權轉移問題。即dma傳輸前,cpu要把匯流排控制權交給dma控制器,而在結束dma傳輸後,dma控制器應立即把匯流排控制權再交回給cpu。乙個完整的dma傳輸過程必須經過dma請求、dma響應、dma傳輸、dma結束4個步驟。
傳輸的四種情況:
dma主要特徵
dma框圖
dma硬體優先順序
各個通道的dma
初始化結構體
typedef struct
dma_inittypedef;
配置dma
void mydma_config(dma_channel_typedef* dma_chx, u32 peripheral_base)
注意:需要注意的是以下幾點
串列埠通過dma傳送資料,具體原始碼如下所示:
main.c檔案
#include "stm32f10x.h"
#include "usart1.h"
uint8_t buff = "stm32f10x dma 串列埠實驗";
/*************** 延時函式 *******************/
void delay(__io u32 ncount)
int main(void)
}
usart.c檔案
#include "usart1.h"
#include #include "stm32f10x_dma.h"
#include "string.h"
dma_inittypedef dma_initstructure;
dma_channel_typedef* dma_chxx;
#define send_buf_size 1024 //傳送資料長度
uint8_t sendbuff[send_buf_size]; //傳送資料緩衝區
// 初始化usart1
void usart1_config(void)
void mydma_config(dma_channel_typedef* dma_chx, u32 peripheral_base)
uint16_t mydma_enable(uint8_t* buff, uint16_t size)
data_size = (size > send_buf_size ? send_buf_size:size);
if (!buff)
memcpy(sendbuff, buff, data_size);
dma_cmd(dma_chxx, disable ); //關閉usart1 tx dma1 所指示的通道
dma_chxx->***tr = data_size;// 設定傳送長度
dma_cmd(dma_chxx, enable); //使能usart1 tx dma1 所指示的通道
return 0;
}
stm32 dma工作原理:
stm32之dma原理:
STM32F10x系列 中斷
概念問題 中斷與事件有什麼聯絡與區別?stm32之中斷與事件 中斷與事件的區別 簡單概括下。中斷 cpu單執行緒情況下只能處理單一任務,在有零時任務需要處理時,可以暫時放下當前任務,優先處理零時任務,再回過來處理之前的任務。多個中斷可以進行巢狀,比如產生了多個零時任務,那麼就可以按照優先順序處理這多...
STM32串列埠通訊 針對stm32f10x
並行通訊 資料各個位同時傳輸,速度快,占用引腳資源多 序列通訊 資料按位順序傳輸,占用引腳資源少,速度相對比較慢 1.按照資料傳送方向可以分為 單工 資料傳輸只支援在乙個方向上傳輸。半雙工 允許資料在兩個方向上傳輸,但是在某一時刻只允許資料在乙個方向上傳輸。全雙工 允許資料同時在兩個方向上傳輸。2....
STM32F10X入門 流水燈
2019 3 16 2019 3 19 core cm32.c stdin.h中定義了字元型 stm32f10x.h stm32f10x conf.h中定義了引用的外設標頭檔案 庫檔案之間的依賴呼叫關係 pngstm32f10x.h檢視位址對映 比如define gpioa base apb2per...