我們在MCU的嵌入式應用開發(fā)過程中,有時需要做些較大量的數(shù)據(jù)傳輸和適時處理,此時使用DMA的雙緩沖模式可能是個不錯的選擇。這樣既可以保障數(shù)據(jù)的連續(xù)、流暢傳輸,又能保障數(shù)據(jù)的及時處理【包括數(shù)據(jù)更新】,同時又能減輕CPU的負荷。
常有人想使用STM32 DMA的雙緩沖模式,但又覺得實現(xiàn)起來似乎有點困難,也不太容易找到現(xiàn)存的例程。我這里就基于STM32F4芯片及Cube庫簡單地演示下實現(xiàn)過程。
STM32的DMA硬件雙緩沖模式,只支持從外設到內存或從內存到外設兩種應用場景,且工作在循環(huán)模式。內存到內存是不支持雙緩沖模式的,當然它也不支持DMA循環(huán)模式。【下圖截取于STM32F4的參考手冊】
關于STM32 DMA雙緩沖模式實現(xiàn)原理不復雜,這里就不贅述了。下面進入到示例的實現(xiàn)過程。【注:手機模式下圖片可以點擊放大查看】
我這里大致要做的事情就是,ADC模塊對5個模擬通道進行循環(huán)掃描采樣轉換,ADC結果由DMA搬到相應存儲緩沖區(qū)。每一輪傳輸完成后,自動切換傳輸線路并使用另一個存儲區(qū),繼續(xù)新一輪傳輸。兩條傳輸線路就這樣輪流執(zhí)行,不過使用的DMA傳輸流或通道還是同一個。本例中的DMA傳輸流程如下圖示意。至于數(shù)據(jù)搬到各存儲區(qū)后怎么辦,視應用而定,在此不表。
現(xiàn)在開始借助于STM32CubeMx圖形化配置工具做基本的配置并生成初始化文件。
**對ADC做些基本配置。開啟了ADC1的5個通道,做連續(xù)、掃描轉換。ADC轉換的啟動選擇軟件啟動模式。
**對ADC的DMA請求及DMA傳輸做相關配置。具體配置見下圖。
**將其它必需的時鐘、調試口等配置完成后即可生成初始化代碼并建立工程。
**在CubeMx生成的初始化代碼基礎上,添加用戶代碼。
一、這里準備了兩個數(shù)組用來存儲ADC的轉換結果。
二、我基于STM32F4系列芯片和STM32CubeF4 HAL庫組織和添加用戶代碼。代碼內容詳見下圖。
上圖中A、B、C、D四部分是我基于當前應用而添加的用戶代碼,在此稍作解釋。
代碼A,使能ADC外設并稍作延時,令其穩(wěn)定下來。
代碼B,準備了幾個跟DMA傳輸完成及出錯有關的回調函數(shù)。三個回調函數(shù)我共用一個,這里圖省事了。實際應用時請具體調整。
代碼C,調用DMA雙緩沖模式的關鍵函數(shù)。
代碼D,使能ADC事件的DMA請求功能并軟件啟動AD轉換。
三、編譯、除錯后,運行看結果。下面截圖是我在調試過程中隨意截取的。ADC的輸入通道中有2個通道分別固定接GND和VDD,其它3個通道的輸入管腳懸空,數(shù)據(jù)波動大屬正常現(xiàn)象。
到此,基于STM32DMA雙緩沖的功能演示就結束了。是不是感覺很方便而簡單呢?
個人認為,要實現(xiàn)上面功能盡量看懂相關庫函數(shù)的基本功能,并對相應外設的工作有基本的了解,畢竟還是需要自行組織部分代碼的。如果說只知生硬地調用現(xiàn)有庫函數(shù),那實現(xiàn)起來還是有困難。
另外,即使調用庫函數(shù),在給函數(shù)的參變量賦值時注意別給錯了。大部分類似問題編譯器能發(fā)現(xiàn),有些是發(fā)現(xiàn)不了的。比方源地址和目標地址編譯器是辨別不了的。
還有,基于庫函數(shù)編程時,如果庫函數(shù)里已經(jīng)就某些變量或參數(shù)給出了定義或規(guī)劃,就盡量用它準備的,除非你發(fā)現(xiàn)相關定義或規(guī)劃不合理或有錯。前不久一個STM32用戶,在初始化RTC日歷時給星期賦予了一個不正確的值導致RTC的時間運行異常。本來庫代碼已經(jīng)對從星期日到星期六明確地做了宏定義供我們使用【這樣做本身就可以一定程度防止出錯】,結果他在調試時直接賦數(shù)據(jù),不小心給了不合理的數(shù)據(jù)沒及時發(fā)現(xiàn),導致程序異常。然后反饋說庫代碼有bug。算bug嗎?可以算是也可以不是。如果初始化時按照人家預備好的宏參數(shù)來賦值就不會在這個地方折騰一把。
責任編輯:pj
-
芯片
+關注
關注
459文章
52454瀏覽量
440004 -
代碼
+關注
關注
30文章
4899瀏覽量
70598
發(fā)布評論請先 登錄
stm32f4新手求教
STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊
STM32開發(fā)入門進階必備!《STM32嵌入式系統(tǒng)開發(fā)—基于STM32CubeMX和HAL庫》新書發(fā)布!

Arduino中可以使用STM32F1或者STM32F4系列芯片的內置看門狗嗎?
使用STM32F4的ADC的時候,發(fā)現(xiàn)測量結果不準確,是什么原因導致的?
stm32f4 sdio時鐘如何獲取通過什么函數(shù)?
STM32CubeMX生成的代碼,是怎樣的HAL架構?

HAL庫在STM32開發(fā)中的重要性
STM32項目實戰(zhàn):基于STM32F4的智能燈光控制系統(tǒng)(LVGL),附項目教程/源碼

STM32F4 HAL庫下CAN發(fā)送導致FLASH報錯怎么解決?
【GD32 MCU 移植教程】8、從 STM32F4xx 系列移植到 GD32F4xx 系

課程上線 | STM32單片機入門教程(1)基于HAL庫的多核心開發(fā)(F1/F4/G0/U5)

評論