pin 接腳查看路徑: mini-arm-os/08-CMSIS/platform/f429disco/src
原本以為是 pin 腳有接錯,後來發現在 gdb 上跑也跑不出結果
用 gdb 跑的時候發現會卡在 default handler
Ctrl-C
先把他 trap 下來,看一下 register 的狀態
r0 0x20000478 536872056
r1 0x20000014 536870932
r2 0x0 0
r3 0x20000454 536872020
r4 0x0 0
r5 0x0 0
r6 0x0 0
r7 0x2002ff74 537067380
r8 0x0 0
r9 0x0 0
r10 0x0 0
r11 0x0 0
r12 0x40000000 1073741824
sp 0x2002ff74 0x2002ff74
lr 0xfffffff9 -7
pc 0x8000b00 0x8000b00 <default_handler+4>
xpsr 0x41000003 1090519043
msp 0x2002ff74 0x2002ff74
psp 0x20000478 0x20000478 <heaps+1000>
control 0x0 0 '\000'
faultmask 0x0 0 '\000'
basepri 0x0 0 '\000'
primask 0x0 0 '\000'
發現 lr
是 0xfffffff9
,從 M3 Guide 的 Table 9.3 知道接下來會回到 thread mode,然後使用 main stack,所以再來要看到 msp 的地方。
當 exception 發生的時候,一些 registers 會被壓到 stack 裡面,Exception and Return 有寫說 lr
會被存在 sp+0x14
的地方
用 x/i $msp+0x14
看一下,得到結果
(gdb) x/i $msp+0x14
0x2002ff88: movs r0, r0
再來就想不到要往哪個方向找了@@
Hard Fault Status Register 在 0xE000ED2C
,把他印出來會得到
(gdb) x/wx 0xe000ed2c
0xe000ed2c: 0x40000000
從說明文件可以知道在這裡的 Hard fault 是因為 Bus fault,MemManage fault 或是 Usage fault 才產生的。
接下來檢查這三種的 status register,看是否有問題
發現只有 MMSR 的內容是非零
(gdb) x/b 0xe000ed28
0xe000ed28: 0x01
看起來是 IACCVIOL 被設成 1 了。