Longan Nanoを使ってみる 4 ～printfを使ったデバッグ～

# 前の記事

[Longan Nanoを使ってみる 3 ～デバッガの使用方法～](https://qiita.com/BUBUBB/items/8efa5989e7f16f67672e)を参照

# 全体の目次
[Longan Nanoを使ってみる 1 ～ビルド環境の構築～](https://qiita.com/BUBUBB/items/7ce85ada67a3f6d1944d)
[Longan Nanoを使ってみる 2 ～デバッガの環境設定～](https://qiita.com/BUBUBB/items/864b2ef9404453810d5f)
　[Sipeed RISC-V Debugger](https://qiita.com/BUBUBB/items/61316a4df1d9f81e2864)
[Longan Nanoを使ってみる 3 ～デバッガの使用方法～](https://qiita.com/BUBUBB/items/8efa5989e7f16f67672e)
[Longan Nanoを使ってみる 4 ～printfを使ったデバッグ～](https://qiita.com/BUBUBB/items/b607a3eedc4b66e7a74f)
[Longan Nanoを使ってみる 5 ～ゲームのプロジェクトを作成～](https://qiita.com/BUBUBB/items/98d9c25120c0955d5200)
[Longan Nanoを使ってみる 6 ～文字出力～](https://qiita.com/BUBUBB/items/8dee2eabe78f38364674)
　[Longan Nanoを使ってみる ～FONTX2ファイルを作る～](https://qiita.com/BUBUBB/items/8760ac886423bf06be68)
[Longan Nanoを使ってみる 7 ～外枠とブロックを書く～](https://qiita.com/BUBUBB/items/96abb1158b413c9efd27)
　[Longan Nanoを使ってみる ～謎の画像表示関数～](https://qiita.com/BUBUBB/items/40b99468839e1daeebfb)
[Longan Nanoを使ってみる 8 ～ボールを動かす～](https://qiita.com/BUBUBB/items/92f4816af3c41ea13b9e)
[Longan Nanoを使ってみる 9 ～A/Dコンバータから入力～](https://qiita.com/BUBUBB/items/311c179f7d3a0e30495d)
[Longan Nanoを使ってみる 10 ～パドルを動かす～](https://qiita.com/BUBUBB/items/eb8149c68f6e5456e7ca)
[Longan Nanoを使ってみる 11 ～ボタンの入力](https://qiita.com/BUBUBB/items/2445940a6b0d2110ee04)
[Longan Nanoを使ってみる 12 ～ボールのロス～](https://qiita.com/BUBUBB/items/f8c6ff860de127c93cb9)
[Longan Nanoを使ってみる 13 ～ステージの遷移とゲームオーバー～](https://qiita.com/BUBUBB/items/f1ae81b835f55abe319e)
[Longan Nanoを使ってみる 14 ～PWMとサウンド～](https://qiita.com/BUBUBB/items/3b592078d30cfed0ec53)
[Longan Nanoを使ってみる 15 ～音楽を鳴らす～](https://qiita.com/BUBUBB/items/adb35e02209ad78dfa9b)
[Longan Nanoを使ってみる 16 ～とりあえずのまとめ～](https://qiita.com/BUBUBB/items/ba782ccc80f50b7ab8c3)
# printfによるデバッグ
RV Debuggerは、ソースコードレベルのデバッグが売りだが、多少ソースコードを変えることで、printfを使ったデバッグも可能。

Longan Nanoでは、USARTが０～４まで存在するが、デバッガに接続するポートの８ピンには、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をクリックする。

![printf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/52acbec6-e94c-f708-3d68-b2447b6ef9e1.png)

シリアルモニターのセッションが開始する。右側ペインには、"Monitor"というタスクが表示され、稼働中となる。

<img width="50%" alt="printf2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/74dcfd6e-1171-58c2-a0d9-1883ee354a45.png">

接続情報を調整する。

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デバッグは、ソースコードデバッグとは同時に使用できない。

![printf3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/270e3a6f-3363-9751-5c3a-75530476ecf7.png)

Monitorタスクのターミナルに、printfの内容が表示される。


![printf4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2096509/5abc57df-3688-6bfe-88cb-732deb999a3f.png)

モニターを停止するには、Monitorタスクの右側のごみ箱アイコンを使用する。もしくは、CTRL+Cで停止させる。

# ここまででできたこと
ソースコードにprintfを追加し、printfを使ったデバッグができるようになった

# 次の記事
[Longan Nanoを使ってみる 5 ～ゲームのプロジェクトを作成～](https://qiita.com/BUBUBB/items/98d9c25120c0955d5200)