鳥なき里のマイコン屋(97) GD32開発ボードにRISC-Vデバッガ接続

JosephHalfmoon

前回は、SeeedStudio製GD32VF103VBT6開発ボード(以下「開発ボード」)をPlatformIO上の設定ではLongan nanoとしておいても、問題なくビルドおよびDFU経由のダウンロードが出来ることを確かめました。今回はSipeed製のRISC-Vデバッガ(JTAG)を開発ボードに接続してみたいと思います。

前々回をご覧いただくと分かるのですが、Sipeed製のRISC-VデバッガをSipeed製のLongan nanoに接続する場合、RISC-Vデバッガに付属しているケーブルを使うことはできるのですが、

  • 1本1本、信号を確かめながらデバッガとLongan nanoの接続必要
  • RESET信号については別にnanoのRST端子に直接接続必要

でした。それもこれも、RISC-Vデバッガには10ピンのフラットケーブルが刺さるようになっているのに、Longan nanoのデバッグ用の端子は8ピン、その上、端子配列にも互換性が無いためです。毎回1端子ずつ接続しているとそのうち間違いそうです。

これに対して、「開発ボード」の10ピンのJTAG端子は、J-link系のデバッガの20ピンを10ピンのフラットケーブルに変換をした場合の端子配列に準拠しているようです。やはりRISC-Vデバッガの10ピン端子配列とは互換性がありません。今回は、簡単に差し替えできるように、双方2x5列(10ピン)のピンソケット間で接続しておくことにいたしました。ただし、デバッグ用のUART端子がRISC-Vデバッガ側には含まれますが、「開発ボード」では、JTAG用の10ピン端子には含まれず、別なピンヘッダに出ているので、

  • RISC-Vデバッガ側は2x5列(10ピン)のピンソケット1個
  • 「開発ボード」のJTAG端子は2x5列(10ピン)のピンソケット+UART用の1x3列(3ピン)のピンソケット

という形で、相互に接続(如何にも手づくりですが)してみました。その際、

  • UART3端子側にGNDあり、がJTAG側でGND接続とったのでこちらはNC
  • UARTは、RX-TXをクロスで接続(ボーッとしてTX同士接続しないこと)
  • JTAG側のデバッガのRST信号は、「開発ボード」側のNRSTに接続

しました。「開発ボード」側にはTRSTもあるのですが、こちらは使用していないです。接続したところはアイキャッチ画像を御覧ください。

これによりRISC-Vデバッガをuploadにも使うことが可能となった(忘れずにplatformIO.iniを修正しておくこと)ので、

前回のようなBOOT0端子のジャンパ操作もRESETボタン操作も不要

にて、ビルドしたオブジェクトをボードにダウンロードできます。また、UART0も同時に使えるので、uart経由のprintfも使用できます。

ただし、ボード上の端子の接続はLongan nanoとは異なるので、ボード回路図を見ながら書き換えないとならない、です。「開発ボード」用に書き換えたコードを以下に示しておきます。まずは、初期設定のところ、Longan nanoとはLEDの接続が異なるので変更しています。なお「開発ボード」の回路図でもR,G,Bみたいな信号名の記載ありますが、3個あるLEDは全て青です。

// Sample program for Seeed GD32VD103VBT6 Demoboard
#include "gd32vf103.h"
#include "systick.h"
#include <stdio.h>

#define LED_RED (0x20)
#define LED_GREEN (0x01)
#define LED_BLUE (0x02)

void initializePeriph(void) {
    // Enable Peripheral clock
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOB);     // initialize GPIO
    rcu_periph_clock_enable(RCU_USART0);
    // PB5  ... LED_RED
    // PB0  ... LED_GREEN
    // PB1  ... LED_BLUE
    gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_1 | GPIO_PIN_0); // LED
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); // USART0 TX
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); // USART0 RX
    gpio_bit_reset(GPIOB, GPIO_PIN_5 | GPIO_PIN_1 | GPIO_PIN_0);
}

LEDの接続がLongan nanoとは違うので、3個のLEDのON/OFFをするためのユーティリティ?関数も変更。

void contLED(int onFlag, int offFlag) {
    if ((onFlag & LED_RED) != 0) {
        gpio_bit_reset(GPIOB, GPIO_PIN_5);
    }
    if ((onFlag & LED_GREEN) != 0) {
        gpio_bit_reset(GPIOB, GPIO_PIN_1);
    }
    if ((onFlag & LED_BLUE) != 0) {
        gpio_bit_reset(GPIOB, GPIO_PIN_0);
    }
    if ((offFlag & LED_RED) != 0) {
        gpio_bit_set(GPIOB, GPIO_PIN_5);
    }
    if ((offFlag & LED_GREEN) != 0) {
        gpio_bit_set(GPIOB, GPIO_PIN_1);
    }
    if ((offFlag & LED_BLUE) != 0) {
        gpio_bit_set(GPIOB, GPIO_PIN_0);
    }
}

デバッグ用のUARTはUSART0を使用していることには変わりないので、変更なし。

void usart0_config(void) {
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200U);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);
}

とりあえず、LEDとprintfだけの「サンプルプログラム」はこちら。このレベルであれば、Longan nanoとは差異なし。

int main( void ) {
    int loopCount = 0;

    initializePeriph();
    usart0_config();
    delay_1ms(1000);

    while(1) {
        printf("LOOP  : %d\n",loopCount++);
        //RED
        contLED(LED_RED, (LED_GREEN | LED_BLUE));
        delay_1ms(1000);
        // GREEN
        contLED(LED_GREEN, (LED_RED | LED_BLUE));
        delay_1ms(1000);
        // BLUE
        contLED(LED_BLUE, (LED_RED | LED_GREEN));
        delay_1ms(1000);
    }
}

まあ、デバッガ用のケーブルをFIXしたので、1個しかない虎の子のRISC-Vデバッガをボード間で使いまわしするのは楽になりました。

鳥なき里のマイコン屋(96) GD32VF103VBT6開発ボード へ戻る

鳥なき里のマイコン屋(98) GD32VF103の素性? へ進む