1. 程式人生 > >STM32之DMA

STM32之DMA

DMA,全稱為:Direct Memory Access,即直接儲存器訪問,DMA 傳輸將資料從一個
地址空間複製到另外一個地址空間。當 CPU 初始化這個傳輸動作,傳輸動作本身是由
DMA 控制器 來實行和完成。典型的例子就是移動一個外部記憶體的區塊到晶片內部更快的
記憶體區。像是這樣的操作並沒有讓處理器工作拖延,反而可以被重新排程去處理其他的工
作。

STM32 的 DMA 有以下一些特性:

●每個通道都直接連線專用的硬體 DMA 請求,每個通道都同樣支援軟體觸發。這些功能
通過軟體來配置。
●在七個請求間的優先權可以通過軟體程式設計設定(共有四級:很高、高、中等和低),假如
在相等優先權時由硬體決定(請求 0 優先於請求 1,依此類推) 。
●獨立的源和目標資料區的傳輸寬度(位元組、半字、全字),模擬打包和拆包的過程。源和
目標地址必須按資料傳輸寬度對齊。
●支援迴圈的緩衝器管理
●每個通道都有 3 個事件標誌(DMA 半傳輸,DMA 傳輸完成和 DMA 傳輸出錯),這 3 個
事件標誌邏輯或成為一個單獨的中斷請求。
●儲存器和儲存器間的傳輸
●外設和儲存器,儲存器和外設的傳輸
●快閃記憶體、SRAM、外設的 SRAM、APB1 APB2 和 AHB 外設均可作為訪問的源和目標。
●可程式設計的資料傳輸數目:最大為 65536

DMA 通道配置引數種類比較繁多,包括記憶體地址,外設地址,傳輸資料長度,
資料寬度,通道優先順序等等。這些引數的配置在庫函式中都是在函式 DMA_Init 中完成

1.第一個引數 DMA_PeripheralBaseAddr 用來設定 DMA 傳輸的外設基地址,比如要進行串列埠
DMA 傳輸,那麼外設基地址為串列埠接受傳送資料儲存器 USART1->DR 的地址,表示方法為
&USART1->DR。
2.第二個引數DMA_MemoryBaseAddr為記憶體基地址,也就是我們存放DMA傳輸資料的記憶體地址。
3.第三個引數 DMA_DIR 設定資料傳輸方向,決定是從外設讀取資料到記憶體還送從記憶體讀取數
據傳送到外設,也就是外設是源地還是目的地,這裡我們設定為從記憶體讀取資料傳送到串列埠,
所以外設自然就是目的地了,所以選擇值為 DMA_DIR_PeripheralDST。
4.第四個引數 DMA_BufferSize 設定一次傳輸資料量的大小,這個很容易理解。
5.第五個引數 DMA_PeripheralInc 設定傳輸資料的時候外設地址是不變還是遞增。如果設定
為遞增,那麼下一次傳輸的時候地址加 1,這裡因為我們是一直往固定外設地址&USART1->DR
傳送資料,所以地址不遞增,值為 DMA_PeripheralInc_Disable;
6.第六個引數 DMA_MemoryInc 設定傳輸資料時候記憶體地址是否遞增。這個引數和
DMA_PeripheralInc 意思接近,只不過針對的是記憶體。這裡我們的場景是將記憶體中連續儲存單
元的資料傳送到串列埠,毫無疑問記憶體地址是需要遞增的,所以值為 DMA_MemoryInc_Enable。
7.第七個引數 DMA_PeripheralDataSize 用來設定外設的資料長度是為位元組傳輸(8bits),半
字傳輸(16bits) 還是字傳輸(32bits) ,這裡我們是 8 位位元組傳輸,所以 值設定為
DMA_PeripheralDataSize_Byte。
8.第八個引數 DMA_MemoryDataSize 是用來設定記憶體的資料長度,和第七個引數意思接近,這
裡我們同樣設定為位元組傳輸 DMA_MemoryDataSize_Byte。

9.第九個引數 DMA_Mode 用來設定 DMA 模式是否迴圈採集,也就是說,比如我們要從記憶體中採
集 64 個位元組傳送到串列埠,如果設定為重複採集,那麼它會在 64 個位元組採集完成之後繼續從內
存的第一個地址採集,如此迴圈。這裡我們設定為一次連續採集完成之後不迴圈。所以設定值
為 DMA_Mode_Normal。在我們下面的實驗中,如果設定此引數為迴圈採集,那麼你會看到串列埠
不停的列印資料,不會中斷,大家在實驗中可以修改這個引數測試一下。
10.第十個引數是設定 DMA 通道的優先順序,有低,中,高,超高三種模式,這個在前面講解過,
這裡我們設定優先級別為中級,所以值為 DMA_Priority_Medium。如果要開啟多個通道,那麼
這個值就非常有意義。
11.第十一個引數 DMA_M2M 設定是否是儲存器到儲存器模式傳輸,這裡我們選擇
DMA_M2M_Disable。

相關推薦

STM32DMA:

typedef struct{ __IO uint32_t CCR; //復位 __IO uint32_t CNDTR; //傳輸的資料量 __IO uint32_t CPAR; //外設地址 __IO uint32_t CMAR; //儲存器地址} DMA_Channel_TypeDef; 用二維陣列做D

STM32DMA

DMA,全稱為:Direct Memory Access,即直接儲存器訪問,DMA 傳輸將資料從一個 地址空間複製到另外一個地址空間。當 CPU 初始化這個傳輸動作,傳輸動作本身是由 DMA 控制器 來實行和完成。典型的例子就是移動一個外部記憶體的區塊到晶片內部更快的 記憶體

stm32TIM+ADC+DMA采集50HZ交流信號

eba bsp 軟件 tco 輸入 工作方式 int32 rest ext http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b563

STM32內部3個ADC+2個DMA同時採集14路訊號

微控制器晶片:STM32F103VET6 首先要保證晶片內部有3個ADC和2個DMA。 採用微控制器內嵌的3個12位的ADC以及2個DMA對14路電壓進行測量讀取。其中,使用ADC1的4個通道,使用ADC2的4個通道,ADC1和ADC2共用DMA1,高16位為ADC2的資料

STM32ADC_2(DMA例項)

例項分析:(採用DMA模式) mian函式: extern __IO u16 ADC_ConvertedValue;//ADC轉換的電壓值,是在ADC1_Init()所屬的文字中定義的 float ADC_ConvertedValueLocal;//用來儲

STM32硬體IICDMA傳輸資料

這裡給出一個實現用DMA傳輸IIC資料的實現過程 這裡咱們說3個點 1.檢查IIC總線上是否有指定地址的器件 2.IIC讀取資料 3.IIC寫資料 下面來一個一個詳細說明 1.檢查IIC總

STM32SPI從機DMA例程

#include "stm32f10x.h" /* RCC時鐘配置 */ void RCC_config(void) { ErrorStatus HSEStartUpStatus;/* RCC暫存器設定為預設配置 */RCC_DeInit();/* 開啟外部高速時鐘 */R

STM32ADC例項(基於DMA方式)

ADC簡介:     ADC(Analog-to-Digital Converter,模/ 數轉換器)。也就是將模擬訊號轉換為數字訊號進行處理,在儲存或傳輸時,模數轉換器幾乎必不可少。    STM32在片上整合的ADC外設非常強大,我使用的奮鬥開發板是STM32F103V

STM32DMA例項串列埠(USART)通訊

硬體平臺:stm32f10xZET6開發環境:keil MDK uVision v4.10開發語言:C、ST_lib_3.5韌體庫/* 程式碼演示 main.c */ #include "stm32f10x.h" #include "bsp_usart1.h" #inclu

stm32IIC通信協議

art code strong typedef col 上傳 bps eight 系統結構 1 //3?ê??ˉIIC 2 void IIC_Init(void) 3 { 4 GPIO_InitTy

stm32時鐘控制

完成 有時 時序 容易 .cn spa 總線 可選 依靠 本文提到的有以下內容: 時鐘系統與總線矩陣 SysTick系統定時器 RTC實時時鐘 看門狗定時器 通用定時器 一、時鐘系統與總線矩陣   stm32F4的時鐘樹如下圖所示:   在STM32中,有五個時鐘

stm32RCC寄存器學習

http enc cloc con set 影響 llc 控制 scl RCC(Reset Clock Controller) —— 復位與時鐘控制 一、復位 STM32F10xxx支持三種復位形式,分別為系統復位、上電復位和備份區域復位。 系統復位:除了時鐘控制器的RC

STM32獨立版USB(Host)驅動+MSC+Fatfs移植

stm32 details lan usb log net 說明 HR tails 源:STM32之獨立版USB(Host)驅動+MSC+Fatfs移植 STM32之USB驅動庫詳解(架構+文件+函數+使用說明+示例程序)STM32之獨立版USB(Host)驅動+M

STM32USART1串口:藍牙接收字符控制LED亮滅

字長 謝謝 rate 退出 下載 bit ref 提取 功能 基礎的就不講了,直接上配置文件,led.c led.h usart.c usart.h stm32f10x_it.c 延時函數這些都自己寫吧,網上搜索一大把,本次用到的藍牙模塊為 不知什麽系列,具體見

STM32 線上升級(IAP)超詳細圖解 及 常見問題解決

IAP 是啥   IAP( In Application Programming)即在應用程式設計,也就是使用者可以使用自己的程式對MCU的中的執行程式進行更新,而無需藉助於外部燒寫器。其實ST官網也給出了IAP的示例程式,感興趣的可以直接去官網搜尋。   這裡有一點需要特殊注意,就

STM32獨立看門狗與視窗看門狗總結

一、獨立看門狗 STM32 的獨立看門狗由內部專門的 40Khz 低速時鐘驅動,即使主時鐘發生故障,它也仍然有效。 看門狗的原理:微控制器系統在外界的干擾下會出現程式跑飛的現象導致出現死迴圈,看門狗電路就是為了避免這種情況的發生。看門狗的作用就是在一定時間內(通

WS2812燈珠(二)-- STM32 SPI+DMA方式驅動

    通過硬體SPI的可以很巧妙的模擬出WS2812的通訊時序,用spi的8位資料模擬ws281x的一位資料。 要將系統時鐘設定為56M,SPI分頻數設定為8,則SPI的通訊頻率為7M,1s/7M≈143ns 即傳輸一位資料的時間約為143納秒(ns)  3*14

STM32通過DMA採集多通道AD

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

STM32GPIO篇

//file :GPIO.h #include"stm32f10x.h" #include"misc.h" /* GPIO使用基本步驟 1、開啟相對應的GPIO時鐘 2、配置引腳模式 3、初始化相對應的引腳 4、通過庫函式操作引腳 */ void Gpio_Output

STM32option bytes踩坑記錄

最近在做一個stm32專案,用的盜版jlink除錯,突然某次下完程式,stm32竟然開始無限重啟了,量了一下復位腳,發現有周期性的重啟脈衝輸出,一開始我以為是硬體壞了,重新焊了一套硬體,發現新焊的是好的,但是原來那塊板子,檢查來檢查去感覺也不像是硬體和程式的問題。 後來我查了一些資料,想到去檢查