Sparkfun_edge--Hello World
===
# 摘要
* 本文敘述了 tflite-micro 需要部屬的硬體 Sparkfun edge以及其範例程式的編譯、燒錄及驗證畫面, 可參照部奏依序完成實作但 code 硬體不會在此篇文章詳述, 會在下一章[Sparkfun_edge--Hello World 程式解析](https://hackmd.io/_umgk8IfTf-YSei0ewTrKA)
* 使用的 source code 為 [tensorflow](https://github.com/tensorflow/tensorflow/tree/v2.3.0-rc2) 中的 v2.3.0-rc2, 硬體選用 Sparkfun edge 主要原因為 tensorflow 官網教程內提及的硬體並範例進行編譯
# 硬體介紹
## MCU - Sparkfun edge
* 完成的程式會燒入此 mcu 中

## 轉版 - CH340G
* 用於做 UART 轉接讓電腦讀到 MCU 的裝置

# 下載
* 下載tensorflow 並 checkout 到指定分支, 在測試了不同版本後目前v2.3.0-rc2可以完成在 sparkfun edge 的編譯即部屬, 當初在找版本時也是採了幾次坑才找到可使用的版本
* 目前 tensorflow 已將 micro 獨立出來成 tflite-micro 的一個專案, 但當初在使用上編譯不過因此才退而選用 tensorflow 上內的 micro 進行編譯
```cmake=
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
git checkout v2.3.0-rc2
```
# 編譯 tflitemicro-lite.a
* 編譯本地使用的tflitemicro-lite.a
```cmake=
make -f tensorflow/lite/micro/tools/make/Makefile microlite
```
* 編譯sparkfunn_edge使用的tflitemicro-lite.a
```cmake=
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge microlite
```
# Hello World 專案介紹
* 這個專案是個簡易的 AI 模型目的是模擬 sin 函數, 並在 Sparkfun edge 的版子上透過 LED 燈秀出
* 在此專案中也有給出簡易的訓練方法來 train 自己的 sin 函數模型, 預設是使用 regression 的方做訓練
* 訓練好的模型會透過 xdd 轉成 c語言的結構, 結構可詳閱```model.cc```, 轉換方式會放在下一篇的筆記中

# 編譯.bin
## 編譯 hello_world.bin
* 執行以下指令編譯
```cmake=
make -f tensorflow/lite/micro/tools/make/Makefile TARGET=sparkfun_edge hello_world_bin
# Binary path
# tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/hello_world.bin
```
## 執行加密
* 在部屬到 Sparkfun edge 時需要針對.bin 進行加密才可執行, 在此透過 Ambiq SDK 進行
```cmake=
# 複製指定加密程式
cp tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info0.py \
tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/keys_info.py
# 執行加密
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_image_blob.py \
--bin tensorflow/lite/micro/tools/make/gen/sparkfun_edge_cortex-m4/bin/hello_world.bin \
--load-address 0xC000 \
--magic-num 0xCB \
-o main_nonsecure_ota \
--version 0x0
```
* 此時會創建一個 main_nonsecure 需要在透過以下程式創建最終要部屬的檔案
```cmake=
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/create_cust_wireupdate_blob.py \
--load-address 0x20000 \
--bin main_nonsecure_ota.bin \
-i 6 \
-o main_nonsecure_wire \
--options 0x1
```
* main_nonsecure_wire.bin 是最終編譯的 .bin
# 燒錄
* 將 USB 燒路線接上 Sparkfun edge 並檢查 com port 序號後設定環境變數
```cmake=
export DEVICENAME=put your device name here
export BAUD_RATE=921600
```
* 長壓住 14 的按鈕並執行以下程式直到燒錄結束
```cmake=
python3 tensorflow/lite/micro/tools/make/downloads/AmbiqSuite-Rel2.2.0/tools/apollo3_scripts/uart_wired_update.py \
-b ${BAUD_RATE} ${DEVICENAME} \
-r 1 \
-f main_nonsecure_wire.bin \
-i 6
```
* 看到以下畫面 Show 出Sending Reset Command. Done. 及表示燒錄完成可直接按RST重啟

## 成果畫面
* 可以看到底下 LED 燈配合 Sin 函數的變化也跟著亮燈號

# 總結
* 在本文完成了 Sparkfun edge 的 hello world 專案燒錄, 內容紀錄著程式編譯, 燒錄, 成果展示的畫面
* 程式碼的 Trace 會放在下一篇的筆記內容[Sparkfun_edge--Hello World 程式解析](https://hackmd.io/_umgk8IfTf-YSei0ewTrKA)
source : https://github.com/tensorflow/tensorflow/tree/v2.3.0-rc2
https://learn.sparkfun.com/tutorials/sparkfun-edge-hookup-guide/all
###### tags : `AI`, `AI 部屬`