STM32-DMA學習筆記
STM32中 DMA1有7個通道,DMA2有5個通道(DMA2 僅存在大容量產(chǎn)品中)。DMA掛載的時鐘為AHB總線,其時鐘為72Mhz,所以可以實現(xiàn)高速數(shù)據(jù)搬運。
STM32F103RBT6 只有1 個DMA控制器,DMA1 ,下面我們就針對DMA1 進行介紹。
從外設(shè)(TIMx、ADC、SPIx 、I2Cx 和USARTx )產(chǎn)生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時只能有一個請求有效。外設(shè)的DMA請求,可以通過設(shè)置相應(yīng)的外設(shè)寄存器中的控制位,被獨立地開啟或關(guān)閉。
STM32F103RBT6 只有1 個DMA控制器,DMA1 ,下面我們就針對DMA1 進行介紹。
從外設(shè)(TIMx、ADC、SPIx 、I2Cx 和USARTx )產(chǎn)生的DMA請求,通過邏輯或輸入到DMA控制器,這就意味著同時只能有一個請求有效。外設(shè)的DMA請求,可以通過設(shè)置相應(yīng)的外設(shè)寄存器中的控制位,被獨立地開啟或關(guān)閉。
DMA1各通道一覽:
這里我們要使用的是串口 1 的 DMA 傳送,也就是要用到通道 4。
DMA1通道4的配置方法如下:
dma.c主要代碼:
[cpp]view plaincopy
- u16DMA1_MEM_LEN;//保存DMA每次數(shù)據(jù)傳送的長度
- //DMA1的各通道配置
- //這里的傳輸形式是固定的,這點要根據(jù)不同的情況來修改
- //從存儲器->外設(shè)模式/8位數(shù)據(jù)寬度/存儲器增量模式
- //DMA_CHx:DMA通道CHx
- //cpar:外設(shè)地址
- //cmar:存儲器地址
- //cndtr:數(shù)據(jù)傳輸量
- voidMYDMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32cpar,u32cmar,u16cndtr)
- {
- RCC->AHBENR|=1<<0;//開啟DMA1時鐘
- delay_ms(1);//等待DMA時鐘穩(wěn)定
- DMA_CHx->CPAR=cpar;//DMA1外設(shè)地址
- DMA_CHx->CMAR=(u32)cmar;//DMA1,存儲器地址
- DMA1_MEM_LEN=cndtr;//保存DMA傳輸數(shù)據(jù)量
- DMA_CHx->CNDTR=cndtr;//DMA1,傳輸數(shù)據(jù)量
- DMA_CHx->CCR=0X00000000;//復位
- DMA_CHx->CCR|=1<<4;//從存儲器讀
- DMA_CHx->CCR|=0<<5;//普通模式
- DMA_CHx->CCR|=0<<6;//外設(shè)地址非增量模式
- DMA_CHx->CCR|=1<<7;//存儲器增量模式
- DMA_CHx->CCR|=0<<8;//外設(shè)數(shù)據(jù)寬度為8位
- DMA_CHx->CCR|=0<<10;//存儲器數(shù)據(jù)寬度8位
- DMA_CHx->CCR|=1<<12;//中等優(yōu)先級
- DMA_CHx->CCR|=0<<14;//非存儲器到存儲器模式
- }
- //開啟一次DMA傳輸
- voidMYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)
- {
- DMA_CHx->CCR&=~(1<<0);//關(guān)閉DMA傳輸
- DMA_CHx->CNDTR=DMA1_MEM_LEN;//DMA1,傳輸數(shù)據(jù)量
- DMA_CHx->CCR|=1<<0;//開啟DMA傳輸
- }
}
在主函數(shù)里主要有這幾個語句完成DMA傳輸:
1.首先配置DMA1通道4相關(guān)參數(shù)
MYDMA_Config(DMA1_Channel4,(u32)&USART1->DR,(u32)SendBuff,5200);//DMA1通道4,外設(shè)為串口1,存儲器為SendBuff,長度5200.
2.然后將待發(fā)送內(nèi)容裝入存儲器
SendBuff[i]=TEXT_TO_SEND[t];
3.然后開啟一次DMA傳輸
MYDMA_Enable(DMA1_Channel4);//開始一次DMA傳輸!
4.監(jiān)控傳送進度。
pro=DMA1_Channel4->CNDTR;//得到當前還剩余多少個數(shù)據(jù)
評論