Try   HackMD

確認 mini-arm-os 的 "08-CMSIS" 能在 STM32F429i-Discovery 實體運作

pin 接腳查看路徑: mini-arm-os/08-CMSIS/platform/f429disco/src

原本以為是 pin 腳有接錯,後來發現在 gdb 上跑也跑不出結果

參考資料

遇到的問題(還沒整理)

  1. 用 gdb 跑的時候發現會卡在 default handler

  2. 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'
    
  3. 發現 lr0xfffffff9,從 M3 Guide 的 Table 9.3 知道接下來會回到 thread mode,然後使用 main stack,所以再來要看到 msp 的地方。

  4. 當 exception 發生的時候,一些 registers 會被壓到 stack 裡面,Exception and Return 有寫說 lr 會被存在 sp+0x14 的地方

  5. x/i $msp+0x14 看一下,得到結果

    ​​​​(gdb) x/i $msp+0x14
    ​​​​0x2002ff88:	movs	r0, r0
    
  6. 再來就想不到要往哪個方向找了@@


Hard Fault Status Register 在 0xE000ED2C,把他印出來會得到

(gdb) x/wx 0xe000ed2c
0xe000ed2c:	0x40000000

從說明文件可以知道在這裡的 Hard fault 是因為 Bus fault,MemManage fault 或是 Usage fault 才產生的。

接下來檢查這三種的 status register,看是否有問題

  • Bus Fault Status Register: 0xE000ED29
  • MemManage Fault Status Register: 0xE000ED28
  • Usage Fault Status Register: 0xE000ED2A

發現只有 MMSR 的內容是非零

(gdb) x/b 0xe000ed28
0xe000ed28:	0x01

看起來是 IACCVIOL 被設成 1 了。