<style>
.reveal .slides {
text-align: left;
}
</style>
# <font size=20>*於Ubuntu安裝 Mbed CLI*</font><br>
---
<font size=10>Board: NUCLEO-F767ZI, OS: Ubuntu 22.04</font>

---
# <font size=18>下載STM32CubeProgrammer</font>
- ST官方的MCU firmware 燒錄和清除的工具,可簡單測試board的ST-LINK是否連線成功
https://www.st.com/en/development-tools/stm32cubeprog.html
- 會要求申請ST的帳號

---
# <font size=18>安裝STM32CubeProgrammer</font>
- 用firefox瀏覽器下載通常會儲存在 ~/Downloads
```bash=
$ unzip ~/Downloads/en.stm32cubeprg-lin-xx-xx-xx.zip -d ~/stm32cubeprog
$ sudo ~/stm32cubeprog/SetupSTM32CubeProgrammer-xx.xx.xx.linux
```
- 如在Windows的GUI安裝,一直「next」即可

---
# <font size=18>執行STM32CubeProgrammer</font>
```bash=
$ sudo /usr/local/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin/STM32CubeProgrammer
```
- 接上board後serial會顯示ID數字,點選STM32CubeProg的Connect後會顯示flash的內容
- 操作完後,記得要點選Disconnect

---
# <font size=18>Mbed CLI官方安裝參考連結</font><br>
https://os.mbed.com/docs/mbed-os/v6.16/build-tools/install-and-set-up.html
---
# <font size=18>安裝必要工具</font><br>
```bash=
$ sudo apt-get update
$ sudo apt-get install git mercurial libusb-1.0-0-dev gcc
```
- 在windows環境安裝有寫到建議是Python3.7
- 用最新版本的Python,會有lib衝突問題

---
# <font size=18>安裝 conda: 用於管理Python版本</font><br>
```bash=
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
```

```bash=
$ sh Miniconda3-latest-Linux-x86_64.sh
```
- Default設定:說明到最底部後輸入yes,之後一直Enter到結束
- 關閉安裝conda的terminal,再開啟新terminal
---
# <font size=18>啟用conda</font><br>
- 在最前面會顯示 (base),如下範例
```bash=
(base) user@machine:~$
```
- 輸入以下指令安裝Python的指定版本
```bash=
$ conda create -n tflm python=3.7
```
- 每次開啟新的視窗,都要啟用conda
```bash=
$ conda activate tflm
```
- 在最前面的顯示 (tflm),使用mbed-cli才會對應到正確的Python版本
---
# <font size=18>下載GNU compiler</font><br>
- Reference: https://os.mbed.com/docs/mbed-os/v6.16/build-tools/index.html#compiler-versions
- GCC ARM compiler 下載網址: https://developer.arm.com/downloads/-/gnu-rm

---
# <font size=18>安裝GNU compiler</font><br>
- 可以透過瀏覽器下載或是輸入指令
```bash=
$ cd ~
$ wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/9-2019q4/gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2
```
- 解壓縮指令
```bash=
$ cd ~
$ tar -xvjf gcc-arm-none-eabi-9-2019-q4-major-x86_64-linux.tar.bz2
```
---
# <font size=18>安裝mbed-cli</font><br>
- 輸入以下指令
```bash=
$ pip install mbed-cli
$ mbed config -G GCC_ARM_PATH ~/gcc-arm-none-eabi-9-2019-q4-major/bin/
$ mbed config -G TOOLCHAIN GCC_ARM
```
- 檢查設定
```bash=
$ mbed config --list
```
- 安裝mbed-os必要模組
```bash=
$ wget https://raw.githubusercontent.com/ARMmbed/mbed-os/master/requirements.txt
$ pip install -r requirements.txt
```
---
# <font size=18>安裝pyOCD</font><br>
```bash=
$ git clone https://github.com/pyocd/pyOCD ~/pyOCD
$ cd ~/pyOCD
$ pip install .
```
- 設定ST-LINK的udev環境
```bash=
$ sudo cp ~/pyOCD/udev/*.rules /etc/udev/rules.d
$ sudo udevadm control --reload-rules && sudo udevadm trigger
$ sudo usermod -a -G dialout $USER
# 完成後Log Out再Log In 或 Restart,登錄後記得再執行conda activate tflm
```
---
# <font size=18>設定目標開發板NUCLEO_F767ZI</font><br>
- 輸入指令後,顯示與F767相關的package
```bash=
$ pyocd pack find F767
Part Vendor Pack Version Installed
---------------------------------------------------------------------------------
SN32F767BF SONiX SONiX.SN32F7_DFP 1.5.7 False
SN32F767F SONiX Keil.SN32F7_DFP 1.0.2 False
STM32F767BGTx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767BITx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767IGKx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767IGTx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767IIKx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767IITx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767NGHx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767NIHx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767VGHx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767VGTx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767VIHx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767VITx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767ZGTx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
STM32F767ZITx STMicroelectronics Keil.STM32F7xx_DFP 2.16.0 False
```
---
# <font size=18>設定目標開發板NUCLEO_F767ZI</font><br>
- NUCLEO_F767ZI開發板使用STM32F767ZITx,輸入安裝package
```bash=
$ pyocd pack install STM32F767ZITx
# 重新連接NUCLEO_F767ZI到ubuntu
$ pyocd list --probe
# 驗證是否有連接到NUCLEO-F767ZI board
```

---
# <font size=18>下載mbed-os範例</font><br>
https://os.mbed.com/teams/mbed-os-examples/code/mbed-os-example-blinky/
```bash=
$ cd ~
$ mbed import mbed-os-example-blinky
$ cd mbed-os-example-blinky
$ mbed target NUCLEO_F767
$ mbed toolchain GCC_ARM
# 若顯示[mbed] ERROR: Could not find mbed program in current path,輸入mbed config root .
$ mbed config --list
# 檢查設定
[mbed] Global config:
TOOLCHAIN=GCC_ARM
GCC_ARM_PATH=~/gcc-arm-none-eabi-9-2019-q4-major/bin/
[mbed] Local config (~/mbed-os-example-blinky):
TARGET=NUCLEO_F767ZI
TOOLCHAIN=GCC_ARM
```
---
# <font size=18>檢測mbed是否偵測到目標裝置</font><br>
```bash=
$ mbed detect
[mbed] Detected NUCLEO_F767ZI, port /dev/ttyACM0, mounted /media/rex/NOD_F767ZI, interface version V2J43M28:
[mbed] Supported toolchains for NUCLEO_F767ZI
| Target | mbed OS 2 | mbed OS 5 | ARM | uARM | GCC_ARM | IAR |
|---------------|-----------|-----------|-----------|------|-----------|-----------|
| NUCLEO_F767ZI | - | Supported | Supported | - | Supported | Supported |
```
- 若mbed detect沒有偵測到目標裝置,需要修改ST-LINK的Firmware
---
# <font size=18>使用STM32CubeProg修改ST-LINK設定</font><br>

- 點選firmware upgrade (不要點Connect)
- Open in Update mode (開啟update mode後,若沒有version,再按一次)
- 設定Debug+Mass storage+VCP
- 點選Upgrade後,等待完成
---
# <font size=18>編譯blinky和燒錄進目標裝置</font><br>
```bash=
$ mbed compile -m NUCLEO_F767ZI -f
[mbed] Working path "~/mbed-os-example-blinky" (program)
Building project mbed-os-example-blinky (NUCLEO_F767ZI, GCC_ARM)
Scan: mbed-os-example-blinky
Link: mbed-os-example-blinky
Elf2Bin: mbed-os-example-blinky
| Module | .text | .data | .bss |
|----------------------|-----------|----------|-----------|
| [fill] | 100(+0) | 3(+0) | 24(+0) |
| [lib]/c.a | 4852(+0) | 2108(+0) | 89(+0) |
| [lib]/gcc.a | 920(+0) | 0(+0) | 0(+0) |
| [lib]/misc | 180(+0) | 4(+0) | 28(+0) |
| [lib]/stdc++.a | 0(+0) | 0(+0) | 0(+0) |
| main.o | 50(+0) | 0(+0) | 0(+0) |
| mbed-os/cmsis | 9540(+0) | 168(+0) | 6212(+0) |
| mbed-os/connectivity | 2140(+0) | 0(+0) | 12796(+0) |
| mbed-os/drivers | 194(+0) | 0(+0) | 0(+0) |
| mbed-os/events | 1518(+0) | 0(+0) | 3104(+0) |
| mbed-os/hal | 1580(+0) | 8(+0) | 114(+0) |
| mbed-os/platform | 5836(+0) | 260(+0) | 365(+0) |
| mbed-os/rtos | 1206(+0) | 0(+0) | 8(+0) |
| mbed-os/targets | 13644(+0) | 9(+0) | 1316(+0) |
| Subtotals | 41760(+0) | 2560(+0) | 24056(+0) |
Total Static RAM memory (data + bss): 26616(+0) bytes
Total Flash memory (text + data): 44320(+0) bytes
Image: ./BUILD/NUCLEO_F767ZI/GCC_ARM/mbed-os-example-blinky.bin
```
- 完成後NUCLEO_F767ZI的LD1會每秒1次的頻率閃爍
---
# <font size=18>Memory使用量</font><br>

- 編譯後的輸出結果的最後幾行內容有static RAM和Flash的使用量
- data: 有初始化的變數
- bss: 無初始化的變數
- text: 給CPU執行的機械碼
---
# <font size=18>使用STM32CubeProg清除FW技巧</font><br>
- mbed project寫入後會被保護,不能直接使用STM32CubeProg的Connect

- Method 1:調成hardware reset再按STM32CubeProg的Connect按鈕
- Method 2:在software reset狀態下,壓著開發板的reset按鈕。按下STM32CubeProg的Connect按鈕後,放開開發板的reset按鈕。
- STM32CubeProg左下角橡皮擦圖案即Erase all
---
# <font size=18>SemGCN-in-tflm的下載與修改</font><br>
- github site: https://github.com/rniczh/SemGCN-in-tflm
- 將/mbed-os-example-blinky/mbed-os的所有檔案複製到/SemGCN-in-tflm/mbed-os
```bash=
$ cd ~
$ git clone https://github.com/rniczh/SemGCN-in-tflm
$ cd ./SemGCN-in-tflm/mbed-os
$ cp -r ~/mbed-os-example-blinky/mbed-os/* .
```
---
# <font size=18>不編譯SemGCN-in-tflm內不需要的檔案</font><br>
```bash=
$ cd ~/SemGCN-in-tflm/
$ nano ./.mbedignore
```
- 增加以下內容到檔案內後儲存
```
examples/
main.cpp
// adj_data/h36m/case1/main_GLHS.cc
adj_data/h36m/case1/main_GRHS.cc
adj_data/h36m/case1/main_rosko.cc
adj_data/h36m/case2/main_GLHS.cc
adj_data/h36m/case2/main_GRHS.cc
adj_data/h36m/case2/main_rosko.cc
adj_data/METRLA/main_GLHS.cc
adj_data/METRLA/main_GRHS.cc
adj_data/METRLA/main_rosko.cc
adj_data/PEMS03/main_GLHS.cc
adj_data/PEMS03/main_GRHS.cc
adj_data/PEMS03/main_rosko.cc
adj_data/PEMS04/main_GLHS.cc
adj_data/PEMS04/main_rosko.cc
adj_data/PEMS08/main_GLHS.cc
adj_data/PEMS08/main_GRHS.cc
adj_data/PEMS08/main_rosko.cc
adj_data/PEMSBAY/main_GLHS.cc
adj_data/PEMSBAY/main_GRHS.cc
adj_data/PEMSBAY/main_rosko.cc
```
---
# <font size=18>修改UART的輸出baud rate</font><br>
```bash=
$ cd SemGCN-in-tflm/adj_data/h36m/case1/
$ nano main_GLHS.cc
```

---
# <font size=18>Serial port工具: picocom</font><br>
- 開啟第二個terminal,輸入以下指令安裝工具
```bash=
$ sudo apt install picocom moreutils
```
- 開啟picocom的參數指令
```bash=
$ sudo picocom -b 115200 -d 8 -s 1 /dev/ttyACM0
```
|代號| 說明 |
|---|---------|
| b |baud rate|
| d |data bit number|
| s |stop bit number|
---
# <font size=18>開啟picocom的操作說明</font><br>
- 先同時按Ctrl+a,再同時按Ctrl+h。可以看到操作說明。

---
# <font size=18>picocom的操作說明</font><br>
| 操作方式 | 效果|
| -------------- | ---- |
| Ctrl+a, Ctrl+x | 離開picocom |
| Ctrl+a, Ctrl+v | 顯示serial參數設定 |
| Ctrl+a, Ctrl+b | 設定serial的baud rate |
| Ctrl+a, Ctrl+c | 開啟/關閉顯示到輸出serial裝置的內容 |
---
# <font size=18>SemGCN-in-tflm在picocom的輸出結果</font><br>
- 在有tflm的terminal編譯SemGCN-in-tflm並燒錄
```bash=
(tflm)$ mbed compile -m NUCLEO_F767ZI -f
```
- 按下board上的reset按鈕,MCU會重新輸出結果

---
# <font size=18>增加picocom的時間戳</font><br>
- 退出原本的picocom,在terminal輸出以下指令
```bash=
$ sudo picocom -b 115200 -d 8 -s 1 /dev/ttyACM0 | ts "%Y-%m-%d %H:%M:%.S:" | awk '{print "\n" $0}'
```

- 在接收到每筆資料前會印上ubuntu系統的時間
---
# <font size=18>End</font><br>
{"description":"<font size=8>Board: NUCLEO-F767ZI</font><br>","contributors":"[{\"id\":\"c49adc41-a7e5-470b-9878-42564f94bcdb\",\"add\":14420,\"del\":3278}]","title":"於Ubuntu安裝 Mbed CLI"}