CubeMX + LL API で TIM1 から PWM 出力が出ない?
STM32マイコン、はじめました。躓きました。
あまりメジャーでなさそうな組み合わせの、CubeMXとLL APIでPWM信号を出力しようとしたのですが、まる一日悩んでしまいました。
結論としては、原因はTIM1が他のタイマと一部異なる設定が必要なことで、LL_TIM_EnableAllOutput関数を呼ぶと(BTDRレジスタのMOEビットを立てると)解決しました。LL APIのサンプルはこの関数を呼んでいないので、もしかするともっと根本的な解決方法があるかもしれません。
(HAL APIだとちゃんとPWM信号を出せるのですが、内部にある大量のif文と引数チェックを見てアレルギーを起こしました。もっと高級なプログラム書く様になったら使います。)
環境
- STM32F334R8 + ST-Link v2 (Nuculeo Boardのやつ)
- STM32CubeMX (version 4.26.0)
- STM32Cube V1.0
CubeMXの設定
プログラム
CubeMXが生成したプロジェクトの main.c 内、下の様に書き加えました。理由はまだ分かっていないのですが、LL_TIM_EnableAllOutputs()関数を呼ばないと、カウンタが動いていてもPWM出力がされないみたいです。
今分かっていること
2018/07/08 タイマ設定用レジスタの一つ、BDTRのMOEビットが間接的な原因になっていると考えています。Referenceでこのビットが出力をOn/Offする機能を持っていることが触れられていま。LL_TIM_EnableAllOutputs()はこのビットを立てる関数です。 この例ではTIM1を使っていたのですが、サンプルではTIM2を使っていたためMOEビットの扱いがよく分からなかったのかもしれません。。こちらの記事に、TIM1とTIM15を特別扱いしなければいけない例がありました。 https://qiita.com/kanehara/items/119b554703bf4273d35b こちらにも有りました。これを見て原因が大分分かったかも。 http://blueeyes.sakura.ne.jp/2017/12/29/729//* USER CODE BEGIN 2*/
LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1);
LL_TIM_EnableCounter(TIM1);
LL_TIM_EnableAllOutputs(TIM1); // これが無いと動かない
/* USER CODE END 2 */
この追加部分は、STM32Cube内のサンプルプログラムを参考にしました。Windowsであれば、
C:\Users\(ユーザ名)\STM32Cube\Repository\(該当するライブラリ)\Projects\(該当するボードやマイコン)\Examples_LL\TIM\TIM_PWMOutput
あたりに入っています。
結論→LL_TIM_EnableAllOutputs()を使うと何故か動く
一応動いた訳ですが...一体何が原因なのか...
もし知っている方がいらっしゃったら、コメントで教えて下さると嬉しいです。僕の睡眠の質が格段にアップします...