STM32F303のTIM1でPWMに苦しんだメモ

この記事は個人的な所感・メモです。いつもとは違って「だ、である」調になり、文体も荒ぶるかもしれません。ご了承を。
あと、場合によっては追記します。ご参考にどうぞ。もちろん、「違うぞ!」って言う内容についてはぜひご指摘ください。

目的・やること

TIM1 を使ってみた。というのも、次のマイクロマウス制作でどうしても TImx_CHyN のピンを使わなければならなくなったため。これについて TIM1 で実験。

苦しみ

できない。何度やっても無理。PWM 出力について、他の TIM2 とかと同じように設定したのだが、何も出力されない。何故だ。
GDB にて、TIM1->CNT の値を見てみたが、しっかりとカウントアップされている。。。

原因がわかった。やはり CubeMX はこうやって行き詰まった時に答え合わせとして使うのが良いのだな。これまで DAC の時にも答え合わせとしてめっちゃお世話になった。ありがとう。
どうも TIM1->BDTR の MOE ビットをセットする必要があるっぽい。萌え〜〜〜
これで解決。やはり前例があまり無いマイコンの設定(STM32 で CubeMX やライブラリを使わないものが見当たらず)はこういう所で苦労が多い。つらいことつらいこと。でも毎度のことだが、これで忍耐力はめちゃついていると思う。成長の証。

チャネルの N について

多分 Negative 出力。実験してみよう。以下では TIM1->CCER のアクティブ時の挙動は一切いじっていない(リセット状態)。そして PWM1 モードとする。
なお PWM1 モードというのは、最初は出力アクティブ(上の CCER 設定だと通常のチャネル出力は High で始まるはず)、CCRx を超えたら非アクティブとなるモードである。

CH1 のみ出力設定してみる

当然ながら、TIM1_CH1N には出力されず。

CH1N のみ出力設定してみる

逆出力が得られるのかな〜と思ったが、ところがどっこい。なんと最初 High が得られた。。。。。

CH1 と CH1N の両方を設定してみる。

ピコピコとまるで2石マルチバイブレータ状態。この時は CH1 がデフォで High、CH1N がデフォで Low だった。。。

CH1 と CH1N に関して結論

多分両方設定している時に逆になる。これが多分相補 PWM モード。多分。

あとでユーザーマニュアルよく読もう。うん。

以下、追記となります。

TIM1 の割り込み関数について一部だけ(2018/2/24 追記)

TIM2 や TIM3 は割り込み関数の名前が TIM2_IRQHandler ですが(スタートアップファイル参照)、TIM1 では少し様子が異なります。スタートアップファイルから関連している部分を抜き出してみると…

    .word   TIM1_BRK_TIM15_IRQHandler
    .word   TIM1_UP_TIM16_IRQHandler
    .word   TIM1_TRG_COM_TIM17_IRQHandler
    .word   TIM1_CC_IRQHandler

となっており、一重に TIM1 の割り込みと言っても、そのジャンプする関数にはいろいろな種類があるということがわかります特に上3つは TIM1 の各種割り込み要因と他のタイマで関数を共有しているのが特徴です。なんかすっごく気持ち悪いですが。

名前と照らし合わせると CCRx でのコンペアマッチ時の割り込みは TIM1_CC_IRQHandler で、タイマ更新時(周期レジスタとカウントの値が一致し次のクロックでカウントが零に戻る時)は TIM1_UP_TIM16_IRQHandler となっています(UP はおそらく UPDATE)。これらの区別は実際にコードを書いて実験済みです。というかこのせいで小二時間ハマっていました、トホホ。

また、NVIC_EnableIRQ() で割り込み有効化すると思うのですが、ここでも割り込み要因が区別されているのでご注意を。以上です。

NVIC_EnableIRQ(TIM1_CC_IRQn); // コンペアマッチ時
NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); // カウンタ更新時