みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

PlatformIOでHiFive1 Rev.Bを動かす

はじめに

HiFive Rev.Bを入手したのでまずはPlatformIOでLチカする。

プロジェクトの作成

次のコマンドを実行し、PlatformIOのプロジェクトを作成する。

$ platformio init --board hifive1-revb

無印とはブートアドレスが異なるので、ボードもhifive1-revbを使用する。

Lチカのコード

基本的なコードはここのblinker01を参考にしている。

レジスタアクセス

レジスタにアクセスするためにマクロを作成しておく。

utils.Sを次の内容で作成

    .global dummy
dummy:
    ret

    .global put32
put32:
    sw x11,(x10)
    ret

led.cを次の内容で作成する。

void put32(unsigned int, unsigned int);
void dummy (unsigned int);

#define GPIOBASE         0x10012000
#define GPIO_OUTPUT_EN     (GPIOBASE+0x08)
#define GPIO_PORT      (GPIOBASE+0x0c)
#define GPIO_OUT_XOR   (GPIOBASE+0x40)

#define LED_RED (1<<22)
#define LED_BLUE (1<<21)
#define LED_GREEN (1<<19)
#define LED_RGB (LED_RED|LED_GREEN|LED_BLUE)

int main(int argc, char *argv[])
{
    unsigned int rx;

    put32(GPIO_OUTPUT_EN, LED_RGB);
    put32(GPIO_OUT_XOR, LED_RGB);
    put32(GPIO_PORT, LED_RGB);

    while (1) {
        put32(GPIO_PORT, LED_RGB);
        for (rx = 0; rx < 2000000; rx++) dummy(rx);
        put32(GPIO_PORT, 0);
        for (rx = 0; rx < 2000000; rx++) dummy(rx);
    }
    return 0;
}

標準のライブラリやヘッダは使っていないので、リンカスクリプトとスタートアップを書けば、 ベアメタルでもこのまま動くはず。

ビルド

次のコマンドでビルド

$ platformio run

これは次のように短く書ける

$ pio run

書き込み

次のコマンドで書き込み

$ platformio run --target upload

次のように短く書ける

$ pio run -t upload