女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

HAL庫無法實現UART的DMA傳輸真是這樣嗎?

茶話MCU ? 來源:茶話MCU ? 2023-01-08 11:16 ? 次閱讀

有人使用STM32H7芯片做些事情,發現基于ST公司的HAL庫開發UART1的DMA收發時可以輕松實現,而當使用ST的LL庫組織代碼時,卻沒法實現UART的DMA傳輸。

感覺上就是使用HAL庫編寫代碼功能正常而基于LL庫則不行。真是這樣嗎?

使用STM32CubeMx進行圖形化配置,并生成基于HAL庫的初始代碼,要實現UART收發功能的DMA傳輸的話,除了安排好的收發緩沖內存外,再就只需調用下面兩個HAL庫的API函數即可進行功能驗證。

a21e7c38-8e71-11ed-bfe3-dac502259ad0.png

從功能實現上講,使用HAL庫及相應API還是很方便、很簡單的。每個API函數就像個黑盒子,對于里面的內容,如果你不點進去閱讀是不會知曉的。

不過,建議盡可能地多點進去瞧瞧,那里往往別有洞天。

如果基于LL庫來組織代碼的話,先使用STM32CubeMx進行配置并生成基于LL庫的初始化代碼。

a230b31c-8e71-11ed-bfe3-dac502259ad0.png

a241dff2-8e71-11ed-bfe3-dac502259ad0.png

基于CubeMx配置完畢后生成初始化工程,準備收發緩沖內存,然后添加用戶代碼。

剛開始用戶代碼是這樣編寫安排的。見下面代碼截圖。

a2504d94-8e71-11ed-bfe3-dac502259ad0.png

上圖中A處代碼的作用就是開啟兩個DMA stream的功能,即對相關DMA Stream的控制寄存器的使能位進行使能置1。

編譯無錯后運行代碼,可是根本沒有數據的收發動作發生。看來,跟反饋者的癥狀一樣。

沒辦法,硬著頭皮核查代碼。除了核查我添加的用戶代碼外,還核查UART及DMA的初始化代碼。看來看去,似乎該有的都有了,該寫的都寫了。

后來,根據代碼里涉及到的寄存器去跟STM32H7手冊里寄存器做比較閱讀。

在查看DMA各個stream配置控制寄存器【DMA_SxCR】內容時,突然發現并想起了點什么。

其實也是之前在別的DMA應用場合也碰到過的類似問題。

下面為該寄存器的內容布局截圖。

a27c309e-8e71-11ed-bfe3-dac502259ad0.png

隱約記得,該DMA Stream或Channel的控制使能位為0時才能做DMA相關其它參數的配置的。

我們可以在手冊里找到針對該位的明確描述:

a28984c4-8e71-11ed-bfe3-dac502259ad0.png

這里的意思是說,要想讓某DMA stream工作,必須令該EN位為1。

不過,當該EN位為1時時,是不允許對DMA及相應FIFO寄存器做配置的。

換言之,若要針對某Stream做DMA相關配置,得先讓該控制寄存器的EN位保持為0狀態。

而在我的用戶代碼里,對EN位寫1操作則放在了對DMA做各種配置的前面,即上面代碼截圖的A處。

a29a48cc-8e71-11ed-bfe3-dac502259ad0.png

a2a4da3a-8e71-11ed-bfe3-dac502259ad0.png

既然這樣,我們把對DMA控制寄存器EN位的置1操作放在其它DMA相關配置之后就應該可以了,即從上面代碼截圖中的A處拉到B處。

然后,進行測試,結果果真正常了。

其實就是一個配置代碼順序問題,卡了半天。

如果不是用LL庫而是用HAL庫可能就不太容易碰到這個問題。前面說過了,基于HAL庫的API函數像個黑盒子,它幫我們處理了很多細節性、判斷性的東西。

基于LL庫組織的代碼,相比HAL庫組織的代碼,代碼精簡、流程清晰、運行高效。不過,使用LL庫做開發需要開發者對芯片各個模塊的工作原理,操作流程有更清晰、更精準的了解,同時往往還需要開發者對應用相關的寄存器有更細致、深入的把握。

而HAL庫往往事先幫我們充分考慮到了基于硬件需求的操作流程、時序,基于軟件層面的諸多事件及狀態的互斥管理,以及不同STM32系列的代碼兼容性,并做了很好、很全面的封裝。

所以我們在利用HAL庫來實現相應功能時,往往無須對操作流程、時序以及寄存器本身做過多的了解就可以完成。

從開發角度講,利用HAL庫往往比利用LL庫能更快地完成任務,同時基于HAL庫的代碼也有更好的移植性,代價就是代碼相對LL庫要龐大些。

對應STM32開發者而言,即使基于HAL庫開發了一些STM32項目,對于芯片的諸多功能細節以及寄存器的了解往往可能比較有限。當然,這點因人而異吧,不可說死。

對于HAL庫和LL庫的選用,我們每個人可以根據自身情況來。比方,對芯片軟硬件不熟悉時、任務緊急時先使用HAL庫,等對芯片及庫函數熟悉、任務不緊急時可以切換到LL庫。

或者說,只是做些功能性驗證確認,使用HAL庫組織代碼也是非常快捷方便的。

當然,一個工程里HAL庫、LL庫是可以同時并存的。另外,當我們對芯片寄存器、內核指令系統足夠熟悉時,甚至可以嘗試使用匯編語言做MCU編程開發。

作為開發人員,基于HAL庫組織代碼和基于匯編指令組織代碼實現相同功能時,對我們自身的挑戰及相應的收獲是不可同日而語的。








審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • dma
    dma
    +關注

    關注

    3

    文章

    572

    瀏覽量

    102292
  • HAL庫
    +關注

    關注

    1

    文章

    121

    瀏覽量

    6741
  • stm32h7
    +關注

    關注

    0

    文章

    37

    瀏覽量

    1753

原文標題:STM32 DMA編程時的一個應用小提醒

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    求助,關于HALHAL_UART_Receive使用問題求解

    各位好,我在使用HALHAL_UART_Receive()函數時遇到了這樣的問題,在第一次使用HAL_UART_Receive()進行接
    發表于 04-10 07:25

    如何使用HAL實現不定長UART數據包的DMA接收?

    ;; ART_HandleTypeDef huart1; HAL_UART_Receive_DMA( huart1,rxbuf,sizeof(rxbuf)); 函數原型如下: /** * @briefReceives
    發表于 04-30 06:27

    stm32f103 + HAL + UART + DMA + UCOS III數據發送問題

    目的:stm32f103 + HAL + UART + DMA實現調試日志打印輸出功能。實現
    發表于 08-02 10:10

    STM32 HAL使用帶DMA的ADC會影響UART傳輸

    , adc_dma_values, 2);UART傳輸發送正確的數據。當我HAL_UART_Transmit_IT()用HAL_UART_T
    發表于 09-18 15:17

    STM32 HAL UART發送DMA問題

    4; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* UART4 DMA Init */ /* UART4_TX Init
    發表于 09-27 14:13

    請問HAL_UART_Receive_DMAHAL_UART_Transmit_DMA怎么用

    HAL_UART_Receive_DMA HAL_UART_Transmit_DMA通過UART接受數據,難道要寫一個 HAL_UART_Transmit_DMA 不停的輪詢嗎? 除了
    發表于 11-16 08:43

    stm32f103+HAL+UART+DMA+UCOS III數據發送沒有進入UART_TX_DMA中斷服務函數

    目的:stm32f103 + HAL + UART + DMA實現調試日志打印輸出功能。實現
    發表于 12-28 09:09

    HALSPI DMA的使用問題

    使用了HAL的函數來進行數據的讀寫:HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, ui
    發表于 04-01 11:47

    求大佬分享HALSPI DMA UART驅動開發的程序

    求大佬分享HALSPI DMA UART驅動開發的程序
    發表于 12-03 07:53

    stm32 HAL實現UART的不定長數據DMA接收的方法

    發送接收就顯得十分必要了,因為串口中斷每收到一個byte的數據就會發生中斷,這樣會非常的消耗單片機的資源。而DMA接受一幀數據才會發生中斷,可以極大的節省單片機的資源。STM32中的代碼使用HAL
    發表于 01-20 08:07

    在STM32H753ZI上使用DMAUART獲取HAL_DMA_ERROR_TE出現傳輸錯誤怎么解決?

    _PRIORITY_MEDIUM;hdma_uart5_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; HAL_DMA_Init(&hdma_uart
    發表于 01-03 08:08

    HAL_UART_Transmit_DMA傳輸問題求解

    目前我正在研究 UART DMA,在通過 DMA UART 傳輸數據后遇到了問題。在 1 次成功的數據
    發表于 01-04 07:06

    HAL_UART_Receive_DMA 隨機停止工作怎么處理?

    HAL_UART_Receive_DMA 以開始新的傳輸。我這樣做(而不是使用循環模式),以便我可以通過計算 512 字節的完整“幀”數并添加 (512 - CNDTR) 來計算傳輸
    發表于 01-09 07:56

    FreeRTOS中的HAL_UART_Transmit_DMA問題如何處理?

    得不到。第二個 DMA 語句無法運行,因為 HAL_UART_GetState(&UART_Handle_Console) 一直忙于 TX。以上是我的測試代碼。我的目的是使用二進制信號
    發表于 01-09 08:15

    STM32 HAL UART 串口讀寫功能筆記

    STM32L0 HAL UART 串口讀寫功能串口發送功能:uint8_t TxData[10]= “01234abcde”;HAL_UART_Transmit(&huart2
    發表于 12-27 19:11 ?13次下載
    STM32 <b class='flag-5'>HAL</b><b class='flag-5'>庫</b> <b class='flag-5'>UART</b> 串口讀寫功能筆記