STM32F10x 串列埠使用DMA

2022-09-18 14:57:24 字數 2206 閱讀 5657

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...