FiHiveでLチカ 〜外付けのLED〜
HiFiveはSiFive社が製造しているマイコンボードです。マイコンボードにくっついているLEDはサンプルを使えば簡単に光らせることができます。ここでは他のGPIOピンを使ってLEDを光らせてみます。開発はFreedom studioを使っています。
環境
- OS :Windows10
- 開発環境:Freedom studio
- ボード:HiFive 1 Rev B
GPIOに関するAPI
Freedom studioではマイコンの機能を簡単に扱えるAPIが用意されています。GPIOを操作するためのAPI のうち、私が使ったものを紹介します。詳しい内容は以下のサイトを見てください。
https://sifive.github.io/freedom-metal-docs/api.html
struct metal_gpio *metal_gpio_get_device(unsigned int device_num)
参考サイトではGPIO device handleを取得すると書いてありますが、プログラムを見たところGPIOを操作するレジスタのベースアドレスを戻り値のmetal_gpioとして取り出しているようです。
引数のdevice_numを0とすることでGPIOのベースアドレスが取得できます。ちなみに0以外の数字を入れても意味がないようです。(HiFive 1 rev b以外だと違うかも)
__inline__ int metal_gpio_enable_output(struct metal_gpio *gpio, int pin)
metal_gpio_get_deviceを使って取得したmetal_gpioを使ってGPIOピンを出力に設定します。pinの値はピン番号です。ピン番号はボードに書かれているArduinoのピン番号ではなく、HiFive 1 rev bに搭載されたプロセッサのFE310のピン番号になります。ピン番号は以下のサイトから確認できます。
__inline__ int metal_gpio_set_pit(struct metal_gpio *gpio, int pin, int value)
metal_gpio_get_deviceで取得したmetal_gpioとピン番号pinで指定したGPIOピンの出力を行います。出力値valueが1の時はHigh、0の時はLowとなります。
サンプルプログラム
Freedom studioを立ち上げて、適当なプロジェクトを作ります。プロジェクトのメインとなるソースコードに以下のプログラムを貼り付けます。(ソースコードの貼り付け方がわからなかったので、そのまま書き込んであります。後で修正したいと思います。)
#include <studio.h>
#include <metal/gpio.h>
int main (void){
struct metal_gpio *gpio;
unsigned long i;
led = metal_gpio_get_device(0);
metal_gpio_enable_output(gpio, 13); //ボード上では19番
while(1){
metal_gpio_set_pin(gpio, 13, 0);
for (i=0; i<500000; i++) ; //一定時間何もしない
metal_gpio_set_pin(gpio, 13, 1);
for (i=0; i<500000; i++) ;
}
return 0;
}
ボードとLEDの配線は写真の通りです。
LEDが点滅すれば成功です。
終わりに
単純なLチカですが、APIに登場するdevice_numやpinが何の番号なのか分からず苦戦しました。参考になれば幸いです。
今回のプログラムは以下のサイトを参考にしました。