確認 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 的地方。

4. 當 exception 發生的時候,一些 registers 會被壓到 stack 裡面,[Exception and Return](http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0497a/Babefdjc.html) 有寫說 `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 了。
