<style>
hr {height: .1em !important;}
</style>
# STM32 嵌入式使用例
## stm32mp1
### Starter Package
wiki: https://wiki.st.com/stm32mpu/wiki/STM32MP15_Evaluation_boards_-_Starter_Package
- [ ] 下載後解壓縮,使用資料夾裡的腳本產生映像檔
- [ ] 燒錄到 SD Card 上
### Developer Package
wiki: https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package
cross compile: https://wiki.st.com/stm32mpu/wiki/How_to_cross-compile_with_the_Developer_Package#Article_purpose
當有需要修改 Linux kernel 的組態,驅動程式, uboot 時使用。
以下為加入一個外部核心模組的步驟
- [ ] [安裝 SDK (cross compile toolchain)](https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package#Installing_the_SDK)
- [ ] [下載並解壓縮 openSTLinux (內含 st 的 patch, config, 還有原始碼)](https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package#Installing_the_Linux_kernel)
- [ ] [使用 openSTLinux 提供的 patch 及套用必要組態](https://github.com/STMicroelectronics/meta-st-stm32mp/blob/thud/recipes-kernel/linux/linux-stm32mp/README.HOW_TO.txt)
- [ ] 編譯 Linux 之後使用此目錄編譯你的核心模組
- [ ] 部署到 SD Card 上
---
STM32MP157A-DK1
板子的腳位可參考 [STM32MP157X-DKX hardware description](https://wiki.st.com/stm32mpu/wiki/STM32MP157X-DKX_-_hardware_description) 或是搜尋 Discovery kits with STM32MP157 MPUs 這份手冊
<center>

</center>
> STM32MP157 Arm®-based dual Cortex®-A7 32 bits + Cortex®-M4 32 bits MPU in TFBGA361 package 
<center>

</center>
先從 STMicro 官網下載必要工具
1. [openstlinux](https://www.st.com/en/embedded-software/stm32-mpu-openstlinux-distribution.html) 這邊使用 Starter package
2. [STM32CubeProgrammer](https://www.st.com/en/development-tools/stm32cubeprog.html)
下載完後會有以下檔案
```
$ ls en*
en.FLASH-stm32mp1-openstlinux-4.19-thud-mp1-19-02-20.tar.xz en.stm32cubeprog.zip
```
安裝 Java Runtime Environment (STM32CubeProgrammer 需要 1.8 之後的版本)
```
$ sudo apt-get install default-jre
```
### 安裝 STM32CubeProgrammer
:::warning
最後幾乎沒有用到這個工具,此步驟可以跳過
:::
```
$ unzip en.stm32cubeprog.zip
$ ./SetupSTM32CubeProgrammer-2.1.0.linux
```
安裝完後將 STM32CubeProgrammer 的 bin 目錄加到 $PATH 環境變數下,使用預設安裝的目錄。export 完之後就能開始使用 STM32CubeProgrammer
```
$ export PATH=$HOME/STMicroelectronics/STM32Cube/STM32CubeProgrammer/bin/:$PATH
$ STM32_Programmer_CLI
-------------------------------------------------------------------
STM32CubeProgrammer v2.1.0
-------------------------------------------------------------------
```
### 快速上手 STM32MP1 (使用 Starter Package)
> 完整教學請參考 [st wiki](https://wiki.st.com/stm32mpu/wiki/STM32MP15_Evaluation_boards_-_Starter_Package)
使用只須幾個步驟,下載 en.FLASH-stm32mp1-openstlinux-20-02-19.tar.xz 之後,再使用資料夾中提供的 script,便可以產生一個映像檔,燒錄到 SD Card 裡。
可使用 Ubuntu 上的工具如
1. disk: 燒錄映像檔
2. gparted: 調整分割區大小等
### UART
STM32MP157A-DK1 和此系列的板子預設都已經開啟 UART 可以當作 Serial Terminal 登入,在左下角可以看到 ST-LINK USB 連接到 UART。

而這個 ST-LINK USB (CN11) 連接埠的位置則是在板子下方偏右邊

使用 Micro-b USB 接上板子連接到電腦後,查詢 dmesg 是否有出現 cdc driver 的訊息,必須有此驅動程式後,才會出現 /dev/ttyACM0,使用者才能使用 screen 或其他工具如 minicom 登入終端機。
若沒看到 cdc 的話可能需要自行安裝 (使用 modprobe)
以下為訊息輸出,可看到 ttyACM0 確實有出現
```
[227829.663468] usb 1-1.1: new full-speed USB device number 29 using xhci_hcd
[227829.766818] usb 1-1.1: New USB device found, idVendor=0483, idProduct=3752, bcdDevice= 1.00
[227829.766829] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[227829.766835] usb 1-1.1: Product: STM32 STLink
[227829.766842] usb 1-1.1: Manufacturer: STMicroelectronics
[227829.766847] usb 1-1.1: SerialNumber: 066CFF393336435043130842
[227829.791778] cdc_acm 1-1.1:1.1: ttyACM0: USB ACM device
[227829.792023] usbcore: registered new interface driver cdc_acm
[227829.792024] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
```
:::warning
若有需要可以使用 STM32CubeMX 設定 UART device tree (如開啟針腳上的 UART)
參考以下資源
https://wiki.st.com/stm32mpu/wiki/How_to_get_Terminal
https://wiki.st.com/stm32mpu/wiki/Serial_TTY_device_tree_configuration#Activation_of_a_USART_or_UART_instance
:::
如果有安裝 STM32_Programmer_CLI,此程式可列出電腦上的 Serial port (需確認系統上有出現 /dev/ttyACM0 檔案)
```bash
$ STM32_Programmer_CLI -l uart
-------------------------------------------------------------------
STM32CubeProgrammer v2.1.0
-------------------------------------------------------------------
===== UART Interface =====
Total number of serial ports available: 2
Port: ttyS4
Location: /dev/ttyS4
Description: N/A
Manufacturer: N/A
Port: ttyACM0
Location: /dev/ttyACM0
Description: STM32 STLink
Manufacturer: STMicroelectronics
```
使用 screen 命令登入終端機
```
$ sudo screen /dev/ttyACM0 115200
```

啟動之後即可開始使用
```
ST OpenSTLinux - Weston - (A Yocto Project Based Distro) 2.6-openstlinux-19-02-20-github-display-fix stm32mp1 ttySTM0
stm32mp1 login: root (automatic login)
root@stm32mp1:~# uname -a
Linux stm32mp1 4.19.9 #1 SMP PREEMPT Thu Dec 13 08:16:23 UTC 2018 armv7l armv7l armv7l GNU/Linux
root@stm32mp1:~#
```
:::warning
TODO:
- [ ] 使用 OpenSTLinux Developer Package 編譯自己需要的 kernel (PREEMPT_RT)
:::
## ROS2 rttest
ROS2 官方的即時性能測試工具 (類似 cyclictest),用來記錄 jitter, latency, missed deadlines

```c=604
clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &wakeup_time, NULL);
clock_gettime(CLOCK_MONOTONIC, ¤t_time);
this->record_jitter(&wakeup_time, ¤t_time, i);
```
[example code](https://github.com/ros2/realtime_support/blob/master/rttest/examples/example_loop.c)
```bash
$ sudo ./example_loop -f data -i 2000
Writing results to file: data
Initial major pagefaults: 0
Initial minor pagefaults: 2097895
rttest statistics for data:
- Minor pagefaults: 0
- Major pagefaults: 0
Latency (time after deadline was missed):
- Min: 2976 ns
- Max: 123693 ns
- Mean: 9686.97 ns
- Standard deviation: 9.60384e+07
```
<center>

</center>
## References
- OpenSTLinux : https://wiki.st.com/stm32mpu/wiki/OpenSTLinux_distribution
- STM32MP15 Discovery kits starter package : https://wiki.st.com/stm32mpu/wiki/STM32MP15_Discovery_kits_-_Starter_Package
- OP-TEE Overview : https://wiki.st.com/stm32mpu/wiki/OP-TEE_overview
- rt-latency-howto : http://people.redhat.com/williams/latency-howto/rt-latency-howto.txt
<br>
- STM32MP1 Online Training:
https://www.st.com/content/st_com/en/support/learning/stm32-education/stm32-online-training/stm32mp1-online-training.html