確認 mini-arm-os 的 "08-CMSIS" 能在 STM32F429i-Discovery 實體運作 === pin 接腳查看路徑: mini-arm-os/08-CMSIS/platform/f429disco/src ::: warning 原本以為是 pin 腳有接錯,後來發現在 gdb 上跑也跑不出結果 ::: ## 參考資料 * [Program STM32F4 with UART](http://stm32f4-discovery.net/2014/09/program-stm32f4-with-uart/) * [Get started with the STM32F4 on Ubuntu Linux](http://vedder.se/2012/07/get-started-with-stm32f4-on-ubuntu-linux/) ## 遇到的問題(還沒整理) 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. 發現 `lr` 是 `0xfffffff9`,從 [M3 Guide](https://www.eecs.umich.edu/courses/eecs373/labs/refs/M3%20Guide.pdf) 的 Table 9.3 知道接下來會回到 thread mode,然後使用 main stack,所以再來要看到 msp 的地方。 ![](https://i.imgur.com/aWYjJ4z.jpg) 4. 當 exception 發生的時候,一些 registers 會被壓到 stack 裡面,[Exception and Return](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Babefdjc.html) 有寫說 `lr` 會被存在 `sp+0x14` 的地方 ![](https://i.imgur.com/yvYLqts.jpg) 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 才產生的。 ![](https://i.imgur.com/kTbQdxU.jpg) 接下來檢查這三種的 status register,看是否有問題 * Bus Fault Status Register: 0xE000ED29 * MemManage Fault Status Register: 0xE000ED28 * Usage Fault Status Register: 0xE000ED2A ![](https://i.imgur.com/pZiyTuv.jpg) 發現只有 MMSR 的內容是非零 ``` (gdb) x/b 0xe000ed28 0xe000ed28: 0x01 ``` 看起來是 IACCVIOL 被設成 1 了。 ![](https://i.imgur.com/8Qrsfyl.jpg)