哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

茶話MCU ? 來源:茶話MCU ? 作者:茶話MCU ? 2022-10-13 10:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

經(jīng)測試驗證,發(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ù)寄存器也毫無動靜。

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

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

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

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

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

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

繼續(xù)挖掘原因!

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

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

因為我們開啟了跟UART傳輸事件相關(guān)的DMA功能,在HAL_UART_MspInit();函數(shù)里不僅有對與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è)時鐘代碼,到這里基本明白怎么回事了。

因為我們在UART初始化代碼里要做跟DMA有關(guān)的配置,如果不事先將DMA外設(shè)的時鐘開啟,加上UART初始化函數(shù)里也沒有開啟DMA外設(shè)時鐘的代碼,那么,在UART初始化代碼進行有關(guān)DMA的配置操作就沒法保證有效。

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

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

    關(guān)注

    2313

    文章

    11195

    瀏覽量

    374614
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1319

    瀏覽量

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

    關(guān)注

    3

    文章

    582

    瀏覽量

    106265
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    204

    瀏覽量

    30301
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    290

    瀏覽量

    17476

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 Cmake。CMake 工程可以很容易被
    發(fā)表于 04-15 16:07 ?0次下載

    LAT1574_如何在 STM32Cube CMake 工程中添加源文件

    STM32CubeMX 能夠很方便的導(dǎo)出 CMake 工程。例如,如下圖所示在 STM32CubeMX的 ToolChain/IDE 中選擇 CmakeCMake 工程可以很容易被
    發(fā)表于 03-11 10:46 ?0次下載

    基于 X-Cube-FreeRTOS_Heap4 和 CubeMX 生成 UCPD 項目介紹

    某客戶反映參考我們的文檔 AN5418《How to build a simple USB-PD sink applicationwith STM32CubeMX》去配置 FreeRTOS 生成
    發(fā)表于 01-04 11:18 ?0次下載

    請問RT-Thread與stm32cubemx聯(lián)合開發(fā)的原理是什么?

    在使用RT-Thread與stm32cubemx聯(lián)合開發(fā)的原理是什么,cubemx在其中主要起到了哪些功能呢?
    發(fā)表于 10-11 15:49

    STM32cubeMX生成配置rt-thread引用問題求解

    如題,本人小白,剛接觸rt-thread,STM32F1/4簡便配置起見利用cubeMX自動生成,測試幾次后直接蒙了,不知道哪些文件是rt-thread項目必須的,網(wǎng)上說法也五花八門,說代碼屏蔽某些
    發(fā)表于 09-12 07:21

    意法半導(dǎo)體:STM32CubeMX將不再集成到STM32CubeIDE中

    從2025年11月發(fā)布的版本開始,我們將僅以 獨立 版本的形式提供 STM32CubeIDE 和 STM32CubeMX 。 STM32CubeMX將不再集成到STM32CubeIDE
    的頭像 發(fā)表于 09-01 17:18 ?3871次閱讀

    STM32CubeMX初始配置沖突的BUG怎么處理?

    發(fā)現(xiàn)了一個BUG,比如我們在使用開發(fā)板進行板載按鍵中斷配置的時候,如果開啟板子資源初始配置,我們再自行配置一下后,產(chǎn)生了一個不識別的外部中斷處理函數(shù)
    發(fā)表于 07-22 08:02

    使用STM32CubeMX的時候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?

    在使用STM32CubeMX的時候創(chuàng)建的工程已經(jīng)使用的板載資源如何去掉?在基于開發(fā)板進行工程創(chuàng)建的時候會把板載資源直接初始化,后面想要用不同的功能配置,如何把
    發(fā)表于 07-22 07:13

    對于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時間有什么說明嗎?

    對于在STM32CubeMx使用FMC中的NAND FLASH里面配置這些時間有什么說明嗎?
    發(fā)表于 07-21 07:07

    STM32CubeMX配置STM32G070RBT6TR時為什么無法使能PVD中斷?

    STM32CubeMX 配置STM32G070RBT6TR時無法使能PVD中斷
    發(fā)表于 06-18 07:59

    STM32CubeMX配置STM32G070RBT6TR時無法使能PVD中斷怎么辦?

    STM32CubeMX 配置STM32G070RBT6TR時無法使能PVD中斷
    發(fā)表于 06-16 06:32

    stm32f407無法配置定時器2為全部dma怎么解決?

    斷的情況,少鏈接其中一個通道,就不會出現(xiàn)這種情況,麻煩各位老師幫忙分析一下,給點思路,非常感謝。。(ps:CubeMX下是無法配置定時器2的4個通道為dma模式)[/td] 以下內(nèi)容為評論 [td]看了一下
    發(fā)表于 06-11 06:49

    STM32F103TBU6 封裝是VFQFPN36 將PD0和PD1配置成CAN不成功是什么原因?

    規(guī)格書上可以配置成CAN, 程序配置好后發(fā)現(xiàn)發(fā)送數(shù)據(jù)沒有郵箱。然后在STM32CubeMX軟件進CAN配置發(fā)現(xiàn)STM32F103TBU6封
    發(fā)表于 06-06 06:42

    STM32CubeMX配置DCMI的腳位時,在Mode的選項中, 只有8bits, 10bits與12bits, 為何沒有14bits?

    STM32CubeMX配置DCMI的腳位時,在Mode的選項中, 只有8bits, 10bits與12bits, 為何沒有14bits?
    發(fā)表于 04-27 08:49

    STM32F103TBU6封裝是VFQFPN36,將PD0和PD1配置成CAN不成功是什么原因?

    規(guī)格書上可以配置成CAN, 程序配置好后發(fā)現(xiàn)發(fā)送數(shù)據(jù)沒有郵箱。然后在STM32CubeMX軟件進CAN配置發(fā)現(xiàn)STM32F103TBU6封
    發(fā)表于 04-27 08:41
    林西县| 江阴市| 汉源县| 江阴市| 武安市| 温宿县| 蒲江县| 常州市| 渭源县| 石门县| 深州市| 自贡市| 晋城| 彝良县| 林州市| 唐山市| 赫章县| 吴江市| 汉中市| 亳州市| 华阴市| 溆浦县| 凉山| 康马县| 启东市| 兴安县| 新宾| 缙云县| 始兴县| 陕西省| 屯昌县| 紫阳县| 和顺县| 宿州市| 灵川县| 乌兰县| 松桃| 海伦市| 磐安县| 太康县| 甘孜县|