有人使用STM32芯片從事產品開發,代碼中有涉及到除以0操作。他們發現基于相同的代碼,使用不同IDE會出現不同結果。在IAR或ARM MDK環境下除以0操作所得結果為0,而在STM32CubeIDE環境下的運行時則產生HardFault異常。他們對這個結果感覺很奇怪,甚至懷疑是不是CubeIDE環境有bug。
根據ARM內核相關手冊描述,關于除以0事件或非對齊訪問事件是否進行捕捉并觸發異常是可以配置的。如下圖所示:
其中,除以0事件由內核的配置控制寄存器CCR的DIV_0_TRP控制。該位清0時,系統不對除以0事件觸發異常,結合下面截圖描述得知,此時硬性返回0值作為結果。
也就是說,只有控制位配置為1并發生除以0事件時才觸發異常。另外,上圖最后一句明確說明,復位后該位值為0.
結合客戶的描述,感覺在ARM MDK和IAR環境下,該位默認值或者說復位值為0,而STM32CubeIDE環境下該位復位默認值則為1。這似乎有點說不通。因為這個默認復位值應該是跟著內核芯片走,不會跟著開發環境走。【用戶代碼一樣】
我隨手找個STM32開放板,先基于IAR環境做了個測試。在測試代碼里制造了除以0事件,的確沒有觸發異常,而且還返回了結果0。查看IAR開發環境下了SCB->CCR->DIV_0_TRP控制位,如下圖所示,其值為0。結合內核資料描述,這點跟測試結果吻合。
我嘗試將該控制位改為1后再運行除以0代碼,立即觸發異常。如下圖所示:
當我將測試代碼轉到CubeIDE去調試,也馬上觸發異常,并明確提示發生除以0事件。
順便在SFR寄存器里查看SCB->CCR->DIV_0_TRP位的值,果真是1,見下圖:
我在用戶代碼里并未對該控制位進行改寫,按理其復位值應該是0。難道哪里改寫它了?
我嘗試到STM32CubeIDE的用戶手冊UM2609找找,看看能否找到相關信息。在里面搜索DIV_0還真找到相關信息了。
這里的文字表明,調試狀態下關于除以0事件的異常捕獲是默認使能的,目的是為了幫助用戶在調試時及時發現除以0異常。這個說法沒毛病,問題是在哪里對其使能置位的呢?ARM內核復位后可是清零了的。
繼續查找相關信息,看到了該段文字上方有個截圖,如下圖所示:
從上圖可以看出,關于除以0操作或非對齊訪問是否觸發異常,這里可以選擇配置。在STM32CubeIDE調試狀態下,除以0操作的異常捕獲默認被使能,基于該配置并在工程啟動時借助調試部件修改了相關寄存器。
當我把這個地方取消勾選后,使用前面相同代碼做驗證調試,此時不再觸發異常并返回0值結果。到此,也就解釋了發生除以0操作時,為什么STM32CubeIDE會出現與MDK、IAR不同的調試結果。
顯然,STM32CubeIDE默認調試狀態下使能除以0事件的捕獲,這樣的確便于我們在調試時就能及時發現除以0事件,若是不該出現的,趕緊查錯糾錯,避免其發生。如果是允許出現的特別應用場景,調試時可以通過CubeIDE配置關閉其異常捕獲。
相比其它IDE,STM32CubeIDE在這個地方顯得更為方便些。我們只需基于調試環境做簡單的勾選即完成修改,每次程序啟動時即生效,在IAR、ARM MDK環境下往往需要事先添加用戶代碼修改SCB->CCR寄存器內容。
講到這里,我要特別提醒下,對于除以0事件或對齊事件的捕獲與否,最終取決于用戶代碼。
STM32CubeIDE只是在調試狀態下根據配置修改了相關控制寄存器位,不等于用戶代碼對其做了修改。
前面提過,除以0事件相關寄存器控制位復位后默認值為0,即默認不觸發除以0異常。如果說CubeIDE的調試配置跟其芯片復位后默認值一致倒沒什么,如果CubeIDE里的調試配置是使能除以0異常的捕獲,而在用戶代碼里卻沒有相應實現代碼,這時代碼運行若有除以0事件,調試時自然可以發現,但全速運行時還是不會觸發異常【此時代碼運行脫離了調試組件】。所以,要保證全速運行時也能對除以0事件進行異常捕獲,我們終究還得在用戶代碼里對SCB->CCR寄存器的DIV_0_TRP位進行置位。
STM32CubeIDE這里的調試配置為我們提供了方便,同時個人認為其默認的調試配置也是合理的,畢竟并非所有人都知道芯片復位后默認除以0事件不觸發異常,當然,一般來講編譯時會有警告。
-
芯片
+關注
關注
455文章
50851瀏覽量
423904 -
寄存器
+關注
關注
31文章
5343瀏覽量
120425 -
STM32
+關注
關注
2270文章
10901瀏覽量
356195
原文標題:關于除以0異常捕獲的配置話題
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
STM32CubeIDE入門教程 STM32CubeIDE安裝使用教程
![<b class='flag-5'>STM32CubeIDE</b>入門教程 <b class='flag-5'>STM32CubeIDE</b>安裝使用教程](https://file.elecfans.com//web2/M00/46/F4/pYYBAGKXCM6AV5jGAAxPkBro6Ok723.png)
STM32CubeIDE SWV功能介紹
![<b class='flag-5'>STM32CubeIDE</b> SWV功能介紹](https://file.elecfans.com/web2/M00/17/A0/poYBAGFme7yALxotAAAhvjYHoH8415.png)
【STM32CUBEIDE的那些事】第三章:STM32CUBEIDE工程下的ADC DMA配置
![【<b class='flag-5'>STM32CUBEIDE</b>的那些事】第三章:<b class='flag-5'>STM32CUBEIDE</b>工程下的ADC DMA<b class='flag-5'>配置</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeIDE使用
![<b class='flag-5'>STM32CubeIDE</b>使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeIDE的MCU開發
![<b class='flag-5'>STM32CubeIDE</b>的MCU開發](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32CubeIDE所支持的幾個調試小工具及功能
STM32CUBEIDE(1)----安裝
![<b class='flag-5'>STM32CUBEIDE</b>(1)----安裝](https://file.elecfans.com/web2/M00/7D/72/pYYBAGN8Kp-AcNXaAADcCR2hxBY834.jpg)
評論