dma(direct memory access),直接儲存器訪問。dma傳輸方式無需cpu直接控制傳輸,通過硬體為ram與i/o裝置開闢一條直接傳送資料的通路,使cpu效率大大提高。stm32f103有2個dma控制器,dma1有7個通道,dma2有5個通道,專門用來管理來自外設對儲存器的訪問請求,還有乙個仲裁器來協調各個dma請求的優先權。
一:dma各通道請求
從外設產生的dma請求通過邏輯"或"輸入到dma控制器,這就意味著同時只能有乙個請求有效。
例如,串列埠1傳送的dma,就要用到dma1的通道4(也就是說通道與各通訊口是相互對應的)
參考手冊
二.dma1通道4(串列埠1傳送)配置步驟
①設定外設位址
dma通道x外設位址暫存器(dma_cparx)(x = 1…7)
或 dma_chx->cpar=&usart1_dr;
②設定儲存器位址
儲存器位址通過dma1_cmar設定
③設定傳輸資料量
dma通道x傳輸數量暫存器(dma_***trx)(x = 1…7)
eg:dma_chx->***tr=***tr; //dma1,傳輸資料量
④設定通道4的配置資訊
若有多個通道,則要設定優先順序,編號越小優先順序越高。
dma通道x配置暫存器(dma_ccrx)(x = 1…7)
⑤使能dma1通道4,啟動傳輸
dmax_ccrx 最低位開啟dma傳輸。
注意要設定usart1的使能dma傳輸位,通過usart1->cr3的第七位設定,這樣就可以啟動一次usart1的dma傳輸了。
⑥dma中斷狀態顯示及清除
dma中斷狀態暫存器(dma_isr)
dma中斷標誌清除暫存器(dma_ifcr)
eg:if(dma1->isr&(1<<13))//等待通道4傳輸完成
三:示例程式
dma1通道4(串列埠1傳送)應用
1 u16 dma1_mem_len;//儲存
dma每次資料傳送的長度
2 //dma1的各通道配置
3 //這裡的傳輸形式是固定的
,這點要根據不同的情況來修改
4 //從儲存器
->
外設模式
/8位資料寬度
/儲存器增量模式
5 //dma_chx:dma通道
chx6 //cpar:外設位址
7 //cmar:儲存器位址
8 //***tr:資料傳輸量
9 void mydma_config(dma_channel_typedef*dma_chx,u32 cpar,u32 cmar,u16 ***tr)
10
27 //開啟一次
dma傳輸
28 void mydma_enable(dma_channel_typedef*dma_chx)
29
STM32學習 SPI筆記 暫存器版
1.介紹 2.模擬spi 3.硬體spi 一 介紹簡述 1 通常 spi 通訊要求 4 根線,分別是 mosi 主機輸出從機輸入 miso 主機輸入從機輸出 clk 時鐘線 cs 片選線 2 當傳送和接受資料的工作都準備好了,只要有時鐘 clk,就傳送資料,沒有時鐘就不傳送,而且乙個時鐘週期傳送一位...
STM32蜂鳴器 暫存器
這次實驗犯了個笑話,竟然在巨集定義後面加分號.就像這樣 define 大家千萬不要學我,結果報錯expected expression,還苦惱半天,想為啥操作不了暫存器了?我真愚蠢!剛開始我也不會寫這些東西,其實摸清套路就好,rcc時鐘使能 gpio初始化 相關暫存器初始化 延時函式 串列埠等初始化...
STM32暫存器對映
1.對映即將記憶體的某段位址與某一暫存器對應,微控制器對函式的操作底層是操作暫存器,而暫存器最終是操作記憶體上對應的單元,2.各個暫存器對應的位址都是在st定義的起始位址上層層偏移得到 3.想要實現某功能可直接對此段記憶體寫進相應的值,即可賦予某一功能 4.stm32底層實際是先定義出外設基位址,然...