IkawaMitsuhide’s blog

OSづくりにまつわることを発信したい

HiFiveでLチカ ~PWMを使ってみる~

今回はHiFive 1 rev bのPWMを利用したいと思います。Freedom studioに入っているサンプルをもとにより簡潔なコードを作成しました。

環境

PWMに関するAPI

Freedom studioで用意されているAPIは以下のサイトが参考になります。
sifive.github.io
しかし、PWMに関するAPIはここに掲載されていません。サンプルプログラムやヘッダーファイルを見ながら用いるAPIを確認しました。

struct metal_pwm *metal_pwm_get_device(unsigned int device_num)

PWMのデバイスハンドラを取得します。

引数
  • device_num

PWMデバイスの番号
HiFive 1 rev bに搭載されているプロセッサF310-G002のデータシートを見るとPWMが使えるピンには「pwm0-2」のような記述があります。この場合、0がPWMのデバイス番号となります。2のほうはPWMデバイス内の各出力先(対応するピンや割り込み先)の番号になります。

戻り値

PWMデバイスハンドラ(中身はレジスタのベースアドレス)

inline int metal_pwm_enable(struct metal_pwm *pwm)

PWMの機能が使用できるように設定します。

引数
  • pwm

PWMデバイスハンドラ

戻り値

エラーがない場合は0

inline int metal_pwm_set_freq(struct metal_pwm *pwm, unsigned int idx, unsigned int freq)

PWMの周波数を設定します。

引数
  • pwm

PWMデバイスハンドラ

  • idx

PWM出力先の番号

  • freq

PWMの周波数

戻り値

エラーがない場合は0

inline int metal_pwm_set_duty(struct metal_pwm *pwm, unsigned int idx,

unsigned int duty, metal_pwm_phase_correct_t phase_corr)
PWMのデューティ比とPWMの位相補正の設定を行います。

引数
  • pwm

PWMデバイスドライバ

  • idx

PWM出力先の番号

  • duty

PWM出力のデューティ比

  • phase_corr

PWMの位相補正の指定
METAL_PWM_PHASE_CORRECT_DISABLEかMETAL_PWM_PHASE_CORRECT_ENABLEを選択

戻り値

エラーがない場合は0

inline int metal_pwm_trigger(struct metal_pwm *pwm, unsigned int idx, metal_pwm_run_mode_t mode)

指定した動作モードでPWMを起動します。

引数
  • pwm

PWMデバイスハンドラ

  • idx

PWM出力先の番号

  • mode

PWMの動作モード
動作モードはMETAL_PWM_CONTINUOUS(ひたすらPWMの出力を繰り返す)とMETAL_PWM_ONE_SHOT(一度だけPWM出力を行う)から選択

サンプルプログラム

Freedom studioを立ち上げて適当なプロジェクトを作成します。プロジェクト内のメインプログラムに以下のプログラムを書き込みます。

/* Copyright 2019 SiFive, Inc */
/* SPDX-License-Identifier: Apache-2.0 */
#include <stdio.h>
#include <metal/pwm.h>

int main (void) {
  struct metal_pwm *pwm;
  unsigned long i;

  pwm = metal_pwm_get_device(2);

  if (pwm == NULL) {
    printf("PWM is null.\\n");
    return 1;
  }

  metal_pwm_enable(pwm);
  metal_pwm_set_freq(pwm, 0, 2);
  metal_pwm_set_duty(pwm, 3, 50, METAL_PWM_PHASE_CORRECT_DISABLE);
  metal_pwm_trigger(pwm, 0, METAL_PWM_CONTINUOUS);

  return 0;
}

HiFive 1 rev bとLEDの配線は以下の写真のようにしています。
f:id:IkawaMitsuhide:20210221134416j:plain

設定した周波数とデューティ比に応じて光り方が変わります。動作周波数を高くすればLEDがデューティ比に応じた明るさに光ります。

終わりに

PWMが利用できるようになるとLチカだけでも光らせ方の幅が広がって楽しいと思います。PWMはタイマ割り込みとも密接に関係しているようなので深掘りしてみようと思います。