STM32マイコンのHALライブラリは移植性が高く、STM32FxxやSTM32Lxxといったシリーズを超えた場合でもほぼそのままのコードで動かすことができます。シリーズによっては一部の関数で引数が増えていたり、設定が異なっているものもありますが、多くはそのまま移植することができます。ただ、時々、移植してもうまく動かない、同じシリーズでも動作しないといった場合があります。そのような場合はコードの分かりずらい箇所で設定が違っていたり、コード以外の設定が違って動かないということがあります。
今回はコード移植時にうまく動かない場合のチェック項目について紹介します。これまでの経験でよくあるコード移植時の設定漏れをリストにしてみました。
@リンカスクリプト
プロジェクトフォルダ直下にSTM32Fxxxxx_FLASH.ldファイルがあります。メモリ配置を設定するスクリプトでSDRAMやSRAM、密結合メモリ等の設定をしています。また、HeapサイズやStackサイズを定義しています。サイズが異なる場合にメモリを確保できず、エラーとなっている場合があります。
Aスタートアップファイル
プロジェクトフォルダ直下のstartupフォルダにstartup_stm32fxxxxx.sファイルがあります。起動直後に呼び出される処理が記載されています。稀に初期化処理や割込み処理を意図的に変更している場合があります。
Bプリプロセッサ
SW4STM32の場合、プロジェクトのプロパティから[C/C++ Build]→ [Settings]→ [Tool Settings]→ [MCU GCC Compiler]→ [Preprocessor] の定義を確認します。うまく動くプロジェクトと比較して抜けがないか、確認します。コード上で定義(#define)せずにここで定義している場合があります。定義項目が抜けているとコードが部分的に除外され、挙動や動作が異なる場合があります。必要に応じて追加します。
C割込み
プロジェクト直下のsrcフォルダ内のstm32fxxx_it.cファイルに割込み処理の設定がされています。よくある移植時の設定ミスとして、タイマの割込み関数内に直接、割込み関数が定義されている場合があります。また、割込み設定がされておらず、関数自体がない場合もあります。特にHAL_Delayが動作しない、HAL_Delayで停止してしまう場合はstm32fxxx_it.cファイル内にSysTick_Handler関数が定義されているか確認します。合わせて、SysTick_Handler関数内にHAL_IncTick関数が呼び出されているか確認します。
WinMerge等でプロジェクトフォルダを丸ごと比較できる場合は移植時のミスに気づきやすいですが、フォルダ内の構造が違っていたり、異なるシリーズに移植した際はファイル名が異なるため、単純比較できないということも多々あります。このような場合に上記の項目について確認すると漏れに気づくことが多いです。他にもよくある漏れがあれば追記したいと思います。