STM32——DMA
STM32——DMA
宗旨:技術的學習是有限的,分享的精神是無限的。
? ? ? ? DMA 是為CPU分擔數據轉移的工作。因為DMA的存在CPU才被解放出來,它可以在 DMA 轉移數據的過程中同時進行數據運算、響應中斷,大大提高效率。
1、DMA工作分析
? ? ? ? 數據傳輸的過程中,不需要內核的全程參與,所以內核可以同時進行數據運算。DMA 方式是點到點的數據轉移,而不使用 DMA 方式還要以內核來作為中轉站,顯然 DMA 傳輸方式的效率更高。
? ? ? ? 要使用 DMA,需要確定一系列的控制參數,如外設數據的地址、內存地址、傳輸方向等,在開啟 DMA 傳輸前還要先發出 DMA 請求。
?
2、 初始化DMA?
typedef struct {uint32_t DMA_PeripheralBaseAddr;uint32_t DMA_MemoryBaseAddr;uint32_t DMA_DIR;uint32_t DMA_BufferSize;uint32_t DMA_PeripheralInc;uint32_t DMA_MemoryInc;uint32_t DMA_PeripheralDataSize;uint32_t DMA_MemoryDataSize;uint32_t DMA_Mode;uint32_t DMA_Priority;uint32_t DMA_M2M; } DMA_InitTypeDef;(1)DMA_PeripheralBaseAddr:這個成員保存的是外設數據寄存器的基地址,這個地址作為傳輸的源或目標。DMA 具有地址自增的功能,地址自增功使得可以方便地讀取連續的 數據單元 。現在給這個成員的賦USART1_DR_Base,是一個自定義的宏:
#define USART1_DR_Base 0x40013804【串口外設會自動把數據寄存器中的數據,送入它的移位寄存器,然后由硬件按照串口協議把該數據發送出去。】
(2)DMA_MemoryBaseAddr:保存了內存的基地址,同樣,這個地址可作為傳輸的源或目標。在使用時通常會給這個成員賦值為某個數組的基地址,然后利用 DMA 的地址自增功能把數組一個個地填滿。在本代碼中向這個成員賦值為 SendBuff,這是一個自定義的數組變量名。
(3)DMA_DIR:保存了 DMA 數據傳輸方向,可以選擇是外設到內存還是內存到外設。
(4)DMA_BufferSize:保存了 DMA 要傳輸的數據總大小,其單位為后面結構體成員。
(5)DMA_PeripheralInc/DMA_MemoryInc:分別為外設和內存的地址是否開啟自增功能。
(6)DMA_PeripheralDataSize/ DMA_MemoryDataSize:分別為外設和內存的數據單元大小。可以為字節、半字和字。
(7)DMA_Mode:保存了 DMA 的模式,可以為循環模式或正常模式,循環模式即在傳輸完一輪數據之后再重新傳輸,這種方式很適合 ADC 不斷采集數據的場合。
(8)DMA_Priority:DMA 通道的優先級,總線矩陣根據其 DMA 通道的優先級進行總線協調分配。
(9)DMA_M2M:保存了是否內存到內存的 DMA 傳輸。DMA 傳輸可以在外設與內存、外設與外設以及內存與內存之間進行。
?
// 初始化DMA主要是開啟外設時鐘、填充初始化結構體以及使能外設。 void USART1_DMA_Config(void) {DMA_InitTypeDef DMA_InitStructure;RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /*開啟 DMA 時鐘*/DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /*設置 DMA 源:串口數據寄存器地址*/DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff; /*內存地址(要傳輸的變量的指針)*/DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /*方向:從內存到外設*/DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE; /*傳輸大小DMA_BufferSize=SENDBUFF_SIZE*/DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*外設地址不增*/DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /*內存地址自增*/DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /*外設數據單位*/DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; /*內存數據單位 8bit*/DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /*DMA 模式:不斷循環*/DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; /*優先級:中*/DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /*禁止內存到內存的傳輸 *//*配置 DMA1 的 4 通道 根據 DMA 的請求映像來設置 */DMA_Init(DMA1_Channel4, &DMA_InitStructure);DMA_Cmd (DMA1_Channel4, ENABLE); /*使能 DMA*/ //DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);//配置 DMA 發送完成后產生中斷 }創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的STM32——DMA的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ps使用脚本生成fnt
- 下一篇: 记一次VS2015安装/卸载以及编译给定