99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

經(jīng)測(cè)試驗(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之間也沒(méi)有數(shù)據(jù)通信。UART1/3的數(shù)據(jù)寄存器內(nèi)容維持0值而沒(méi)有任何變化,尤其作為發(fā)送端的UART1的數(shù)據(jù)寄存器也毫無(wú)動(dòng)靜。

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

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

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

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

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

看來(lái),基于現(xiàn)有初始化代碼,這個(gè)DMA時(shí)鐘的開(kāi)啟要放在UART初始化代碼之前,那是為什么呢?感覺(jué)UART的配置跟DMA時(shí)鐘沒(méi)有啥關(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)槲覀冮_(kāi)啟了跟UART傳輸事件相關(guān)的DMA功能,在HAL_UART_MspInit();函數(shù)里不僅有對(duì)與UART相關(guān)的GPIO的復(fù)用功能配置,而且,還有跟UART事件相關(guān)的DMA配置??磥?lái)UART的初始化還是跟DMA有關(guān)聯(lián)的。

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

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

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

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

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

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

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

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

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

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

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • STM32
    +關(guān)注

    關(guān)注

    2293

    文章

    11032

    瀏覽量

    365113
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1276

    瀏覽量

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

    關(guān)注

    3

    文章

    576

    瀏覽量

    103291
  • STM32F4
    +關(guān)注

    關(guān)注

    3

    文章

    203

    瀏覽量

    29063
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    286

    瀏覽量

    16284

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    STM32CubeMX配置STM32G070RBT6TR時(shí)為什么無(wú)法使能PVD中斷?

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

    STM32CubeMX配置STM32G070RBT6TR時(shí)無(wú)法使能PVD中斷怎么辦?

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

    使用STM32CubeMX進(jìn)行配置USB的時(shí)候,有哪些小的需要注意的細(xì)節(jié)?

    在使用STM32CubeMX進(jìn)行配置USB的時(shí)候,是參照例程進(jìn)行的配置,自己配置的就是沒(méi)有成功,例程就滅有問(wèn)題,總感覺(jué)哪里沒(méi)有打開(kāi)?有人遇到過(guò)需要注意的小細(xì)節(jié)嗎?
    發(fā)表于 04-23 06:54

    STM32開(kāi)發(fā)入門(mén)進(jìn)階必備!《STM32嵌入式系統(tǒng)開(kāi)發(fā)—基于STM32CubeMX和HAL庫(kù)》新書(shū)發(fā)布!

    近日,由華清遠(yuǎn)見(jiàn)教育科技集團(tuán)精心編撰的教育部高等學(xué)校電子信息類專業(yè)教學(xué)指導(dǎo)委員會(huì)規(guī)劃教材、普通高等教育電子信息類專業(yè)系列教材——《STM32嵌入式系統(tǒng)開(kāi)發(fā)—基于STM32CubeMX和HAL庫(kù)》重磅
    的頭像 發(fā)表于 04-03 14:54 ?752次閱讀
    <b class='flag-5'>STM32</b>開(kāi)發(fā)入門(mén)進(jìn)階必備!《<b class='flag-5'>STM32</b>嵌入式系統(tǒng)開(kāi)發(fā)—基于<b class='flag-5'>STM32CubeMX</b>和HAL庫(kù)》新書(shū)發(fā)布!

    請(qǐng)問(wèn)STM32cubeMX中文版怎么設(shè)置?

    STM32cubeMX中文版怎么設(shè)置?
    發(fā)表于 03-13 06:12

    STM32CubeMX生成代碼就會(huì)覆蓋CMakeLists.txt文件,怎么解決?

    請(qǐng)教一下用STM32CubeMX生成代碼后,我自己加了一個(gè)頭文件和源文件,這些自己加的文件不是要配置到CMakeLists.txt編譯么,但下載在用STM32CubeMX生成成代碼,就會(huì)覆蓋CMakeLists.txt文件,這種
    發(fā)表于 03-12 08:03

    stm32cubemx按照配置重新生成工程,bsp_SysTick.c一直沒(méi)有呢?

    stm32cubemx按照配置重新生成工程,bsp_SysTick.c一直沒(méi)有呢
    發(fā)表于 03-10 07:44

    STM32CubeMX生成STM32mp135D的USART1,2,3,6代碼初始化是空的,為什么?

    STM32CubeMX生成STM32mp135D的USART1,2,3,6代碼初始化是空的,參考其他代碼做了初始化操作,可以通過(guò)HAL_USART_Transmit接口發(fā)送數(shù)據(jù),但是
    發(fā)表于 03-07 07:48

    STM32CubeMX用于STM32配置初始化C代碼生成

    電子發(fā)燒友網(wǎng)站提供《STM32CubeMX用于STM32配置初始化C代碼生成.pdf》資料免費(fèi)下載
    發(fā)表于 02-26 17:32 ?677次下載

    工程師開(kāi)發(fā)利器:STM32CubeMX 與 eDesignSuite 的協(xié)同開(kāi)發(fā)

    的核心功能與優(yōu)勢(shì)STM32CubeMX 是 ST 官方推出的圖形化配置工具,專為簡(jiǎn)化 STM32 微控制器開(kāi)發(fā)流程而設(shè)計(jì)。以下是其核心功能
    的頭像 發(fā)表于 02-26 14:07 ?747次閱讀
    工程師開(kāi)發(fā)利器:<b class='flag-5'>STM32CubeMX</b> 與 eDesignSuite 的協(xié)同開(kāi)發(fā)

    STM32CubeMX生成的代碼,是怎樣的HAL架構(gòu)?

    需要注意,CubeMX只是一個(gè)初始化工具,它只是幫你完成了HAL庫(kù)外設(shè)和時(shí)鐘的初始化,具體程序的編寫(xiě)還需要查閱HAL庫(kù)的說(shuō)明,使用相關(guān)函數(shù)實(shí)現(xiàn)你想實(shí)現(xiàn)的功能。
    的頭像 發(fā)表于 01-01 21:01 ?819次閱讀
    <b class='flag-5'>STM32CubeMX</b>生成的代碼,是怎樣的HAL架構(gòu)?

    STM32CubeMX的菜單介紹

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

    STM32CUBEMX(3)--ADC通過(guò)DMA方式采樣,USART打印

    的優(yōu)先級(jí)。 本篇文章主要介紹如何使用STM32CubeMX實(shí)現(xiàn)ADC在DMA下快速采集,并且打印出去。 QQ群:615061293。 非DMA接收請(qǐng)查看: https://blog.csdn.net
    發(fā)表于 09-04 14:08

    STM32CUBEMX(2)--USART通過(guò)DMA方式接收不定長(zhǎng)數(shù)據(jù)

    。 本篇文章主要介紹如何使用STM32CubeMX實(shí)現(xiàn)串口DMA讀取,并且打印出去。QQ群:615061293。 硬件準(zhǔn)備 首先需要準(zhǔn)備一個(gè)開(kāi)發(fā)板,這里我準(zhǔn)備的是NUCLEO-F030R8的開(kāi)發(fā)板
    發(fā)表于 09-04 11:48

    stm32用串口燒錄怎么設(shè)置

    準(zhǔn)備工作 確保您擁有STM32開(kāi)發(fā)板和相應(yīng)的硬件設(shè)備,如USB轉(zhuǎn)串口模塊。 安裝STM32CubeMXSTM32CubeProgrammer軟件,這些是ST官方提供的工具,用于配置
    的頭像 發(fā)表于 08-22 09:33 ?3497次閱讀