
前回は、SeeedStudio製GD32VF103VBT6開発ボード(以下「開発ボード」)をPlatformIO上の設定ではLongan nanoとしておいても、問題なくビルドおよびDFU経由のダウンロードが出来ることを確かめました。今回はSipeed製のRISC-Vデバッガ(JTAG)を開発ボードに接続してみたいと思います。
※「鳥なき里のマイコン屋」投稿順Indexはこちら
前々回をご覧いただくと分かるのですが、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デバッガをボード間で使いまわしするのは楽になりました。
