電子工作

Wio Lite RISC-V をためす

秋月電子で 500 円という格安で Wifi つき RISC-V ボードが売っていたので確保してみました。

ググると先人が試した形跡が結構あるので、それを参考に作業を進めると比較的サクサクと進めることができます。ただ、当時からちょっと状況が変わっているのか私の手元では動かない部分もあったので、そのあたりは適宜勘を働かせながら進めていきます。

まずは、

などを参考に環境構築と一番簡単な L チカから始めます。

ドライバインストール

過去のドキュメントで紹介されているリンクが死んでしまっているようで、探すのに苦労しました。結局、ドライバはGigaDevice のページから取得できるものを見つけ、書き込みツールは GitHub の Seeed Document のリポジトリから見つけました。

GD32DfuDrivers_V3.6.6.6167.rar を展開したら、x64 ないしは x86 フォルダ内にある GD32DfuDrivers.exe を実行してドライバをインストールします。

GD32_MCU_Dfu_Tool_V3.8.1.5784_1.rar はボードにプログラムを書き込む際に使用するので、展開して置いておきます。

PlatformIOのインストール

Wio Lite RISC-V は PlatformIO に対応しているようなので、PlatformIO をインストールします。VSCode の EXTENSIONS で PlatformIO を探してインストールします。

プロジェクト作成

PlatformIO の画面から New Project でプロジェクトを作成します。Board で “Wio Lite RISC-V(SeedStudio)”、Framework で GigaDevice GD32V SDK を選びます。

プログラム作成

“Wio Lite RISC-V で Lチカ” に書かれている手順をベースにしています。

Project Example から longan-nano-blink を選択してLongan Nano 用Lチカのサンプルを入れます。

続いて、Wio Lite RISC-V の仕様に合わせて値を変更します。

#define LED_PIN GPIO_PIN_13
#define LED_GPIO_PORT GPIOC
#define LED_GPIO_CLK RCU_GPIOC

#define LED_PIN GPIO_PIN_8
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK RCU_GPIOA

とします。

以上です。全体像は以下の通りです。

include/systick.h

#ifndef SYS_TICK_H
#define SYS_TICK_H

#include <stdint.h>

void delay_1ms(uint32_t count);

#endif /* SYS_TICK_H */

src/systick.c

#include "gd32vf103.h"
#include "systick.h"

/*!
    \brief      delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1ms(uint32_t count)
{
    uint64_t start_mtime, delta_mtime;

    // Don't start measuruing until we see an mtime tick
    uint64_t tmp = get_timer_value();
    do {
    start_mtime = get_timer_value();
    } while (start_mtime == tmp);

    do {
    delta_mtime = get_timer_value() - start_mtime;
    }while(delta_mtime <(SystemCoreClock/4000.0 *count ));
}

src/main.c

#include "gd32vf103.h"
#include "systick.h"
#include <stdio.h>

/* BUILTIN LED OF LONGAN BOARDS IS PIN PC13 */
#define LED_PIN GPIO_PIN_8
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK RCU_GPIOA

void longan_led_init()
{
    /* enable the led clock */
    rcu_periph_clock_enable(LED_GPIO_CLK);
    /* configure led GPIO port */ 
    gpio_init(LED_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_PIN);

    GPIO_BC(LED_GPIO_PORT) = LED_PIN;
}

void longan_led_on()
{
    /*
     * LED is hardwired with 3.3V on the anode, we control the cathode
     * (negative side) so we need to use reversed logic: bit clear is on.
     */
    GPIO_BC(LED_GPIO_PORT) = LED_PIN;
}

void longan_led_off()
{
    GPIO_BOP(LED_GPIO_PORT) = LED_PIN;
}
/*!
    \brief      main function
    \param[in]  none
    \param[out] none
    \retval     none
*/
int main(void)
{
    longan_led_init();

    while(1){
        /* turn on builtin led */
        longan_led_on();
        delay_1ms(1000);
        /* turn off uiltin led */
        longan_led_off();
        delay_1ms(1000);
    }
}

プログラムができたら、ウィンドウ左下のビルドボタンでビルドします。

作成したプログラムの書き込み

ビルドに成功したら、作成したプログラムをボードに書き込みます。PlatformIO 経由でできるという記述があったものの、私の環境ではうまくいかなかったので先ほどダウンロードした GD32 MCU Dfu Tool を使用します。

ボード上のスイッチを USB コネクタ側に切り替えると書き換えモードに切り替わるので、リセットボタンを押します。
GD32 MCU Dfu Tool を立ち上げます。正常に認識されていると、DFU Device にデバイスが表示されます。

DL App file name で、(プロジェクト名)\.pio\build\wio_lite_risc-v\firmware.hex を選択し、OKボタンを押すとファイルが転送されます。

Download succesfully! と言われたら成功です。スイッチを元に戻してリセットボタンを押すと、1秒毎にLEDが点滅を繰り返します。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です