前回は、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デバッガをボード間で使いまわしするのは楽になりました。