18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HAL庫(kù)無(wú)法實(shí)現(xiàn)UART的DMA傳輸真是這樣嗎?

茶話MCU ? 來(lái)源:茶話MCU ? 2023-01-08 11:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

有人使用STM32H7芯片做些事情,發(fā)現(xiàn)基于ST公司的HAL庫(kù)開(kāi)發(fā)UART1的DMA收發(fā)時(shí)可以輕松實(shí)現(xiàn),而當(dāng)使用ST的LL庫(kù)組織代碼時(shí),卻沒(méi)法實(shí)現(xiàn)UART的DMA傳輸。

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

使用STM32CubeMx進(jìn)行圖形化配置,并生成基于HAL庫(kù)的初始代碼,要實(shí)現(xiàn)UART收發(fā)功能的DMA傳輸?shù)脑挘税才藕玫氖瞻l(fā)緩沖內(nèi)存外,再就只需調(diào)用下面兩個(gè)HAL庫(kù)的API函數(shù)即可進(jìn)行功能驗(yàn)證。

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

從功能實(shí)現(xiàn)上講,使用HAL庫(kù)及相應(yīng)API還是很方便、很簡(jiǎn)單的。每個(gè)API函數(shù)就像個(gè)黑盒子,對(duì)于里面的內(nèi)容,如果你不點(diǎn)進(jìn)去閱讀是不會(huì)知曉的。

不過(guò),建議盡可能地多點(diǎn)進(jìn)去瞧瞧,那里往往別有洞天。

如果基于LL庫(kù)來(lái)組織代碼的話,先使用STM32CubeMx進(jìn)行配置并生成基于LL庫(kù)的初始化代碼。

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

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

基于CubeMx配置完畢后生成初始化工程,準(zhǔn)備收發(fā)緩沖內(nèi)存,然后添加用戶代碼。

剛開(kāi)始用戶代碼是這樣編寫安排的。見(jiàn)下面代碼截圖。

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

上圖中A處代碼的作用就是開(kāi)啟兩個(gè)DMA stream的功能,即對(duì)相關(guān)DMA Stream的控制寄存器的使能位進(jìn)行使能置1。

編譯無(wú)錯(cuò)后運(yùn)行代碼,可是根本沒(méi)有數(shù)據(jù)的收發(fā)動(dòng)作發(fā)生。看來(lái),跟反饋者的癥狀一樣。

沒(méi)辦法,硬著頭皮核查代碼。除了核查我添加的用戶代碼外,還核查UART及DMA的初始化代碼??磥?lái)看去,似乎該有的都有了,該寫的都寫了。

后來(lái),根據(jù)代碼里涉及到的寄存器去跟STM32H7手冊(cè)里寄存器做比較閱讀。

在查看DMA各個(gè)stream配置控制寄存器【DMA_SxCR】?jī)?nèi)容時(shí),突然發(fā)現(xiàn)并想起了點(diǎn)什么。

其實(shí)也是之前在別的DMA應(yīng)用場(chǎng)合也碰到過(guò)的類似問(wèn)題。

下面為該寄存器的內(nèi)容布局截圖。

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

隱約記得,該DMA Stream或Channel的控制使能位為0時(shí)才能做DMA相關(guān)其它參數(shù)的配置的。

我們可以在手冊(cè)里找到針對(duì)該位的明確描述:

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

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

不過(guò),當(dāng)該EN位為1時(shí)時(shí),是不允許對(duì)DMA及相應(yīng)FIFO寄存器做配置的。

換言之,若要針對(duì)某Stream做DMA相關(guān)配置,得先讓該控制寄存器的EN位保持為0狀態(tài)。

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

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

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

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

然后,進(jìn)行測(cè)試,結(jié)果果真正常了。

其實(shí)就是一個(gè)配置代碼順序問(wèn)題,卡了半天。

如果不是用LL庫(kù)而是用HAL庫(kù)可能就不太容易碰到這個(gè)問(wèn)題。前面說(shuō)過(guò)了,基于HAL庫(kù)的API函數(shù)像個(gè)黑盒子,它幫我們處理了很多細(xì)節(jié)性、判斷性的東西。

基于LL庫(kù)組織的代碼,相比HAL庫(kù)組織的代碼,代碼精簡(jiǎn)、流程清晰、運(yùn)行高效。不過(guò),使用LL庫(kù)做開(kāi)發(fā)需要開(kāi)發(fā)者對(duì)芯片各個(gè)模塊的工作原理,操作流程有更清晰、更精準(zhǔn)的了解,同時(shí)往往還需要開(kāi)發(fā)者對(duì)應(yīng)用相關(guān)的寄存器有更細(xì)致、深入的把握。

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

所以我們?cè)诶肏AL庫(kù)來(lái)實(shí)現(xiàn)相應(yīng)功能時(shí),往往無(wú)須對(duì)操作流程、時(shí)序以及寄存器本身做過(guò)多的了解就可以完成。

從開(kāi)發(fā)角度講,利用HAL庫(kù)往往比利用LL庫(kù)能更快地完成任務(wù),同時(shí)基于HAL庫(kù)的代碼也有更好的移植性,代價(jià)就是代碼相對(duì)LL庫(kù)要龐大些。

對(duì)應(yīng)STM32開(kāi)發(fā)者而言,即使基于HAL庫(kù)開(kāi)發(fā)了一些STM32項(xiàng)目,對(duì)于芯片的諸多功能細(xì)節(jié)以及寄存器的了解往往可能比較有限。當(dāng)然,這點(diǎn)因人而異吧,不可說(shuō)死。

對(duì)于HAL庫(kù)和LL庫(kù)的選用,我們每個(gè)人可以根據(jù)自身情況來(lái)。比方,對(duì)芯片軟硬件不熟悉時(shí)、任務(wù)緊急時(shí)先使用HAL庫(kù),等對(duì)芯片及庫(kù)函數(shù)熟悉、任務(wù)不緊急時(shí)可以切換到LL庫(kù)。

或者說(shuō),只是做些功能性驗(yàn)證確認(rèn),使用HAL庫(kù)組織代碼也是非??旖莘奖愕?。

當(dāng)然,一個(gè)工程里HAL庫(kù)、LL庫(kù)是可以同時(shí)并存的。另外,當(dāng)我們對(duì)芯片寄存器、內(nèi)核指令系統(tǒng)足夠熟悉時(shí),甚至可以嘗試使用匯編語(yǔ)言做MCU編程開(kāi)發(fā)。

作為開(kāi)發(fā)人員,基于HAL庫(kù)組織代碼和基于匯編指令組織代碼實(shí)現(xiàn)相同功能時(shí),對(duì)我們自身的挑戰(zhàn)及相應(yīng)的收獲是不可同日而語(yǔ)的。








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    577

    瀏覽量

    105023
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    121

    瀏覽量

    7415
  • stm32h7
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    1753

原文標(biāo)題:STM32 DMA編程時(shí)的一個(gè)應(yīng)用小提醒

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    求助,關(guān)于HAL庫(kù)HAL_UART_Receive使用問(wèn)題求解

    各位好,我在使用HAL庫(kù)HAL_UART_Receive()函數(shù)時(shí)遇到了這樣的問(wèn)題,在第一次使用HAL_UART_Receive()進(jìn)行接
    發(fā)表于 04-10 07:25

    如何使用HAL庫(kù)實(shí)現(xiàn)不定長(zhǎng)UART數(shù)據(jù)包的DMA接收?

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

    stm32f103 + HAL庫(kù) + UART + DMA + UCOS III數(shù)據(jù)發(fā)送問(wèn)題

    目的:stm32f103 + HAL庫(kù) + UART + DMA實(shí)現(xiàn)調(diào)試日志打印輸出功能。實(shí)現(xiàn)
    發(fā)表于 08-02 10:10

    STM32 HAL使用帶DMA的ADC會(huì)影響UART傳輸

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

    STM32 HAL UART發(fā)送DMA問(wèn)題

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

    請(qǐng)問(wèn)HAL_UART_Receive_DMAHAL_UART_Transmit_DMA怎么用

    HAL_UART_Receive_DMA HAL_UART_Transmit_DMA通過(guò)UART接受數(shù)據(jù),難道要寫一個(gè) HAL_UART_Transmit_DMA 不停的輪詢嗎? 除了
    發(fā)表于 11-16 08:43

    stm32f103+HAL庫(kù)+UART+DMA+UCOS III數(shù)據(jù)發(fā)送沒(méi)有進(jìn)入UART_TX_DMA中斷服務(wù)函數(shù)

    目的:stm32f103 + HAL庫(kù) + UART + DMA實(shí)現(xiàn)調(diào)試日志打印輸出功能。實(shí)現(xiàn)
    發(fā)表于 12-28 09:09

    HAL庫(kù)SPI DMA的使用問(wèn)題

    使用了HAL庫(kù)的函數(shù)來(lái)進(jìn)行數(shù)據(jù)的讀寫:HAL_StatusTypeDef HAL_SPI_TransmitReceive_DMA(SPI_HandleTypeDef *hspi, ui
    發(fā)表于 04-01 11:47

    求大佬分享HAL庫(kù)SPI DMA UART驅(qū)動(dòng)開(kāi)發(fā)的程序

    求大佬分享HAL庫(kù)SPI DMA UART驅(qū)動(dòng)開(kāi)發(fā)的程序
    發(fā)表于 12-03 07:53

    stm32 HAL庫(kù)實(shí)現(xiàn)UART的不定長(zhǎng)數(shù)據(jù)DMA接收的方法

    發(fā)送接收就顯得十分必要了,因?yàn)榇谥袛嗝渴盏揭粋€(gè)byte的數(shù)據(jù)就會(huì)發(fā)生中斷,這樣會(huì)非常的消耗單片機(jī)的資源。而DMA接受一幀數(shù)據(jù)才會(huì)發(fā)生中斷,可以極大的節(jié)省單片機(jī)的資源。STM32中的代碼使用HAL
    發(fā)表于 01-20 08:07

    在STM32H753ZI上使用DMAUART獲取HAL_DMA_ERROR_TE出現(xiàn)傳輸錯(cuò)誤怎么解決?

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

    HAL_UART_Transmit_DMA傳輸問(wèn)題求解

    目前我正在研究 UART DMA,在通過(guò) DMA UART 傳輸數(shù)據(jù)后遇到了問(wèn)題。在 1 次成功的數(shù)據(jù)
    發(fā)表于 01-04 07:06

    HAL_UART_Receive_DMA 隨機(jī)停止工作怎么處理?

    HAL_UART_Receive_DMA 以開(kāi)始新的傳輸。我這樣做(而不是使用循環(huán)模式),以便我可以通過(guò)計(jì)算 512 字節(jié)的完整“幀”數(shù)并添加 (512 - CNDTR) 來(lái)計(jì)算傳輸
    發(fā)表于 01-09 07:56

    FreeRTOS中的HAL_UART_Transmit_DMA問(wèn)題如何處理?

    得不到。第二個(gè) DMA 語(yǔ)句無(wú)法運(yùn)行,因?yàn)?HAL_UART_GetState(&UART_Handle_Console) 一直忙于 TX。以上是我的測(cè)試代碼。我的目的是使用二進(jìn)制信號(hào)
    發(fā)表于 01-09 08:15

    STM32 HAL庫(kù) UART 串口讀寫功能筆記

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