前の記事
Longan Nanoを使ってみる 3 ~デバッガの使用方法~を参照
全体の目次
Longan Nanoを使ってみる 1 ~ビルド環境の構築~
Longan Nanoを使ってみる 2 ~デバッガの環境設定~
Sipeed RISC-V Debugger
Longan Nanoを使ってみる 3 ~デバッガの使用方法~
Longan Nanoを使ってみる 4 ~printfを使ったデバッグ~
Longan Nanoを使ってみる 5 ~ゲームのプロジェクトを作成~
Longan Nanoを使ってみる 6 ~文字出力~
Longan Nanoを使ってみる ~FONTX2ファイルを作る~
Longan Nanoを使ってみる 7 ~外枠とブロックを書く~
Longan Nanoを使ってみる ~謎の画像表示関数~
Longan Nanoを使ってみる 8 ~ボールを動かす~
Longan Nanoを使ってみる 9 ~A/Dコンバータから入力~
Longan Nanoを使ってみる 10 ~パドルを動かす~
Longan Nanoを使ってみる 11 ~ボタンの入力
Longan Nanoを使ってみる 12 ~ボールのロス~
Longan Nanoを使ってみる 13 ~ステージの遷移とゲームオーバー~
Longan Nanoを使ってみる 14 ~PWMとサウンド~
Longan Nanoを使ってみる 15 ~音楽を鳴らす~
Longan Nanoを使ってみる 16 ~とりあえずのまとめ~
printfによるデバッグ
RV Debuggerは、ソースコードレベルのデバッグが売りだが、多少ソースコードを変えることで、printfを使ったデバッグも可能。
Longan Nanoでは、USARTが0~4まで存在するが、デバッガに接続するポートの8ピンには、USART0が出力されている。外部のターミナルなどを使うのでなければ、USART0を使うのが簡単。
注意
このページは、quiita.com で公開されています。URLがqiita.com以外のサイト、例えばjpdebug.comなどのページでご覧になっている場合、悪質な無許可転載サイトで記事を見ています。正しいURLは、https://qiita.com/BUBUBB/items/7ce85ada67a3f6d1944d です。
無許可転載サイトでの権利表記(CC BY SA 2.5、CC BY SA 3.0とCC BY SA 4.0など)は、不当な表示です。
正確な内容は、qiitaのページで参照してください。
プログラム側の準備
Main関数の先頭に、次のような初期化処理を追加する。
int main(void)
{
:
// GPIOのAが、USART0なのでGPIOAにクロックを供給する
rcu_periph_clock_enable(RCU_GPIOA);
// USART0にクロックを供給
rcu_periph_clock_enable(RCU_USART0);
// TX、RXがGPIOAの9と10に出ているので、それぞれを初期化する。
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
// TXの設定を行う。デバッグでは、ターミナルへの出力だけを行うので、最低限の設定でよい。
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を有効にする
usart_enable(USART0);
:
さらに、printfが呼び出す_put_char関数をオーバーライドしてUSART0に出力するように変更する。場所はどこでもよい。main関数の前などでかまわない。
int _put_char(int ch)
{
usart_data_transmit(USART0, (uint8_t) ch );
while ( usart_flag_get(USART0, USART_FLAG_TBE)== RESET){
}
return ch;
}
プログラム中に、出力したい情報をprintfで追加する。
while(1){!
/* turn on builtin led */
for (i = 0;i<10;i++) {
longan_led_on();
delay_1ms(i*Speed1);
longan_led_off();
delay_1ms((10-i)*Speed1);
printf("off->on : %d\r\n",i);
}
/* turn off uiltin led */
for (j = 0;j<10;j++) {
longan_led_off();
delay_1ms(j*Speed2);
longan_led_on();
delay_1ms((10-j)*Speed2);
printf("on->off : %d\r\n",j);
}
longan_led_off();
delay_1ms(100);
}
ターミナルの起動
ステータスバーのSerial Monitorをクリックする。
シリアルモニターのセッションが開始する。右側ペインには、"Monitor"というタスクが表示され、稼働中となる。

接続情報を調整する。
CTRL+T CTRL+Hを連続して押すと、ヘルプが表示される。よく使うものは次の通り。ほとんどの場合デフォルトで問題ない。
コマンド | 動作 |
---|---|
CTRL+T P | ポートを変更する。複数のCOMポートが存在する場合、このコマンドを使って明示的にDebuggerのポートの指定が必要になる場合がある。 |
CTRL+T 7/8 | ビット幅。 プログラム側の準備で、usart_word_length_set(USART0, USART_WL_8BIT); で指定したビット幅に合わせる。 |
CTRL+T N/E/O/S/M | パリティ。プログラム側の準備で usart_parity_config(USART0, USART_PM_NONE); で指定したものに合わせる。 |
CTRL+T 1/2/3 | ストップビット。usart_stop_bit_set(USART0, USART_STB_1BIT);の指定に合わせる。 |
CTRL+T b | ボーレートを指定する。usart_baudrate_set(USART0, 115200U);の指定に合わせる。 |
CTRL+T x X | ソフトウェアフローコントロール。usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);に合わせる。 |
CTRL+T r R | ハードウェアフローコントロール。usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);に合わせる。 |
プログラムの実行
プログラムをデバッガを使わずに実行する。printfデバッグは、ソースコードデバッグとは同時に使用できない。
Monitorタスクのターミナルに、printfの内容が表示される。
モニターを停止するには、Monitorタスクの右側のごみ箱アイコンを使用する。もしくは、CTRL+Cで停止させる。
ここまででできたこと
ソースコードにprintfを追加し、printfを使ったデバッグができるようになった