前回の記事で構築したSTM32開発環境(PlatformIO+STM32CubeMX)は初期状態ではFPUが無効になってます
本記事ではFPUの有効化方法とその他やっておくべき設定について解説します

FPUの有効化方法
FPUはCCFLAGSとLINKFLAGSに以下オプションを設定することで有効になります
-mfloat-abi=hard
-mfpu=fpv4-sp-d16
PlatformIOにてオプションを追加する方法は以下の通りです
- 外部スクリプトファイルを作成
- 作成した外部スクリプトファイルをplatformio.iniに追加(extra_scripts)
CCFLAGSとLINKFLAGSにオプションを追加するスクリプトファイルを作成します
スクリプトファイルのひな型はPlatformIOのドキュメントページを参考にしました
Import("env")
#
# Dump build environment (for debug)
# print(env.Dump())
#
flags = [
"-mfloat-abi=hard",
"-mfpu=fpv4-sp-d16"
]
env.Append(CCFLAGS=flags, LINKFLAGS=flags)
platformio.iniはプロジェクトフォルダ内にあります
以下が設定例です(extra_scripts = pre:[スクリプトファイル名]で指定します)
[env:nucleo_g474re]
platform = ststm32
board = nucleo_g474re
framework = stm32cube
build_flags = -Wl,-Map,output.map
board_build.ldscript = STM32G474RETX_FLASH.ld
extra_scripts = pre:extra_script.py
monitor_speed = 115200
[platformio]
include_dir = Core/Inc
src_dir = Core/Src
FPUが有効になっているかどうかの確認
sinf関数を実行したときの逆アセンブルを確認してFPUが有効になっているかどうかを判定しました
FPU有効後はVMOV、VLDR、VSUB、VNEGといったfloating-point命令が使用されています
・FPU有効化前

・FPU有効化後

その他の設定について
本記事に乗せたplatformio.iniについて、プロジェクト生成時より一部手を加えているのでついでに説明します
ビルド後にROM/RAMのマッピング情報をoutput.mapとして出力します
build_flags = -Wl,-Map,output.map
STM32CubeMXのデフォルト設定が115,200bpsになっているのでシリアルモニタを使う場合は設定が必要です
(基本tera termを使うのであまり意味はなさそうですが・・・)