CPU :STM32f103rct6 編譯器 :MDK5.20; 調試工具:ULINK2
主板上電后鏈接ULINK,SW接口可以鏈接、可以下載程序,偶爾出現cannot access target shutting down debug session
錯誤提示。 程序運行后,進入hardfault錯誤處理函數。
1 Cortex-M3/4的Fault簡介 Cortex-M3/4的Fault異常是由于非法的存儲器訪問(比如訪問0地址、寫只讀存儲位置等)和非法的程序行為(比如除以0等)等造成的。常見的4種異常及產生異常的情況如下: Bus Fault:在fetch指令、數據讀寫、fetch中斷向量或中斷時存儲恢復寄存器棧情況下,檢測到內存訪問錯誤則產生Bus Fault。 Memory Management Fault:訪問了內存管理單元(MPU)定義的不合法的內存區域,比如向只讀區域寫入數據。 Usage Fault:檢測到未定義指令或在存取內存時有未對齊。還可以通過軟件配置是否檢測到除0和其它未對齊內存訪問也產生該異常,默認關閉,需要在工程初始化時配置: Hard Fault:在調試程序過程中,這種異常最常見。上面三種異常發生任何一種異常都會引起Hard Fault,在上面的三種異常未使能的情況下,默認發生異常時進入Hard Fault中斷服務程序。使能前三種異常也要在初始化時配置:
cortex-m3內核出現HardFault_Handler故障的原因主要有兩個方面: 1、內存溢出或者訪問越界。這個需要自己寫程序的時候規范代碼,遇到了需要慢慢排查。 2、堆棧溢出。增加堆棧的大小。
1)在stm32f10x_it.c中的hardfault處理函數中設置斷點,當發生hardfault時進入斷點。
void HardFault_Handler(void){ /* Go to infinite loop when Hard Fault exception occurs */ while (1) { }}2)當進入Hard Fault斷點后,菜單欄Peripherals >Core Peripherals >Fault Reports打開異常發生的報告,查看發生異常的原因:
3)查看發生錯誤代碼地址: Cortex‐M3 在進入異常服務例程時,自動壓棧了 R0‐R3, R12, LR, PSR 和 PC,并且在返回時自 動彈出它們,通過讀取 PSP 的值, OS 就能夠獲取用戶應用程序使用的堆棧,進一步地就知道了在發 生異常時,被壓入寄存器的內容。
新聞熱點
疑難解答