# 外骨骼主控32 **Repository Path**: bigcat0001/exoskeleton-controller-32 ## Basic Information - **Project Name**: 外骨骼主控32 - **Description**: 本项目为openexo遥操外骨骼主控STM32控制器代码 - **Primary Language**: C - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-05-08 - **Last Updated**: 2026-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 外骨骼主控 STM32F407ZGT6 ## 项目简介 openexo 外骨骼控制系统的 STM32 主控端代码。STM32F407ZGT6 作为系统主控,负责串口屏交互,并通过三路通信通道发送 ExoLink-RT 协议帧:2.4G 无线(UART2)、有线串行(UART4)、WiFi UDP(SPI2→ESP32)。ESP32 负责 BLE 配网、WiFi UDP 转发和密码存储。 ## 系统架构 ``` [串口屏 Nextion] | USART3 (PB10/PB11, 9600) | [STM32F407ZGT6] ---- SPI2 (PB12~15) ---- [ESP32 模组] ---- UDP ---- [上位机 / 其他节点] | - BLE 配网 | USART2 (PA2/PA3, 9600) - WiFi UDP 发送 | - NVS 密码存储 [2.4G 无线模块] --------------------------------- 2.4G 无线 ---- [上位机 / 其他节点] | | UART4 (PC10/PC11, 9600) | [有线串行设备] ----------------------------------- 有线串行 ---- [上位机 / 其他节点] ``` ## 硬件引脚分配 | 外设 | 引脚 | 说明 | |------|------|------| | USART1 TX/RX | PA9 / PA10 | 调试日志(printf 重定向,115200) | | USART2 TX/RX | PA2 / PA3 | 2.4G 无线模块,9600 baud | | USART3 TX/RX | PB10 / PB11 | Nextion 串口屏,9600 baud | | UART4 TX/RX | PC10 / PC11 | ExoLink-RT 有线发送,9600 baud | | SPI2 NSS | PB12 | ESP32 片选(软件控制) | | SPI2 SCK | PB13 | SPI 时钟 | | SPI2 MISO | PC2 | ESP32 → STM32 | | SPI2 MOSI | PB15 | STM32 → ESP32 | | ESP32 DRDY | PA1 | ESP32 有数据时拉低,触发 EXTI1 下降沿中断 | ## 目录结构 ``` STM32F407ZGT6/ ├── USER/ │ ├── main.c # 主函数,FreeRTOS 任务编排 │ ├── stm32f4xx_it.c # 中断向量表 │ └── F407.uvprojx # Keil MDK 工程文件 ├── HARDWARE/ │ ├── SPI2/ # SPI2 主模式驱动(PB12-15) │ ├── ESP32_SPI/ # STM32↔ESP32 SPI 通信协议层 │ ├── EXOLINK/ # ExoLink-RT 协议构建/解析/CRC16 │ ├── USART2/ # UART2 驱动(2.4G 模块) │ ├── USART3/ # UART3 驱动(Nextion 串口屏) │ └── USART4/ # UART4 驱动(ExoLink-RT 有线发送) ├── SYSTEM/ │ ├── usart/ # UART1 驱动(调试日志) │ ├── delay/ # 延时函数 │ └── sys/ # 系统时钟、GPIO 位带操作 ├── FWLIB/ # STM32F4 标准外设库 ├── FreeRTOS/ # FreeRTOS V9.0.0 内核 └── CORE/ # ARM Cortex-M4 启动文件 ``` ## FreeRTOS 任务说明 | 任务 | 优先级 | 周期 | 功能 | |------|--------|------|------| | `task_exolink_tx` | 3 | 2000ms | 构建 ExoLink-RT 帧,经 SPI 发给 ESP32(UDP)、UART2(2.4G)和 UART4(有线串行) | | `task_screen_rx` | 3 | 20ms | 解析 UART3 串口屏命令,转发 WiFi 配置/IP 设置给 ESP32 | | `task_serial_rx` | 3 | 10ms | 解析 UART2(2.4G)和 UART4(有线串行)接收的 ExoLink-RT 帧 | | `task_esp32_rx` | 3 | 事件驱动 | 等待 PA1 DRDY 中断,读取 ESP32 推送数据并更新串口屏 | | `task_heartbeat` | 1 | 1000ms | 打印系统运行状态(UDP/2.4G/串行使能、IP 等) | ## STM32↔ESP32 SPI 通信协议 所有帧以 `0xAA` 开头,第二字节为类型。 **配置类(短帧,无校验):** ``` [AA] [TYPE] [DATA...] ``` **协议帧(直接透传 ExoLink-RT):** ``` [AA] [09] [47字节 ExoLink-RT 原始帧] ``` | TYPE | 方向 | 说明 | DATA | |------|------|------|------| | 0x01 | STM32 → ESP32 | 设置 UDP 目标 IP | IP 字符串(≤16字节,`\0` 结尾) | | 0x02 | STM32 → ESP32 | 发送 WiFi 凭据 | `#SSID#PASSWORD` 格式字符串 | | 0x03 | STM32 → ESP32 | WiFi 扫描请求 | 无 | | 0x04 | ESP32 → STM32 | 返回 ESP32 自身 IP | IP 字符串(≤16字节,`\0` 结尾) | | 0x05 | ESP32 → STM32 | WiFi 扫描结果 | `[COUNT][SSID0\0][SSID1\0]...`,`0xFF` 结尾填充 | | 0x06 | ESP32 → STM32 | UDP 接收长帧 | 47字节 ExoLink-RT 原始帧 | | 0x09 | STM32 → ESP32 | 发送 ExoLink-RT 帧 | 47字节原始协议帧(不修改内容) | **ESP32 推送流程(事件驱动):** ``` ESP32 有数据 → 拉低 PA1(DRDY) STM32 EXTI1 下降沿中断 → vTaskNotifyGiveFromISR 唤醒 task_esp32_rx task_esp32_rx 读取 SPI → 解析 TYPE → 更新串口屏 / 解析帧 ``` ## ExoLink-RT 协议帧格式 帧总长 **47 字节**: ``` [AA][FC][SEQ_H][SEQ_L][DATA 40B][CRC_H][CRC_L][55] ``` | 字段 | 长度 | 说明 | |------|------|------| | Header | 1B | 固定 `0xAA` | | FuncCode | 1B | `0x01`=CTRL `0x02`=FEEDBACK `0x03`=ESTOP `0x04`=CALIB `0x05`=HEARTBEAT | | SEQ | 2B | 序列号,大端,自动递增 | | 左臂关节 | 14B | 7×uint16,大端,`0~16384` 对应 `0~360°` | | 右臂关节 | 14B | 同上 | | 手部数据 | 12B | 设备类型、按键、扳机、摇杆等 | | CRC16 | 2B | CRC16-CCITT(poly=0x1021,init=0xFFFF),覆盖 bytes[0..43] | | Tail | 1B | 固定 `0x55` | 角度换算:`uint16 = (degrees / 360.0) × 16384` ## 串口屏命令格式(USART3) 串口屏发送的数据以 `;` 结尾,STM32 在缓冲区中查找标志字符: | 标志 | 格式示例 | 说明 | |------|----------|------| | `@` | `@0;` `@1;` | UDP 关/开 | | `@` | `@2;` `@3;` | 2.4G 无线 关/开 | | `@` | `@4;` `@5;` | 有线串行 关/开 | | `#` | `#MySSID#MyPassword;` | WiFi 凭据,转发给 ESP32 | | `$` | `$192.168.1.100;` | 设置 UDP 目标 IP,转发给 ESP32 | STM32 收到 ESP32 IP 后,向串口屏发送: ``` page_ip.ip1.txt.str="192.168.x.x"; page(page_ip); ``` ## 开发环境 - IDE:Keil MDK 5 - 编译器:ARM Compiler 5(AC5,C89/C90 标准) - FreeRTOS:V9.0.0 - STM32 库:标准外设库(StdPeriph) - 系统时钟:168MHz(外部晶振 + PLL) ## 注意事项 - UART1(PA9/PA10)仅用于 `printf` 调试输出,不承担业务功能 - FreeRTOS 中断优先级:`configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5`,优先级 0~4 的中断不受 FreeRTOS 管理,**不能**在其中调用 FreeRTOS API - EXTI1(PA1 DRDY)中断优先级设为 6,低于 SYSCALL 阈值,可安全调用 `vTaskNotifyGiveFromISR` - ESP32 代码在独立仓库维护,本仓库不包含 ESP32 端代码