welcom ! Handel home

2025年4月16日 星期三

freertos olimex-stm32-e407 micro-ROS code

 bash

mkdir -p ~/firmware_ws/src cd ~/firmware_ws git clone https://github.com/micro-ROS/micro_ros_setup src/micro_ros_setup rosdep update rosdep install --from-path src --ignore-src -y source /opt/ros/humble/setup.bash colcon build source install/local_setup.bash

當你執行指令:

bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407

這會建立適用於 STM32F407(Olimex STM32-E407 開發板)+ FreeRTOS 的 micro-ROS 韌體專案,接下來需要進行的步驟如下:


✅ STM32F4 + micro-ROS firmware 編譯與燒錄流程


① 建立 Firmware 專案(你已完成)

bash
ros2 run micro_ros_setup create_firmware_ws.sh freertos olimex-stm32-e407

會產生以下結構於 firmware/ 目錄中:

objectivec
firmware/ ├── freertos_apps/ ← 可放 app.c(你的 micro-ROS 節點程式) ├── mcu_ws/ ← 編譯產出資料夾 ├── build/ ← CMake 檔案中繼產物 ├── firmware.mk ← 預設編譯流程 └── ...

② 自訂 micro-ROS 範例應用(修改 app.c)

你可以修改:

bash
#firmware/freertos_apps/apps/micro_ros_olinux_e407/app.c

bash
firmware/freertos_apps/microros_olimex_e407_extensions/app.c

範例:定時發佈一個 Topic:

c
#include <rcl/rcl.h> #include <std_msgs/msg/int32.h> void appMain(void *argument) { rcl_allocator_t allocator = rcl_get_default_allocator(); rclc_support_t support; rcl_node_t node; rcl_publisher_t publisher; std_msgs__msg__Int32 msg; rclc_support_init(&support, 0, NULL, &allocator); rcl_node_init_default(&node, "stm32_node", "", &support); rcl_publisher_init_default(&publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "stm32_int32"); msg.data = 0; while (1) { rcl_publish(&publisher, &msg, NULL); msg.data++; HAL_Delay(1000); } }

③ 建構韌體

bash
ros2 run micro_ros_setup build_firmware.sh

這會自動呼叫 make 編譯 STM32 firmware,產出 .elf.bin 等檔案於:

bash
firmware/build/firmware.elf firmware/build/firmware.bin

④ 燒錄韌體到 STM32F407 開發板

🧰 準備:

  • USB ↔ UART 轉接器或 ST-Link v2(看板子配置)

  • 安裝 STM32Flasher / openocd / st-flash 工具

🔥 使用 openocd(推薦)

1. 安裝 openocd

bash
sudo apt install openocd

2. 啟動燒錄

bash
cd firmware openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program build/firmware.elf verify reset exit"

⑤ 啟動 micro-ROS Agent 並連接

開啟 ROS2 主機(如 RPi 或 Docker):

bash
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0

請根據實際接線修改為 /dev/ttyUSB0/dev/ttyAMA0

成功會顯示:

arduino
[INFO] [agent]: Client connected

🧪 測試 ROS2 topic 傳輸

bash
ros2 topic list ros2 topic echo /stm32_int32

app.c 有建構 publisher,就會看到連續的資料輸出。


✅ 常見問題與檢查清單

問題檢查事項
Agent 沒有 Client connectedSTM32 韌體未成功上傳或 UART 接錯
無法看到 topicapp.c 是否正確設定 publisher?
燒錄失敗STM32 是否正確進入 boot 模式?
無法開機確認使用的是 Olimex E407 相容板子


沒有留言: