這里就STM32用戶咨詢到的幾個問題,稍加整理分享出來供君參考。
第1問:我目前使用STM32G0B1,代碼里有設計BOOT代碼,想在跳轉(zhuǎn)前清理各類使用過的外設寄存器。請問STM32有沒有復位所有外設寄存器的函數(shù)?
答:其實,每個STM32系列都有相關(guān)寄存器和應用函數(shù)用來針對指定外設或掛在指定總線上的外設進行批量復位,即令其回歸到初始復位狀態(tài)。以STM32G0系列為例,在STM32HAL庫里就有類似下面的各種實現(xiàn)函數(shù)。
關(guān)于這個話題可以參考本公眾號另外一篇文章《話說STM32外設復位》,那里有更多詳細解讀,此處就不再贅述。
第2問:我在使用STM32F730的時候,如果SRAM設置到0x20010000 - 0x2001FFFF之間,DMA傳輸流程都對,但是SPI輸出的數(shù)據(jù)不對,這是怎么回事?另外,在用USB的bulk傳輸?shù)臅r候也是,數(shù)據(jù)有時是對的,有時候錯的。
如果SRAM的緩沖區(qū)設置到0x20000000-0x2000FFFF之間的時候,就一切正常。請問這是什么原因?
答:現(xiàn)在問題是,只要代碼使用的RAM內(nèi)存鎖定在0x20000000-0x2000FFFF之間時功能都正常,只有使用到0x20010000之后的RAM才有異常。結(jié)合他使用的芯片STM32F730,基于ARM Cortex-M7內(nèi)核的,芯片里有高速L1 Cache。同時,他的代碼里還用到了DMA。這樣看來,如果他的代碼啟用了D-Cache,用到2個主設備【CPU和DMA】,如果沒有針對D-Cache的使用做合理的配置,就很可能發(fā)生數(shù)據(jù)一致性方面的問題。經(jīng)用戶的進一步反饋,他的代碼里也的確使用了D-Cache。
進一步的問題就是,為什么這里不能使用0x20010000之后的區(qū)域呢?為探究竟,我們有必要看看STM32F730相關(guān)的參考手冊。
經(jīng)查證,0x20000000-0x2000FFFF區(qū)間是屬于DTCM區(qū),CPU訪問它時不使用D-Cache,即CPU每次訪問DTCM時都是直接訪問,當然DMA是不能使用D-Cache的。這時自然不會產(chǎn)生數(shù)據(jù)訪問的一致性問題。而0x20010000~0x2001FFFF區(qū)域是經(jīng)AXI接口訪問的,默認情況下,CPU訪問這塊區(qū)域是可以使用D-Cache的【前提是使能了D-Cache】。
也就是說當我們使用到0x20010000之后的RAM區(qū)域時,CPU訪問這塊可以啟用D-Cache。如果DMA也訪問這塊,若不對該區(qū)域做合理存儲屬性配置或適當操作就可能發(fā)生數(shù)據(jù)一致性問題。此時我們可以對相應RAM區(qū)域做MPU配置,將其配置為Shareable 且NonCacheable屬性。或在代碼里適時地使用針對Cache的清除或無效操作。關(guān)于MPU如何配置,這里不做展開,有興趣的可以進一步了解。本公眾號里也有多篇相關(guān)文章可供參考閱讀。
第3問:在使用STM32 TIMER事件作為觸發(fā)輸出時,那個RESET信號是怎么回事?跟定時器從模式的RESET 模式有什么關(guān)系?
答:這里的RESET事件特指通過軟件方式對TIMx_EGR寄存器的UG進行置1操作。該操作可以產(chǎn)生1個觸發(fā)信號給到其它外設,比方ADC,DAC或其它TIMER。同時這個RESET操作對當前定時器會產(chǎn)生更新效果或復位效果,具體點說就是產(chǎn)生更新事件,當前計數(shù)器發(fā)生重裝從新開始計數(shù)。
該RESET操作跟定時器RESET從模式有關(guān)系嗎?沒有任何關(guān)系,但有相同的現(xiàn)象或效果。即處于RESET從模式的TIMER收到觸發(fā)信號時,該從定時器也會產(chǎn)生更新事件、計數(shù)器進行重裝計數(shù)。至于給到處于RESET從模式的TIMER的觸發(fā)信號,可以是源于前級TIMER的更新事件、計數(shù)器使能事件、比較事件產(chǎn)生的,也可以是軟件RESET操作產(chǎn)生的。
第4問:在使用STM32 ADC多通道轉(zhuǎn)換時,如果不希望一次性轉(zhuǎn)換完成如何操作?
答: 看情況。如果你選擇使用的多個ADC通道,平常轉(zhuǎn)換順序固定,只是不希望基于掃描模式啟動后就一次性轉(zhuǎn)換完畢,而是分次分批轉(zhuǎn)換完成。這時我們可以考慮使用ADC的分組轉(zhuǎn)換模式。可以參考本公眾號文章《STM32 ADC間斷轉(zhuǎn)換模式應用示例》。
如果你選擇使用的多個ADC通道,使用過程中轉(zhuǎn)換順序隨機,只是想每次就某個通道做轉(zhuǎn)換,不同時刻可能使用不同的通道。本質(zhì)上講,這其實就是單通道轉(zhuǎn)換,在配置時按單通道配置。需要使用哪個通道時,就針對某個通道配置后再做啟動。這點可以參考本公眾號文章《ADC多通道隨機選擇性轉(zhuǎn)換應用示例》。
第5問:在使用STM32片內(nèi)的Vrefint電壓是ADC的參考基準嗎?它有什么用?
答:STM32片內(nèi)的Vrefint電壓不是ADC模塊的參考基準,STM32片內(nèi)ADC的參考基準可以是Vref,或VDDA【多數(shù)時候VDDA跟VDD是接在一起的】,有些系列還可以是VrefBuf電壓。注意不要把Vref、Vrefint、VrefBuf搞混了!事實上經(jīng)常有人弄混。【早期推出的系列STM32片內(nèi)沒有VrefBuf】
Vrefint電壓值一般固定在1.2v左右,波動很小。各STM32芯片數(shù)據(jù)手冊有給出參數(shù)范圍【下圖來自STM32G0系列數(shù)據(jù)手冊】:
至于它有什么用,這要看情況。它只是個備用項、可用項。
我經(jīng)常拿它來驗證ADC功能是否正常,因為其電壓可知且比較穩(wěn)定,無須外邊引線。有些場合,Vrefint作為相對穩(wěn)定的AD輸入,反過來監(jiān)測芯片的VDD,此時ADC模塊的參考電壓VDDA跟VDD是接在一起。有時Vrefint或其分壓可用作片內(nèi)比較器的輸入做其它用途。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5421瀏覽量
123306 -
cpu
+關(guān)注
關(guān)注
68文章
11033瀏覽量
215968 -
adc
+關(guān)注
關(guān)注
99文章
6635瀏覽量
548226 -
STM32
+關(guān)注
關(guān)注
2289文章
11011瀏覽量
362315 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4368瀏覽量
64176
原文標題:STM32應用五問五答
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
【高手問答】第5期——STM32硬件問答?
高手問答匯往期回顧
【高手問答】第9期——張工帶你玩轉(zhuǎn)STM32問答
3G相關(guān)問答錦
分享3個和PCB設計相關(guān)的疑難問答
NVIDIA 知乎精彩問答甄選 | 查看 NVIDIA Omniverse 相關(guān)精彩問答

NVIDIA 知乎精彩問答甄選 | 發(fā)掘 NVIDIA 醫(yī)療行業(yè)相關(guān)精彩問答

NVIDIA 知乎精彩問答甄選 | 查看 NVIDIA Jetson 相關(guān)精彩問答
NVIDIA 知乎精彩問答甄選 | 了解更多關(guān)于 NVIDIA BlueField DPU 相關(guān)精彩問答
NVIDIA 知乎精彩問答甄選 | 分享 NVIDIA 助力醫(yī)學研究的相關(guān)精彩問答

NVIDIA 知乎精彩問答甄選 | 查看關(guān)于 NVIDIA Omniverse 的相關(guān)精彩問答

NVIDIA 知乎精彩問答甄選 | 探索 AI 如何推動工作流升級相關(guān)精彩問答

評論