色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

STM32CubeMx的初始配置順序是怎么影響DMA功能的

茶話MCU ? 來源:茶話MCU ? 作者:茶話MCU ? 2022-10-13 10:14 ? 次閱讀

?經(jīng)常有STM32開發(fā)者基于STM32CubeMx進(jìn)行配置并生成基于HAL庫的初始化代碼,當(dāng)涉及到DMA功能時(shí),發(fā)現(xiàn)DMA功能無效,但從配置操作及代碼本身又似乎找不出原因來的情況。此情此景 往往挺令人抓狂的。

比方曾有人反饋,他使用STM32F4系列芯片進(jìn)行產(chǎn)品開發(fā),通過STM32CubeMx配置并生成初始化代碼,使用了UART的DMA傳輸。但他發(fā)現(xiàn)DMA根本不工作。后來他無意中發(fā)現(xiàn),是因?yàn)樗谟脩舸a里不經(jīng)意地調(diào)整過UART外設(shè)和DMA外設(shè)初始化代碼的前后順序,當(dāng)他重新調(diào)整二者的先后順序后就一切正常了【此時(shí)DMA初始化代碼在前,UART初始化代碼在后】。他想知道這個(gè)順序是怎么影響DMA功能的。

我順手拿了塊STM32F334的Nucleo板,開啟UART1/UART3的數(shù)據(jù)通信功能,使用DMA進(jìn)行數(shù)據(jù)的循環(huán)傳輸。UART1發(fā)送數(shù)據(jù),UART3接收數(shù)據(jù)。基于STM32CubeMx配置后生成初始化代碼,添加用戶代碼。如下圖所示:

4f3cb8c8-4a23-11ed-a3b6-dac502259ad0.png

經(jīng)測試驗(yàn)證,發(fā)現(xiàn)基于UART1/3的DMA傳輸功能是正常的。

結(jié)合客戶的反饋,我將DMA與UART初始化順序前后調(diào)換下,如下圖:

4f58a6e6-4a23-11ed-a3b6-dac502259ad0.png

果真發(fā)現(xiàn)DMA不工作了,UART1/UART3之間也沒有數(shù)據(jù)通信。UART1/3的數(shù)據(jù)寄存器內(nèi)容維持0值而沒有任何變化,尤其作為發(fā)送端的UART1的數(shù)據(jù)寄存器也毫無動(dòng)靜。

看來,DMA和UART的初始化代碼的順序的確影響到了二者的功能,也就是說如果代碼是基于現(xiàn)有CubeMX生成的初始化代碼,二者的初始化順序不能隨意調(diào)整,那到底怎么回事呢?

首先查看這兩個(gè)初始化代碼內(nèi)容,試圖找到蛛絲馬跡。很遺憾,并未很快發(fā)現(xiàn)原因。后來,當(dāng)再次查看DMA初始化函數(shù)MX_DMA_Init();的具體內(nèi)容時(shí),發(fā)現(xiàn)代碼其實(shí)很簡單,就兩個(gè)動(dòng)作:

4f68620c-4a23-11ed-a3b6-dac502259ad0.png

一個(gè)動(dòng)作是開啟DMA外設(shè)的時(shí)鐘,另一個(gè)就是使能DMA相關(guān)的中斷矢量控制。

既然這樣,我嘗試將該DMA初始化函數(shù)體位置依然保持放在UART初始化代碼的后面,但將DMA初始化函數(shù)里的那句開啟DMA外設(shè)時(shí)鐘的代碼提取出來,并移至UART初始化代碼之前,據(jù)此進(jìn)行驗(yàn)證。這次,結(jié)果就一切正常了。

看來,基于現(xiàn)有初始化代碼,這個(gè)DMA時(shí)鐘的開啟要放在UART初始化代碼之前,那是為什么呢?感覺UART的配置跟DMA時(shí)鐘沒有啥關(guān)系啊。

繼續(xù)挖掘原因!

再回頭細(xì)看UART的初始化代碼,在UART初始化函數(shù)的一個(gè)子函數(shù)HAL_UART_MspInit()那里發(fā)現(xiàn)了端倪。

MX_USART1_UART_Init()==》HAL_UART_Init()==》HAL_UART_MspInit();

因?yàn)槲覀冮_啟了跟UART傳輸事件相關(guān)的DMA功能,在HAL_UART_MspInit();函數(shù)里不僅有對(duì)與UART相關(guān)的GPIO的復(fù)用功能配置,而且,還有跟UART事件相關(guān)的DMA配置。看來UART的初始化還是跟DMA有關(guān)聯(lián)的。

4f7e0e04-4a23-11ed-a3b6-dac502259ad0.png

結(jié)合上面DMA初始化函數(shù)里的那句開啟DMA外設(shè)時(shí)鐘代碼,到這里基本明白怎么回事了。

因?yàn)槲覀冊(cè)赨ART初始化代碼里要做跟DMA有關(guān)的配置,如果不事先將DMA外設(shè)的時(shí)鐘開啟,加上UART初始化函數(shù)里也沒有開啟DMA外設(shè)時(shí)鐘的代碼,那么,在UART初始化代碼進(jìn)行有關(guān)DMA的配置操作就沒法保證有效。

到此,開篇中提到的因?yàn)镈MA和UART初始化代碼順序影響DMA功能的原因應(yīng)該說揭曉了。

在做嵌入式開發(fā)過程中,很多的初始化配置都是基于硬件本身的,有些初始化順序可能有硬件方面的時(shí)序要求。關(guān)于這些,各芯片手冊(cè)中一般都會(huì)有明確描述和說明。我們?cè)诰帉懗跏蓟a時(shí)須遵循相關(guān)規(guī)定。當(dāng)然,有些配置順序可能還得結(jié)合具體應(yīng)用,實(shí)際體會(huì)后而做靈活調(diào)整。

回到文中案例,一般來說,STM32CubeMx在生成初始化代碼時(shí)已經(jīng)考慮到初始化時(shí)序這點(diǎn)了,只是用戶在整理代碼過程中可能無意調(diào)整了二者的初始化順序而不自知,再加上我們對(duì)初始化代碼本身缺乏足夠的了解而可能一度陷入困境。

據(jù)個(gè)人體驗(yàn),在實(shí)際應(yīng)用中,當(dāng)我們基于CubeMx來回調(diào)整配置時(shí),這個(gè)順序也可能會(huì)被打亂。請(qǐng)注意這點(diǎn)。說實(shí)在的,這個(gè)地方非常隱蔽,即使知道有這么回事也還是可能忘記或忽略。當(dāng)因此而出現(xiàn)DMA傳輸異常時(shí),如果不是基于代碼做跟蹤調(diào)試或閱讀是很難找到問題癥結(jié)的,因?yàn)榕渲貌僮骱退{(diào)用的庫函數(shù)代碼本身是沒有問題的。核心問題就是初始化代碼的執(zhí)行順序。

比方這兩天連續(xù)有人反饋,他們使用STM32芯片的ADC并啟用DMA傳輸時(shí),都是因?yàn)檫@個(gè)原因使得ADC數(shù)據(jù)無法被DMA取走而產(chǎn)生異常。總之,在現(xiàn)有情況下, 保證DMA初始化代碼放在其它與DMA有關(guān)的各個(gè)外設(shè)初始化之前就不會(huì)有類似問題。比方就像下面的樣子:

4fa40d02-4a23-11ed-a3b6-dac502259ad0.png

關(guān)于這個(gè)話題,三年前我已經(jīng)在此分享過了。這個(gè)過程中,依然陸續(xù)也有人會(huì)遇到這個(gè)問題,我覺得有必要再分享之,所以在這里再分享一遍,以資提醒,愿君在開發(fā)過程中少一份坎坷。

三年,算來沒完沒了的新冠疫情也持續(xù)近三年了,真難啊!我在此放一首加油曲在下方,愿一切盡快正常起來!

審核編輯:湯梓紅

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

    關(guān)注

    2270

    文章

    10910

    瀏覽量

    356599
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1240

    瀏覽量

    101495
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    565

    瀏覽量

    100678
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    194

    瀏覽量

    28094
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    283

    瀏覽量

    14843

原文標(biāo)題:STM32CubeMx的初始配置順序與DMA傳輸異常之提醒

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CubeMX的菜單介紹

    個(gè)項(xiàng)目工程,你可以基于此項(xiàng)目進(jìn)行項(xiàng)目開發(fā)。下圖是菜單欄的功能介紹:具體用法請(qǐng)參考付費(fèi)視頻。原文標(biāo)題:STM32CubeMX的菜單介紹文章出處:【微信公眾號(hào):撞上電
    的頭像 發(fā)表于 12-25 21:03 ?133次閱讀
    <b class='flag-5'>STM32CubeMX</b>的菜單介紹

    STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失敗的原因?

    請(qǐng)教用STm32cubeMX生成STM32F412RGT6-USB_CDC工程初始化失敗
    發(fā)表于 04-28 06:56

    STM32CubeMx使用GUI_DrawGradientH GUI_DrawGradientV繪制一直顯示黑色,是哪里出錯(cuò)?

    使用STM32CubeMx配置 LTDC + DMA2D + FMC + GRAPHICS STemWin(開啟CRC),直接使用STM32CubeMx生成代碼,未進(jìn)行手動(dòng)修改。 問
    發(fā)表于 04-26 06:38

    使用stm32CubeMx時(shí),設(shè)置DMA為Circular模式會(huì)被HAL_ADC_Start_DMA阻塞為什么?

    在使用stm32CubeMx時(shí)遇到一個(gè)問題,我在用DMA方式獲取ADC數(shù)據(jù)時(shí),設(shè)置DMA為Circular模式會(huì)被HAL_ADC_Start_DMA阻塞,不懂為什么會(huì)這樣,后來換了F1
    發(fā)表于 04-25 08:12

    STM32F030F4上使用CubeMX配置ADC+DMA循環(huán)采集無法提取數(shù)據(jù)的原因?

    如題,使用STM32CubeMX配置了F030的ADC+DMA循環(huán)采集,ADC啟動(dòng)后OVR一直處于置為狀態(tài),但是DR寄存器輸出的數(shù)據(jù)又是正常的,我使用std庫已經(jīng)配置并實(shí)現(xiàn)了
    發(fā)表于 04-16 08:20

    STM32H746IIT6使用STM32CubeMX配置JPEG解碼器初始化失敗的原因?怎么解決?

    STM32H746IIT6使用STM32CubeMX配置JPEG解碼器初始化失敗,調(diào)試觀察下發(fā)現(xiàn)進(jìn)入硬件故障中斷,由于第一次接觸這個(gè),然后再百度上面有沒有找到問題所在,已經(jīng)這里被困住幾
    發(fā)表于 04-12 07:28

    stm32cubemx功能不起作用是哪里的問題?

    最近幾個(gè)版本的stm32cubemx功能不起作用: 在cube上有一個(gè)很好用的功能就是點(diǎn)按ctrl和click按鍵會(huì)讓alternative pin顯示出來,這個(gè)功能非常高效率。然而
    發(fā)表于 04-08 07:28

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC缺少DMA Settings配置是怎么回事?

    STM32CubeMX配置STM32L4R9ZI的硬件SDMMC1,缺少DMA Settings配置
    發(fā)表于 04-08 07:25

    STM32CubeMX STM32WL不能配置LoRaWAN的原因?

    STM32CubeMX 中使用STM32WL配置LoRaWAN時(shí)不能配置,請(qǐng)問為什么?
    發(fā)表于 04-02 07:47

    STM32CubeMX配置FREERTOS后無法生成代碼怎么解決?

    stm32cubemx配置了freertos后報(bào)錯(cuò),disable了freertos又能正常生成代碼
    發(fā)表于 03-28 09:55

    stm32cubeMX如何配置4*4矩陣鍵盤?

    stm32cubeMX如何配置4*4矩陣鍵盤,求大佬給代碼指導(dǎo)一下,看了太多代碼,自己迷亂了
    發(fā)表于 03-28 09:27

    關(guān)于STM32L051C8T6芯片LPUART+DMA接收問題求解

    STM32L051C8T6芯片低功耗串口LPUART+DMA。 我用STM32CUBEMX 生成了程序LPUART以及UART2串口+DMA的程序。 重新寫了RxCpltCall函數(shù)
    發(fā)表于 03-28 07:05

    STM32CubeMX 6.5.0時(shí)鐘配置頁面的ADC時(shí)鐘源無法配置怎么解決?

    最新版STM32CubeMX 6.5.0,啟動(dòng)ADC功能后,時(shí)鐘配置頁面的ADC時(shí)鐘源仍無法配置STM32CubeMX 6.4.0使用正常
    發(fā)表于 03-25 07:04

    如何使用STM32CubeMx配置STM32MP135的LTDC外設(shè)?

    請(qǐng)問一下,如何使用STM32CubeMx配置STM32MP135的LTDC外設(shè),打開后LTDC配置項(xiàng)是空的
    發(fā)表于 03-11 07:37

    STM32Cubemx配置USB虛擬串口,電腦無法識(shí)別怎么解決?

    STM32Cubemx配置USB虛擬串口,電腦無法識(shí)別問題?(上拉和驅(qū)動(dòng)都配置好了)
    發(fā)表于 03-08 07:00
    主站蜘蛛池模板: 青青草国产精品久久| 天天靠天天擦天天摸| 九九久久国产精品免费热6| 好男人WWW免费高清视频在线| 精品AV综合导航| 沦为公交两奶头春药高潮迭起| 芒果视频看片在线观看| 女教师跟黑人男朋友激情过后| 人人看人人看| 小夫妻天天恶战| 伊人色综合久久天天网| 99热在线观看精品| 国产AV一区二区三区传媒| 国产在线精品亚洲一品区| 久久日韩精品无码一区| 欧美派对xxxhdparty| 少女10声大哥喊退色狼| 亚洲第一国产| 《乳色吐息》无删减版在线观看 | 国产在线精品亚洲另类| 久久久久久88色偷偷| 欧美性爱 成人| 香蕉AV福利精品导航| 最近免费中文MV在线字幕| 超碰视频97av| 花蝴蝶在线观看免费8| 暖暖高清视频免费| 探花口爆颜射乳交日韩| 尹人综合网| 第一福利在线永久视频| 精品免费久久久久久影院| 欧美乱码卡一卡二卡四卡免费| 无人区在线日本高清免费 | 青青草国产自偷拍| 亚洲娇小性色xxxx| 99热久久久无码国产精品性麻豆| 国产精品久久久久久无码专区| 两个人的视频hd全免费| 同房交换4p好爽| 1级午夜影院费免区| 国产精品系列在线观看|