マイコン上でCプログラムを動かせるようにするためには色々な設定が必要だが、最近は自動生成コードに大体のことが書かれている。ただ、スタックポインタの設定が見当たらなかったのが気になったので調べてみた。
スタックポインタの設定
STM32では、起動後 CPUが0x0000 0000の値をスタックポインタ(R13レジスタ)に格納する。
0x0000 0000から始まる領域には、リセットまたはリセット解除後またはスタンバイからの復帰後のBOOT0,1ピンの設定でMain Flash, SRAM, システムメモリ(出荷時にブートローダが書かれている)のいずれかがマップされる。
スタックポインタのアドレスは、STM32Cubeで自動生成されるstartup_stm32*.s内のベクタテーブルの先頭__initial_spで設定されている。
stm32f072xb.s
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
マイコンによっては明示的にSPを設定する必要があるが、STM32ではCPUが勝手にやってくれることが分かった。