BL702をmcuとして使ってみる

#目的
　まず、BL702って何なのって話から、始まるのだろうね。
　USBシリアル変換器として使われているが、その実態は、
　32-bit RISC-V,fmax 144MHz,132KB RAM,192KB ROM,512KB Flash搭載のmcuなのだ。
　単品でUSBからのプロクラム書き込みが可能、mcuとして動作する。
　しかも安そうだし。
　◆◆◆　之は遊んでみるしか無いだろう　◆◆◆
　開発環境を確認する前に、勇み足でポチっちゃったよ。使えなかったらどうしよう。
![bu702_image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/be08a1aa-4da1-8978-f3a6-4c4de3f98a15.jpeg)
#経緯
　[Tang-Nano-4Kについては前回書いた](https://qiita.com/hi631/items/e3a557d6f8b9fcb491c2)
　Tang-Nano-4KのUSB-I/Fへの搭載でこのチップを知ったが、Tang-Nanoのch552と同じ立ち位置。
　やってる事も出来る事も同様だが、BL702の方が32bitと高性能。
　E\*とかA\*を見回したが、チップ単体は見つけられなかった。
　「RV-Debugger-BL702」てのが\\500円位で有ったので購入。
　　※別途運単必要だったが、その所為か意外と早く届いた。
　開発環境はBouffaloLab社の[BL MCU SDK 開発ガイド](http://bouffalolab.gitee.io/bl_mcu_sdk/index.html)に２種類提示されていた。
　　Windows_CDK は登録が必要なので取り合えずパス。(日本からの登録できるか判らん)
　　Windows_eclipse が使えそうなのでこちらで行こう。
　　※ここに書かれていることが理解出来れば、以下を見る必要は無いな。

#開発環境
　ターゲット　　　RV-Debugger-BL702
　通信確認　　　　USBシリアル接続器
　開発ソフト　　　[Windows_eclipse](https://dev.bouffalolab.com/media/upload/download/BouffaloLab_eclipse_x86_64_win_v1.2.0.zip)
　サンプルソフト　[bl_mcu_sdk](https://github.com/bouffalolab/bl_mcu_sdk)

#開発環境の設定
　[Windows_eclipseをダウンロード](https://dev.bouffalolab.com/media/upload/download/BouffaloLab_eclipse_x86_64_win_v1.2.0.zip)
　　※速度遅いが我慢の子。
　[bl_mcu_sdkをダウンロード](https://github.com/bouffalolab/bl_mcu_sdk)
　　※多分、bflb_flash_toolがウイルスと認定されるので、不安を覚える方は此処で辞めてください。
　　　自己責任で進められる方は、復元して続けてください。
　解凍して適当なディレクトリに設置して、eclipse.exeを起動。
　ワークスペースを聞かれるので適当に設定。
　ツールバーの Window -> Preferences を選択、ダイアログが開く。
　ダイアログの左下の Import アイコンをクリックすると、Import Preferences が開く。
　From Preferences Files にbflb_mcu_preferences.epfを登録。
　　※eclipseディレクトリの直下に存在。
　登録後 Finish を押すが、次のダイアログでは Cancel を押して操作を継続。
　File -> Import と選択して、Select 画面を表示。
　General -> Existing.... と選択しておいて、 NEXT> のクリックで Import Projects のダイアログが開く。
　Select root directory に bl_mcu_sdk の格納ディレクトリを設定して Finish 。
　Project Explorer に bl_mcu_sdk が表示されていたら設定は大成功。

#RV-Debugger-BL702の設定
　RV-Debugger-BL702をUSBに接続すると、おニューではデバイスマネージャーにCOMyが表示される。
　一度USBを取り外し、RV-Debugger-BL702の Boot 釦を押したまま、USBに再接続。
　　※基板LEDがうすボケ表示されたら、釦は離す。
　　※USB電源ON/OFFでも可、電源ＳＷの付いてるUSBハブだと楽チン。
　デバイスマネージャーにCOMzの表示を確認。
　　※COMyとCOMzは別の番号、別のドライバが当たる。
　　※COMyの時はFTDI製のドライバを使うようだが、大丈夫なのかな。
　RV-Debugger-BL702への書き込みは、COMzから行う。

#コンパイルから書込み迄。
　Project Explorer に表示されている bl_mcu_sdk をクリックして展開する。
　Build Targets が見えるので之も展開。bl_clean, bl_make, download が表示される。
　各々を右クリックしてから Edit 選択して、プロパティを下記に変更。
　　bl_clean　特に変更箇所無し
　　bl_make 　Build target は helloworld(若しくはコンパイルしたいディレクトリ) 
　　　　　　　Build commnd は make build BOARD=bl702_iot に変える。(includeファイルが変わる)
　　download　Build commnd は make INTERFACE=uart COMx=comz(boot釦押下時に表示されたCOMデバイス名)
![bl720_build.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/3d25495a-7e09-1164-3ea7-faac49ce2ada.jpeg)

　設定変更終わったら、念のために bl_clean をダブルクリックで実行。(毎回行う必要は無い)
　Console に cmake -E remove_directory out とかが出たら成功。
　　※makeとかcmakeがなんちゃらとか言われた場合の対応は下記に記載。
　次は bl_make をダブルクリックでコンパイルを実行。
　[100%] Built target helloworld.elf なんて出てたら成功。
　　※bl702_custom が無いと言われたら bl702_iot をコピーして作っておく。(\\bsp\\board\\bl702)
　RV-Debugger-BL702を書込みモード(COMy表示)で接続し、 bl_download をダブルクリック。
　表示がずらずら流れ、最後に [All Success] が表示されれば完了。
　　※当方の環境では当初失敗したが、FTD1232 が電源オフ状態で刺さっていて発生した気配。
　RV-Debugger-BL702の電源をいったん切り、再投入すれば書込んだソフトが走り出す。
　　※一度書き込むとRV-Debugger-BL702としては使えなくなる。
　　　binの再書き込みで復旧するのだろうが、ソースは有るがbinは無い、コンパイル方法は不明。

#Ｌチカ
　定番のＬチカは、gpio_blink に書かれているが、その儘ではチカッてくれない。
　原因は examples がRV-Debugger-BL702用で無く、LEDの位置も数も違っている所為。
　GPIO_PIN_29等の記述を、RV-Debugger-BL702が持つ、9,17ピンに書き換える必要が有る。
　　※何故か GPIO_PIN_7 なんて書き方は通してくれなかったので、数字直書き。

#UART入出力
　MSG出力の使用例が helloworld に書かれている。
　但しこれもディフォルトでは、TXDは基板上部の真ん中、RXDはTCKピンへの接続が必要。
　2Mbpsで通信が行われる。
　　※Teratermは通信速度をキー入力すれば、2Mbpsに設定可能、
　printfは普通に使えた。
　　※fflush(stdout)しないと、纏めて表示されるのはお約束。
　get系(getch,gets等)は全滅、コンパイルエラーにはならないが動作せず。

#プログラム例
　ＬチカとprintfとUART入力を纏めた物を下記に示す。
　　※helloworldのmain.cと差し替えて動作させる。正常動作は確認済み。
　　※Ｌチカの動作を判り易くする為、UART入力の処理は微妙。
　　※UART入力は割り込み無しの見本も有ったが、今回は動作せず。
　　※hal_xxxにはbl702以外をincludeしているものも有り、今後何か悪さをするかも。

```
#include <stdio.h>
#include "bflb_platform.h"
#include "hal_uart.h"
#include "hal_gpio.h"

// COMx(ORG) Speed = 2000000 TX=GPIO14(TXD) RX=GPIO15(TCK)
// Pin.Swap GPIO15<->23  (bsp\board\bl702\bl702_iot\)pinmux_config.h
// Speed 2000000->115200 (bsp\board\bl702\bl702_iot\)peripheral_config.h
char uargs[128];
uint32_t usize=0;
void uart_irq_callback(struct device *dev, void *args, uint32_t size, uint32_t state){
    if (state == UART_EVENT_RX_FIFO) {
        //device_write(dev, 0, (uint8_t *)args, size);
    	memcpy(&uargs[usize],args,size); usize = usize + size;
    	uargs[usize] = 0;
    } else if (state == UART_EVENT_RTO) {
        device_write(dev, 0, (uint8_t *)args, size);
    }
}

int main(void){
    bflb_platform_init(0);

    // UART IRQ Initialize
    struct device *uart = device_find("debug_log");
    if (uart) {
        device_set_callback(uart, uart_irq_callback);
        device_control(uart, DEVICE_CTRL_SET_INT, (void *)(UART_RX_FIFO_IT | UART_RTO_IT));
    } else {
    	printf("UART Not.Found\r\n");
    }

    // LED Initialize
    gpio_set_mode(9, GPIO_OUTPUT_PP_MODE);
    gpio_set_mode(17, GPIO_OUTPUT_PP_MODE);

    for(;;){
        MSG("hello world!\r\n");
        if(usize!=0){
        	printf("%s", uargs); fflush(stdout); usize = 0;
        }

        // LED Blinking
        gpio_write(9, 0); gpio_write(17, 0); bflb_platform_delay_ms(500);
        gpio_write(9, 1); gpio_write(17, 1); bflb_platform_delay_ms(500);
    }

    BL_CASE_SUCCESS;
    while (1) { bflb_platform_delay_ms(100); }
}
```

![bl720_hello.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/019571e7-b198-bae4-2d00-a4fa01eacffe.jpeg)

#ディフォルトの設定変更
　ディフォルト設定は、bl_makeに設定したBuild commndにより参照される、includeファイルにより決まる。
　入出力ピンは (bsp\board\bl702\bl702_iot\)pinmux_config.hに記載されている。
　　#define CONFIG_GPIO15_FUNC GPIO_FUN_UART0_RX を #define CONFIG_GPIO15_FUNC GPIO_FUN_UNUSED に、
　　#define CONFIG_GPIO23_FUNC GPIO_FUN_UNUSED 　を #define CONFIG_GPIO23_FUNC GPIO_FUN_UART0_RX に、
　書き換える事により、15ピンと23ピンを交換できる。
　これで、TX,RX共に基板上部中央のピンに接続できる。

　同様に通信速度は、(bsp\board\bl702\bl702_iot\)peripheral_config.hに記載されており、
　　.baudrate = 2000000 を .baudrate = 115200 に、
　書き換える事により、速度が115200bpsに変更される。

#eclipseの動作
　pathの設定によっては、eclipseが外部のアプリを参照して、コンパイル停止となる場合が有る。
　下記を eclipse.bat　なんてファイルに記載し、bat起動することにより防止できる。
　　※当方の環境ではC:\\app下に、BouffaloLabの名前でeclipse環境を格納している。

```
path=C:\app\BouffaloLab\cmake\bin
start /b eclipse.exe
```

#ウイルスチェックについて
　本来チェックに引っ掛かったEXEを使用するのは望ましくない。が、
　今回は記載内容などを鑑み、検出はノート〇の余計なお世話と判断し導入を強行した。
　本内容に誘発されてツールを導入する時は、自己責任で願います。
  　※私の貴方で違うサイトから落とすなんて事も、可能性としては有り得るから。
　しかし、ウイルス認定される原因は、「使用者が５０人以下」と言う事らしいが、
　ノート〇が知らないexeは、全てウイルスだと言い張るのは市販ソフトとしてどうかと思う。
　basic(VB6古い)で自作したソフトが、コンパイルした途端にウイルス認定されて削除されるのは、どう考えてもおかしいだろう。
　ユーザーが一人もいないなんて言われても、当たり前だから。

#感想
　毎度言っているような気もするが、この性能と開発環境込みでこの値段。
　BLEとZigbeeにも使えるらしいが、RV-Debugger-BL702のアンテナパターンにコネクタを付ければ使えるのかも。
　　※電波法違反には一応なるので、やらないけど。
　ESP32もコンセプトが素晴らしかったが、bl702のUSB直結も魅力。その内USB2ハイスピードも出て来るのか。
　中国企業のアグレッシブさには感心してしまう。開発元のBouffaloLab社は国内優先のようだが。
　物量とスピードに、我が日本は対抗できるのかな。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。