Hard Fault Exception using STemWin & STM32F446ZE
有一個在STM32F446ZE上使用STemWin遇到的問題想請教如下列程式,使用DRAW_SCENE()做display LCD update,用Timer做次數計數unsigned char _strtmp;unsigned int Timer = 0;void DRAW_SCENE(){ sprintf(_strtmp,"%5d:", Timer); GUI_DispStringAt(_strtmp, 80, 155); Timer++;}程式除了LCD外,有跑餵固定數值做輸入的演算法,而每次都會在Timer= 1127時,當程式跑到” GUI_DispStringAt(_strtmp, 80, 155);”時,產生Hard Fault進入HardFault_Handler,這時的register如下:CFSR = 0x00000100 - IBUSERR = 1 =>指令總線錯誤 存访问错误 - STKERR = 0HFSR
- FORCED = 1 而不跑演算法則不會Hard fault,stack usage %不高可請教可能的原因為何?!
仅为猜测:算法是否使用了FPU计算单元,实MCU侧未开启FPU功能。 andeyqi 发表于 2017-8-29 16:28
仅为猜测:算法是否使用了FPU计算单元,实MCU侧未开启FPU功能。
在stm32f446xx.h中 "#define __FPU_PRESENT1U/*!< FPU present */ ",IAR中FPU選擇 VFPv4 single precision。這樣FPU應該開啟了?! 另外,trace進入hardfault發生所在的assembly code: BL 0x81a933c 而memory placement中僅用到0x8000000 – 0x80ffff,但在hardfault發生之前,程式仍可正常執行BL 0x81a933c這行指令(這是第一個疑惑之處)。
而hardfault的發生就出在執行BL 0x81a933c卻跑到0x3a9dd118,因此產生IBUSERR = 1的hardfault exception
其它觀察到的現象如下:
1) 試著將emWin配置的size(#define GUI_NUMBYTES(1024) *110 //x KByte,static U32 extMem;),調大或小, 發現 20/40/80K hard fault的timer count一致,而110K count較小就發生hardfault
2) 僅使用一個100Hz I2C取sensor data的timer,在main loop中僅有emWin及演算法,按鍵。單獨測試emWin不會hardfault,單獨測試演算法也不會hardfault,但兩塊一起跑就hardfault!
页:
[1]