NUCLEO_F411RE から PWM が出ないのでdebugしてみた (Eclipse + STM32CubeMX + SW4STM32+HAL_Driver)

問題 「マイコンからPWMが出ない」

解決 「STM32Cubeで生成し直す度に初期化されること」

問題


唐突な話,どこの家にでも落ちているサーボモータを動かすことになった. しかし,使い慣れたAVRでやるのも芸が無い.折角なのでSTMとHAL_Driver も使ってみた.

(数日経過)   ダメでした.突っかかる所が山ほどあるもの. 環境構築*1,定番のLチカまでは出来たが,最後のとこで止まってしまった.

サーボを動かすためのPWMがマイコンから出てこない

 

解決


結論から言うと,

「タイマー初期化関数内のローカル変数 "sMasterConfig", "sConfigOC" の消し忘れ」

が原因だった.

この開発環境でPWMを生成するためには,関数 "MX_TIMx_Init(void)" 内のローカル変数

  • "sMasterConfig"

  • "sConfigOC"

グローバル変数にする必要がある.*2

つまり,以下のコードのように元の変数をコメントアウトするなり,消すなりしなければならない.

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" を消し直す必要がある

原因は単純だったが,ソフトに関連したものであったため発見するに時間を要した.

*1:環境構築については,後日記事にするかも.方法については多くの方々が記事にしているので調べてみてね

*2:この関数は,STM32Cubeから生成された "main.c" 内にある.また,"sConfigOC"でPWMのパルス幅を設定する

*3:ピン設定が反映されたプロジェクトを吐いてくれるソフト.このおかげで今までデータシートを見ながらせっせとレジスタをいじくる作業を劇的に改善してくれた.