<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> ![image alt](https://www.st.com/bin/ecommerce/api/image.PF267131.en.feature-description-include-personalized-no-cpn-large.jpg) </center> > STM32MP157 Arm®-based dual Cortex®-A7 32 bits + Cortex®-M4 32 bits MPU in TFBGA361 package ![](i.imgur.com/xzP7pty.png) <center> ![](https://wiki.st.com/stm32mpu/nsfr_img_auth.php/9/9c/STM32MPU_Embedded_Software_architecture_overview.png) </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。 ![](https://i.imgur.com/Mlqa7rT.png) 而這個 ST-LINK USB (CN11) 連接埠的位置則是在板子下方偏右邊 ![](https://i.imgur.com/5UEjbrc.jpg) 使用 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 ``` ![](https://i.imgur.com/E7pckty.png) 啟動之後即可開始使用 ``` 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 ![](http://www.cs.ru.nl/lab/xenomai/exercises_xenomai2.4/ex10/tasklatency.jpg) ```c=604 clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &wakeup_time, NULL); clock_gettime(CLOCK_MONOTONIC, &current_time); this->record_jitter(&wakeup_time, &current_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> ![](https://i.imgur.com/8aNxuXe.jpg) </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