有人使用STM32H7芯片做些事情,發(fā)現(xiàn)基于ST公司的HAL庫開發(fā)UART1的DMA收發(fā)時可以輕松實現(xiàn),而當(dāng)使用ST的LL庫組織代碼時,卻沒法實現(xiàn)UART的DMA傳輸。
感覺上就是使用HAL庫編寫代碼功能正常而基于LL庫則不行。真是這樣嗎?
使用STM32CubeMx進(jìn)行圖形化配置,并生成基于HAL庫的初始代碼,要實現(xiàn)UART收發(fā)功能的DMA傳輸?shù)脑挘税才藕玫氖瞻l(fā)緩沖內(nèi)存外,再就只需調(diào)用下面兩個HAL庫的API函數(shù)即可進(jìn)行功能驗證。
從功能實現(xiàn)上講,使用HAL庫及相應(yīng)API還是很方便、很簡單的。每個API函數(shù)就像個黑盒子,對于里面的內(nèi)容,如果你不點(diǎn)進(jìn)去閱讀是不會知曉的。
不過,建議盡可能地多點(diǎn)進(jìn)去瞧瞧,那里往往別有洞天。
如果基于LL庫來組織代碼的話,先使用STM32CubeMx進(jìn)行配置并生成基于LL庫的初始化代碼。
基于CubeMx配置完畢后生成初始化工程,準(zhǔn)備收發(fā)緩沖內(nèi)存,然后添加用戶代碼。
剛開始用戶代碼是這樣編寫安排的。見下面代碼截圖。
上圖中A處代碼的作用就是開啟兩個DMA stream的功能,即對相關(guān)DMA Stream的控制寄存器的使能位進(jìn)行使能置1。
編譯無錯后運(yùn)行代碼,可是根本沒有數(shù)據(jù)的收發(fā)動作發(fā)生。看來,跟反饋者的癥狀一樣。
沒辦法,硬著頭皮核查代碼。除了核查我添加的用戶代碼外,還核查UART及DMA的初始化代碼。看來看去,似乎該有的都有了,該寫的都寫了。
后來,根據(jù)代碼里涉及到的寄存器去跟STM32H7手冊里寄存器做比較閱讀。
在查看DMA各個stream配置控制寄存器【DMA_SxCR】內(nèi)容時,突然發(fā)現(xiàn)并想起了點(diǎn)什么。
其實也是之前在別的DMA應(yīng)用場合也碰到過的類似問題。
下面為該寄存器的內(nèi)容布局截圖。
隱約記得,該DMA Stream或Channel的控制使能位為0時才能做DMA相關(guān)其它參數(shù)的配置的。
我們可以在手冊里找到針對該位的明確描述:
這里的意思是說,要想讓某DMA stream工作,必須令該EN位為1。
不過,當(dāng)該EN位為1時時,是不允許對DMA及相應(yīng)FIFO寄存器做配置的。
換言之,若要針對某Stream做DMA相關(guān)配置,得先讓該控制寄存器的EN位保持為0狀態(tài)。
而在我的用戶代碼里,對EN位寫1操作則放在了對DMA做各種配置的前面,即上面代碼截圖的A處。
既然這樣,我們把對DMA控制寄存器EN位的置1操作放在其它DMA相關(guān)配置之后就應(yīng)該可以了,即從上面代碼截圖中的A處拉到B處。
然后,進(jìn)行測試,結(jié)果果真正常了。
其實就是一個配置代碼順序問題,卡了半天。
如果不是用LL庫而是用HAL庫可能就不太容易碰到這個問題。前面說過了,基于HAL庫的API函數(shù)像個黑盒子,它幫我們處理了很多細(xì)節(jié)性、判斷性的東西。
基于LL庫組織的代碼,相比HAL庫組織的代碼,代碼精簡、流程清晰、運(yùn)行高效。不過,使用LL庫做開發(fā)需要開發(fā)者對芯片各個模塊的工作原理,操作流程有更清晰、更精準(zhǔn)的了解,同時往往還需要開發(fā)者對應(yīng)用相關(guān)的寄存器有更細(xì)致、深入的把握。
而HAL庫往往事先幫我們充分考慮到了基于硬件需求的操作流程、時序,基于軟件層面的諸多事件及狀態(tài)的互斥管理,以及不同STM32系列的代碼兼容性,并做了很好、很全面的封裝。
所以我們在利用HAL庫來實現(xiàn)相應(yīng)功能時,往往無須對操作流程、時序以及寄存器本身做過多的了解就可以完成。
從開發(fā)角度講,利用HAL庫往往比利用LL庫能更快地完成任務(wù),同時基于HAL庫的代碼也有更好的移植性,代價就是代碼相對LL庫要龐大些。
對應(yīng)STM32開發(fā)者而言,即使基于HAL庫開發(fā)了一些STM32項目,對于芯片的諸多功能細(xì)節(jié)以及寄存器的了解往往可能比較有限。當(dāng)然,這點(diǎn)因人而異吧,不可說死。
對于HAL庫和LL庫的選用,我們每個人可以根據(jù)自身情況來。比方,對芯片軟硬件不熟悉時、任務(wù)緊急時先使用HAL庫,等對芯片及庫函數(shù)熟悉、任務(wù)不緊急時可以切換到LL庫。
或者說,只是做些功能性驗證確認(rèn),使用HAL庫組織代碼也是非常快捷方便的。
當(dāng)然,一個工程里HAL庫、LL庫是可以同時并存的。另外,當(dāng)我們對芯片寄存器、內(nèi)核指令系統(tǒng)足夠熟悉時,甚至可以嘗試使用匯編語言做MCU編程開發(fā)。
作為開發(fā)人員,基于HAL庫組織代碼和基于匯編指令組織代碼實現(xiàn)相同功能時,對我們自身的挑戰(zhàn)及相應(yīng)的收獲是不可同日而語的。
審核編輯:劉清
-
dma
+關(guān)注
關(guān)注
3文章
569瀏覽量
102090 -
HAL庫
+關(guān)注
關(guān)注
1文章
121瀏覽量
6674 -
stm32h7
+關(guān)注
關(guān)注
0文章
37瀏覽量
1753
原文標(biāo)題:STM32 DMA編程時的一個應(yīng)用小提醒
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
求助,關(guān)于HAL庫的HAL_UART_Receive使用問題求解
如何使用HAL庫實現(xiàn)不定長UART數(shù)據(jù)包的DMA接收?
stm32f103 + HAL庫 + UART + DMA + UCOS III數(shù)據(jù)發(fā)送問題
STM32 HAL使用帶DMA的ADC會影響UART傳輸
STM32 HAL UART發(fā)送DMA問題
請問HAL_UART_Receive_DMA 和 HAL_UART_Transmit_DMA怎么用
stm32f103+HAL庫+UART+DMA+UCOS III數(shù)據(jù)發(fā)送沒有進(jìn)入UART_TX_DMA中斷服務(wù)函數(shù)
HAL庫SPI DMA的使用問題
stm32 HAL庫實現(xiàn)UART的不定長數(shù)據(jù)DMA接收的方法
在STM32H753ZI上使用DMA和UART獲取HAL_DMA_ERROR_TE出現(xiàn)傳輸錯誤怎么解決?
HAL_UART_Transmit_DMA傳輸問題求解
HAL_UART_Receive_DMA 隨機(jī)停止工作怎么處理?
FreeRTOS中的HAL_UART_Transmit_DMA問題如何處理?
STM32 HAL庫 UART 串口讀寫功能筆記

評論