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