久しぶりの投稿です。
とっても短いページになる予定です。
#事の始まり
そろそろ後輩にいろいろ教えないとと思って、相変わらず手抜きの資料集めをしたのですが
PWM, Encoderモードについて、その値を構造体で直接いじっている記事が多すぎる…
やめてやめて~~
#Timer
というかこれに関する記事しかない。
###PWM
みなさん、PWMのDuty比を設定するときにどうしてますか??
まさか htim1->Instance->CCR1=<Duty>;
とかしてないですよね??
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, <duty>);
ですよですよ??
###Period
たまに、タイマのPeriod値(CubeMXで設定したタイマの最大の値)が欲しいときがあるでしょう。
この時は
__HAL_TIM_GET_AUTORELOAD(&htim1);
を使いましょう。
###Encoder mode
はい。一番事故ってる記事が多いのがこれ。
エンコーダ値の読み方がわからなかったからと
cnt=htim1->Instance->CNT;
って人が大多数!!
__HAL_TIM_GET_COUNTER(htim1);
ですね。。
###タイマについてのまとめ
それぞれの使用法について特化して書きましたが、実は上記のマクロは使い方に寄りません。
例えば、COUNTERはそのままカウンターのことですから、ただのカウントアップとして(HAL_TIM_Base_Start())使う場合でも使いますし、
コンペアマッチモードではCOMPAREを使うでしょう。
また、もちろんSETがあれば、GETがありますし、vice versa。
#こんなこと言ってる理由
いや、構造体直接引っ張り出したらHAL Driverの意味を消失してるのでは。。
HALってなんでこんなにいろんな名前長いんだろーってのは、誰が読んでも何してるのかわかるため、ですよね?可読性というやつですか?
だから、直でレジスタをたたくようなところを関数なりマクロでコーディングしているわけですから、もうちょっとSTさんの意向をくみ取りましょう。
#注記
他の機能についても同じようにマクロがあるはずです。
HALのドキュメントUM1725(このリンクはforF4)では
機能ごとに分かれて、順に
- 設定用などの構造体
- 手順(ここが弱い)
- 関数
- マクロ・列挙体(構造体に代入する設定項目など)
が、並んでいます。
もし、やりたいことが、関数になかった場合はマクロを探してみてください。
逆に関数にある場合(割り込みの許可不許可など)は関数を積極的に使うようにします。
直接レジスタたたいたり、構造体をいじるならHALはいらないよね?
#相互リンク(随時更新@2020/03/09)
【手抜き】STM32の使い方まとめ
(まだない記事は今後変更の可能性があります)
- 0.STM32のご説明
- 1.STM32CubeIDEの導入とLチカ
- 2.GPIOでデジタル入力
- 3.STM32CubeIDEの日本語化
- 4.STM32CubeIDEでGit
- 5.標準タイマを使う
- 6.タイマ割り込みで等時間制御
- 7.PWM波形の出力
- 8.I2CのMemWrite/Read()
- 8.Encoderモードの使い方
- 9.UART~送信:DMAとprintf少数表示まで~
- 10.MCSDKでブラシレスモータを回す
- 11.RS485
- 12.CAN
- 13.STM32CubeIDEでデバッグ
- 番外. 「私、マクロを使えって言ったよね!?」
- 番外.STM32CubeIDEと日本語の文字化け