stm32中的DMA你搞懂了嗎!!!

2021-09-29 20:01:35 字數 3496 閱讀 1611

一. 對於大容量的stm32晶元有2個dma控制器,控制器1有7個通道,控制器2有5個通道

每個通道都可以配置一些外設的位址。

二. 通道的配置過程:

1. 首先設定cparx暫存器和cmarx暫存器。

通過dma控制器把乙個位址的值複製到另外乙個位址,通過dma控制器自動開啟一條通道完成。

cparx暫存器存放的是外設的位址

cmarx暫存器儲存的是儲存器的位址

2. 設定資料傳輸方向,是否迴圈模式,是不是開啟外設和儲存器的增量模式,還有資料寬度,是8位,16位還是32位。

比如設定成儲存器的位址增量,那麼傳輸乙個資料過去後它的位址自動遞增。

3. 設定要傳輸的資料量

4. 設定通道的優先順序

5. 全部設定好後就可以啟動dma通道。

啟動後資料就開始傳輸,傳輸的過程中可以讀***trx暫存器,可知道當前還剩多少個資料。資料傳輸到一半或全部傳輸完畢後有響應的標誌位置1,如果開啟了中斷,可以進入相應的中斷程式。

一。常用的dma函式

1.dma初始化函式

void dma_deinit(dma_channel_typedef* dmay_channelx); //設定要開啟的通道,還有一些引數,包括外設基位址,儲存器基位址,傳輸的資料量,增量模式,資料寬度等。

2.dma使能函式

void

dma_cmd

(dma_channel_typedef* dmay_channelx, functionalstate newstate)

;

3.開啟相應中斷的函式

void

dma_itconfig

(dma_channel_typedef* dmay_channelx, uint32_t dma_it, functionalstate newstate)

;

4.設定***trx和讀***trx函式

void

dma_setcurrdatacounter

(dma_channel_typedef* dmay_channelx, uint16_t datanumber)

;  uint16_t dma_getcurrdatacounter

(dma_channel_typedef* dmay_channelx)

;

二。常用的外設dma使能函式

需要開啟外設的dma使能才能夠使用dma功能。

這些函式分布在外設各自的標頭檔案中。

三。dma初始化函式

對應下面的**學習:

u16 dma1_mem_len;

//儲存dma每次資料傳送的長度

//dma1的各通道配置

//這裡的傳輸形式是固定的,這點要根據不同的情況來修改

//從儲存器->外設模式/8位資料寬度/儲存器增量模式

//dma_chx:dma通道chx

//cpar:外設位址

//cmar:儲存器位址

//***tr:資料傳輸量

void

mydma_config

(dma_channel_typedef* dma_chx,u32 cpar,u32 cmar,u16 ***tr)

四。dma配置的一般過程

五。實驗

使用串列埠1傳送dma

dma.**件

#ifndef __dma_h

#define __dma_h

#include

"sys.h"

void

mydma_config

(dma_channel_typedef*dma_chx,u32 cpar,u32 cmar,u16 ***tr)

;//配置dma1_chx

void

mydma_enable

(dma_channel_typedef*dma_chx)

;//使能dma1_chx

#endif

dma.c檔案

#include

"dma.h"

dma_inittypedef dma_initstructure;

u16 dma1_mem_len;

//儲存dma每次資料傳送的長度

//dma1的各通道配置

//這裡的傳輸形式是固定的,這點要根據不同的情況來修改

//從儲存器->外設模式/8位資料寬度/儲存器增量模式

//dma_chx:dma通道chx

//cpar:外設位址

//cmar:儲存器位址

//***tr:資料傳輸量

void

mydma_config

(dma_channel_typedef* dma_chx,u32 cpar,u32 cmar,u16 ***tr)

//開啟一次dma傳輸

void

mydma_enable

(dma_channel_typedef*dma_chx)

注:dma每傳輸完成一次,要傳輸的資料量都要自動清零,因此每次開啟都要重新設定要傳輸的資料量。

主程式中:

for

(i=0

;i  

else

}else

//複製text_to_send語句

}

這一段是 在每個字串「alientek warship stm32f1 dma 串列埠實驗」後面新增0x0d和0x0a,也就是自動換行,這樣在串列埠助手中接收到的資料就是alientek warship stm32f1 dma 串列埠實驗,然後自動換行,另外串列埠助手sscom程式有bug,不能自動換行,可以換其他串列埠助手觀察。

資料分享便於後期的學習參考

(dma專題講解)

stm32 如何用dma搬運資料

(stm32串列埠應用)

pwm脈寬調變技術

iOS開發中的這些許可權,你搞懂了嗎?

寫在前面 上述情況在開發過程中是經常遇到的,不同方式的選擇會影響最後使用者互動體驗。這一點感悟正是源於上一周工作遇到的問題 適配ios10,如何獲取應用聯網許可權用以管理系統對話方塊的顯示管理。當我把這個問題解決後,感覺有必要將常用的ios系統許可權做乙個總結,以便後用。許可權分類 聯網許可權 相簿...

實現STM32中USART的DMA

2010年06月29日 星期二 20 56 終於開葷了 dma 先抄一小段dma的說明。對於沒玩過dma 的朋友,這裡簡單說一下dma,用自己的語言說吧,那就是,從某個位置 傳輸資料到某個位置,如果不用dma,那要cpu參與操作,乙個位元組乙個位元組地搬,效率高 點的,就乙個字乙個字地搬.但當你用了...

STM32中DMA的使用入門

今天剛看了乙個adc採集的程式,和之前用其他微控制器寫的程式還是有比較大的差別,這個差別主要就在dma。這裡面總結一下,有一部分是 別人的。什麼是stm32 的dma 其全稱是 direct memory access 根據st 公司提供的相關資訊,dma是 stm32 中乙個獨立與 cortex ...