一. 對於大容量的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 ...