日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32——DMA

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;

1DMA_PeripheralBaseAddr這個成員保存的是外設數據寄存器的基地址,這個地址作為傳輸的源或目標。DMA 具有地址自增的功能,地址自增功使得可以方便地讀取連續的 數據單元 。現在給這個成員的賦USART1_DR_Base,是一個自定義的宏:

#define USART1_DR_Base 0x40013804【串口外設會自動把數據寄存器中的數據,送入它的移位寄存器,然后由硬件按照串口協議把該數據發送出去。】

2DMA_MemoryBaseAddr保存了內存的基地址,同樣,這個地址可作為傳輸的源或目標。在使用時通常會給這個成員賦值為某個數組的基地址,然后利用 DMA 的地址自增功能把數組一個個地填滿。在本代碼中向這個成員賦值為 SendBuff,這是一個自定義的數組變量名。

3DMA_DIR保存了 DMA 數據傳輸方向,可以選擇是外設到內存還是內存到外設。

4DMA_BufferSize保存了 DMA 要傳輸的數據總大小,其單位為后面結構體成員。

5DMA_PeripheralInc/DMA_MemoryInc分別為外設和內存的地址是否開啟自增功能。

6DMA_PeripheralDataSize/ DMA_MemoryDataSize分別為外設和內存的數據單元大小。可以為字節、半字和字。

7DMA_Mode保存了 DMA 的模式,可以為循環模式或正常模式,循環模式即在傳輸完一輪數據之后再重新傳輸,這種方式很適合 ADC 不斷采集數據的場合。

8DMA_PriorityDMA 通道的優先級,總線矩陣根據其 DMA 通道的優先級進行總線協調分配。

9DMA_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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。