問題 「マイコンからPWMが出ない」
解決 「STM32Cubeで生成し直す度に初期化されること」
問題
唐突な話,どこの家にでも落ちているサーボモータを動かすことになった. しかし,使い慣れたAVRでやるのも芸が無い.折角なのでSTMとHAL_Driver も使ってみた.
(数日経過) ダメでした.突っかかる所が山ほどあるもの. 環境構築*1,定番のLチカまでは出来たが,最後のとこで止まってしまった.
サーボを動かすためのPWMがマイコンから出てこない.
解決
結論から言うと,
「タイマー初期化関数内のローカル変数 "sMasterConfig", "sConfigOC" の消し忘れ」
が原因だった.
この開発環境でPWMを生成するためには,関数 "MX_TIMx_Init(void)" 内のローカル変数
"sMasterConfig"
"sConfigOC"
つまり,以下のコードのように元の変数をコメントアウトするなり,消すなりしなければならない.
static void MX_TIMx_Init(void) //xはタイマーNO { TIM_ClockConfigTypeDef sClockSourceConfig; //TIM_MasterConfigTypeDef sMasterConfig; //TIM_OC_InitTypeDef sConfigOC; //以下省略 }
しかし,何らかの仕様変更で再度 STM32Cube からプロジェクトを再度生成し直す.
すると,以下のコードのように元に戻ってしまう.
static void MX_TIMx_Init(void) //xはタイマーNO { TIM_ClockConfigTypeDef sClockSourceConfig; TIM_MasterConfigTypeDef sMasterConfig; TIM_OC_InitTypeDef sConfigOC; //以下省略 }
これは,STM32Cube*3でプロジェクトを吐くごとに,"main.c" 内のコードは,一部を除きrewriteされるという仕様があるからだ. 結果,STM32Cubeでピン設定をしたのにも関わらず PWM が出なかった.
つまり,PWMを出す場合は
STM32Cubeからプロジェクトを生成する(し直す)度に関数 "MX_TIMx_Init(void)" 内の "sMasterConfig", "sConfigOC" を消し直す必要がある
原因は単純だったが,ソフトに関連したものであったため発見するに時間を要した.