クラス設計をしよう - STM32 Timer編

1. クラス内でする処理を考える

まずは、クラス内でするべき動作を考えます。とりあえず、自分の喫緊の課題になっているものを列挙していきます。

  1. タイマー機能をPWMで初期化する
  2. PWM出力を開始する
  3. PWM出力を設定する

2. 実装方法を決める

続いて実装方法を決めていきます。コンストラクタに乗せるとか、メソッド化するとか、プライベート変数で保持してGetterSetterを作るとかです。

  1. タイマー機能をPWMで初期化する ← TIM_HandleTypeDefだけコンストラクタで受け取って、それ以外はstart関数的なものに実装
  2. PWM出力を開始する ← レジスタに書き込みをするメソッドとして実装
  3. PWM出力を設定する ← レジスタに書き込みをするメソッドとして実装

3. 真面目にメソッドやらをきめる

どんなメソッドを作っていくのか決めます。ヘッダファイルを作るといいような気もします。

class TimerPwm {
/* -----------------------------------------------------
 * public 列挙体、インナークラス
 * ----------------------------------------------------- */
public:
    enum EChannel : int {
        CH1 = 1,
        CH2 = 2,
        CH3 = 3,
        CH4 = 4,
    };


/* -----------------------------------------------------
 * private メンバ変数
 * ----------------------------------------------------- */
private:
    TIM_TypeDef *tim;         // 設定対象タイマーのインスタンス。


/* -----------------------------------------------------
 * public メソッド
 * ----------------------------------------------------- */
public:
    /**
     * @brief 設定対象タイマーのインスタンスを受け取るのみ。初期化動作は行わない。
     * @param TIM_TypeDef _htim [I  ]: 設定対象となるタイマーのインスタンス
     */
    TimerPwm(TIM_TypeDef *uart);

    /**
      * @brief  初期化を行う関数。各レジスタの設定を行いペリフェラルを初期化する。
      * @param  period		[I  ]: PWMの周期幅
      * @param  prescale 	[I  ]: プリスケーラの値。0の場合プリスケールなし。
      * @retval None
      */
    void initialize(uint32_t period, uint32_t prescale);

    /**
      * @brief PWM出力を開始する
      * @param EChannel ch 	[I  ]: 設定するチャンネル
      */
    void start(EChannel ch);

    /**
      * @brief 出力値を設定する。
      * @param EChannel ch		[I  ]: 設定するチャンネル
      * @param uint32_t value	[I  ]: 設定する値
      */
    void out(EChannel ch, uint32_t value);

};