はじめに
STM32CubeMXやSTM32CubeIDEでFreeRTOSを組み込んだプロジェクトを作成し、
ブートローダから起動させるとHardFaultになることが有ります。
void HardFault_Handler(void)
{
while (1)
{
}
}
原因
FreeRTOSはSysTickによってOSを動かしています。
ブートローダでSysTick割り込みを有効にしたままアプリをロードしてしまうと、FreeRTOSの初期化に到達する前にSysTick割り込みが起こり不正メモリアクセスでHardFaultになります。
対策
ブートローダでアプリをロードする前にSysTickを停止させます。
...
HAL_SuspendTick();
JumpToAPP();