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