1、使用CubeMx配置NVIC時為何不見子優(yōu)先級選項?
有些STM32用戶,尤其是那些用過基于ARMCortx-M3/M4/M7內(nèi)核的STM32 MCU的用戶,在使用基于M0/M0+內(nèi)核的STM32系列并通過STM32CubeMx進行NVIC配置時,不難發(fā)現(xiàn)一個問題,那就是怎么沒有中斷子優(yōu)先級【或稱響應(yīng)優(yōu)先級、副優(yōu)先級等】的配置?!【當然,很多時候我們或許沒有關(guān)注子優(yōu)先級】如下圖所示,只看到搶占優(yōu)先級的配置,看不到子優(yōu)先級的配置項。
上圖是我基于STM32L0系列芯片的配置,該系列芯片是基于ARM Cortex-M0+內(nèi)核的。我們再看看下圖的NVIC配置頁面,顯然可以看到搶占優(yōu)先級【PreemptionPriority】和子優(yōu)先級【SubPriority】的配置項及相關(guān)信息。
(資料圖片)
上圖是我基于STM32G4系列芯片的NVIC配置頁面。該系列的內(nèi)核是ARM Cortex-M4。
當我們使用STM32系列芯片并通過CubeMx圖形化工具進行NVIC配置時,相應(yīng)界面有無子優(yōu)先級的配置,取決于該系列芯片所用的ARM Cortex內(nèi)核。如果說所用STM32系列是基于ARM Cortex-M0或M0+內(nèi)核的,在進行NVIC配置時是沒有子優(yōu)先級可以配置的。
ARM Cortex-M0或M0+內(nèi)核的中斷優(yōu)先級控制寄存器實際有效位就是2位,全部用來對各個中斷/異常做搶占優(yōu)先級配置,不額外劃分子優(yōu)先級的配置。
也就是說,基于ARM Cortex-M0或M0+內(nèi)核的STM32 MCU的NVIC配置不會有子優(yōu)先級的概念和配置,對于優(yōu)先級可配置的中斷而言,總共就4個可搶占優(yōu)先級。下圖是基于ARMCortex-M0或M0+內(nèi)核的STM32系列展示。當然,STM32系列涉及的內(nèi)核很多,遠不止下面這些,還有M4/M7/M33等。
而ARM Cortex -M3、M4、M7內(nèi)核的中斷優(yōu)先級配置寄存器的有效位為4位,同時還可以基于該4位做優(yōu)先級的分組,進而引出搶占優(yōu)先級和子優(yōu)先級。
2、為什么基于STM32G0、STM32L0系列芯片里有VTOR而STM32F0系列又沒有?
用過STM32G0、STM32L0系列芯片并做過IAP操作時,會發(fā)現(xiàn)該芯片里是有VTOR中斷矢量偏移控制寄存器的,可基于M0內(nèi)核的STM32F0系列芯片里卻沒有!
其實,M0核與M0+核是有諸多差別的。STM32G0、STM32L0是基于M0+而來,而STM32F0系列是基于M0核而成。基于M0+的STM32芯片里都有VTOR寄存器,而M0核里根本就沒有它。
知道了這點,就不難理解基于STM32F0芯片做IAP時有些地方跟其它系列明顯不一樣。F0系列里要做一次矢量表的拷貝操作。
3、為什么基于Cortex-M3/M4的STM32芯片組織的用戶代碼移植到基于Cortex-M0/M0+的STM32芯片時為何會發(fā)生對齊錯誤?
這是因為基于Cortex-M3/M4的STM32芯片對數(shù)據(jù)訪問的對齊要求不那么嚴格,即使非對齊訪問也可以支持,當然可能會犧牲訪問效率。而對于Cortex-M0/M0+的芯片則明確不支持對數(shù)據(jù)的非對齊訪問。顯然,我們設(shè)計代碼時盡量遵循對齊訪問便于移植。
因為內(nèi)核的差異導(dǎo)致我們在應(yīng)用上的誤解或誤用,這也是常有的事情。我這里剛好就最近某STM32用戶咨詢的問題稍作整理,順便做個簡單分享。
下面是部分Cortex-M內(nèi)核的NVIC特性差異對照表,有興趣的話可以看看。
該表格是我從The Definitiveguide to ARM Cortex-M0 and ARM Cortex-M0+ Processors文檔里提取而來,分享給大家算是借花獻佛。
4、能不能在CubeMx配置界面將DMA中斷的默認使能關(guān)閉?
這里再順便分享一個跟CubeMx配置有關(guān)的話題。目前來看,我相信對不少人還是有幫助的!
我們在使用CubeMx對STM32芯片做初始化配置過程中,當開啟某些外設(shè)的DMA功能時,CubeMx會默認開啟相關(guān)DMA的中斷使能。說實在,這個做法很多時候是必要的、有用的。但有時我們可能并不需要開啟相關(guān)DMA中斷,甚至會因為這個默認開啟而給我們帶來調(diào)試上的困擾。
有些人不知如何基于CubeMx配置界面來關(guān)閉這個默認的DMA中斷使能。其實很簡單,就在上面提到過的NVIC配置界面里,將Force DMA channel…前的勾選項拿掉即可。見下面操作流程示意圖。
OK,今天的分享就到這里。也愿您有所收獲,下次再聊!
審核編輯:湯梓紅
標簽: