feat: 适配GD32E230F8推杆控制板并更新LA-T8工程文档

- LD放开为64K Flash/8K RAM,不使用Bootloader
- README更新为LA-T8-12-5-50/105-188推杆驱动工程
- 停用M888/M9999调试命令,工程代号改为51
This commit is contained in:
2026-08-11 09:03:05 +08:00
parent 43c25b2865
commit 0fd0d911a9
4 changed files with 213 additions and 353 deletions
+2 -2
View File
@@ -12,8 +12,8 @@ _Min_Stack_Size = 0x400; /* required amount of stack */
/* Memories definition */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
}
/* Sections */
+198 -338
View File
@@ -1,396 +1,256 @@
# GD32E23x 工程模板
# LA-T8 推杆驱动控制固件
仓库为兆易创新 GD32E23x 系列 MCU 的 CMake + VSCode 工程模板,适合嵌入式开发快速上手和团队协作
工程是 LA-T8-12-5-50/105-188 电动推杆的控制板驱动固件,基于 GD32E230F8Cortex-M23)开发,使用 CMake + VSCode + ARM GCC 构建
当前为调试工程:不配合 BootloaderFlash 从 `0x08000000` 全量使用,链接脚本已放开为 F8 的完整 `64KB Flash / 8KB RAM`
---
## 目录
- [适用范围](#适用范围)
- [默认配置](#默认配置)
- [快速开始](#快速开始)
- [推杆型号说明](#推杆型号说明)
- [硬件资源](#硬件资源)
- [控制原理](#控制原理)
- [串口协议](#串口协议)
- [命令表](#命令表)
- [工程配置](#工程配置)
- [工程结构](#工程结构)
- [板级配置](#板级配置)
- [Flash 偏移配置(配合 Bootloader](#flash-偏移配置配合-bootloader)
- [工具链准备](#工具链准备)
- [使用说明](#使用说明)
- [时钟配置说明](#时钟配置说明)
- [vcpkg 依赖管理(可选)](#vcpkg-依赖管理可选)
- [编译与烧录](#编译与烧录)
- [调试](#调试)
- [已知限制](#已知限制)
---
## 适用范围
## 推杆型号说明
- 适用于兆易创新 GD32E23x 系列 Cortex-M23 内核单片机
- 支持标准外设库开发
- 推荐开发环境:VSCode + CMake + ARM GCC 工具链
型号:`LA-T8-12-5-50/105-188`
| 型号片段 | 常见含义 |
|---|---|
| `LA-T8` | LA-T8 系列微型电动推杆 |
| `12` | 额定输入电压 12VDC |
| `5` | 空载速度约 5mm/s |
| `50` | 行程 50mm |
| `105` | 最小安装距约 105mm(该系列常见 Lmin ≈ 54.5mm + 行程) |
| `188` | 额定推/拉力约 188N |
> 型号对应参数以推杆实物铭牌或厂家规格书为准。本固件只输出 PWM 与方向信号,不采集推杆位置、限位或电流反馈。
---
## 默认配置
## 硬件资源
- MCU 主频:内部 RC 振荡器,系统时钟配置为 72MHz
- 调试串口:USART0PA2 TX / PA3 RX),115200 波特率
- I2C:默认硬件 I2C0PF0 SDA / PF1 SCL),可通过 `board_config.h` 切换为软件 I2C
| 功能 | 引脚 / 外设 | 说明 |
|---|---|---|
| 主控 | GD32E230F8 | Cortex-M2364KB Flash8KB RAM |
| 系统时钟 | IRC8M + PLL | 72MHz |
| 推杆 CH1 | PA10 / TIMER0_CH2 + PF0 方向 | 通道 0 |
| 推杆 CH2 | PA9 / TIMER0_CH1 + PF1 方向 | 通道 1 |
| 通信口 | PA2 TX / PA3 RX | F8 自动选择 USART1115200 8N1 |
| RS485 DE | PA1 | AF1,由 RS485 PHY 自动控制方向 |
| 状态 LED | PB1 | 低电平点亮 |
| 地址配置 | PA0 / PA4 / PA5 / PA6 | 当前已定义宏,暂未参与控制逻辑 |
| 调试通道 | SWD + SEGGER RTT | 不占用 UART 引脚 |
---
## 快速开始
## 控制原理
### 基于模板创建新项目
推杆驱动使用 TIMER0 输出两路 PWM,占空比范围为 `0 ~ 1000`
1. **克隆或复制本仓库**
```bash
git clone https://gitea.hulk.wang/hulk/gd32e23x_template_cmake_vscode.git my-new-project
cd my-new-project
```
```text
Timer 时钟 = 72MHz / (prescaler 2 + 1) = 24MHz
PWM 频率 = 24MHz / (period 999 + 1) = 24kHz
```
2. **修改项目配置** — 编辑 `cmake/project_config.cmake`
```cmake
set(PROJECT_NAME "MyProject") # 项目名称
set(BOARD_TYPE_CODE 20) # 板卡类型码(协议帧中的标识)
set(VERSION_MAJOR 1) # 主版本号
set(VERSION_MINOR 0) # 次版本号
set(VERSION_PATCH 0) # 修订号
set(BUILD_VARIANT "APP") # 编译变体
```
当前实现
3. **添加业务源文件** — 编辑 `CMakeLists.txt`,在 `TARGET_SRC` 中添加你的 `.c` 文件。
| 命令 | 方向引脚 | PWM |
|---|---|---|
| M3 推出 | 低 | 占空比 = `duty` |
| M4 拉回 | 高 | 占空比 = `1000 - duty` |
| M5 停止 | 高 | 输出置为停止状态 |
4. **配置板级引脚** — 编辑 `Inc/board_config.h`,修改 I2C、UART、LED 等引脚定义
`duty` 越大表示电机获得的有效功率越大,实际推杆速度还受负载、电压和推杆本身特性影响
5. **编译**
```bash
cmake --preset Debug
cmake --build build/Debug
```
产物在 `build/Debug/` 下,包含 `.elf`、`.hex`、`.bin`、`.map`、`.list`。
---
### 分支说明
## 串口协议
| 分支 | 用途 |
|------|------|
| `template_pc` | **主模板**(推荐),用于桌面端 VSCode 开发 |
| `template_xl` | 小琅适配版 |
| `main` | 早期版本,不推荐使用 |
通信口为 RS485,默认 `115200, 8N1`。协议帧最大长度为 32 字节。
### 主机 -> 设备命令帧
```text
D5 01 LEN CMD... CRC
```
| 字节 | 含义 |
|---|---|
| `D5` | 包头 |
| `01` | 板卡类型标识(协议帧类型,与 M999 返回的工程代号不同) |
| `LEN` | `CMD` 区字节数 |
| `CMD` | 命令内容,如 `M3P0S500` |
| `CRC` | 从索引 1 到倒数第 2 字节的累加和,取低 8 位 |
示例:`M3P0S500` 完整帧
```text
D5 01 08 4D 33 50 30 53 35 30 30 F1
```
### 设备 -> 主机响应帧
```text
B5 TYPE LEN DATA... CRC
```
| TYPE | 含义 |
|---|---|
| `F0` | 成功 |
| `F1` | CRC 错误 |
| `F2` | 包头错误 |
| `F3` | 板卡类型错误 |
| `F4` | 长度错误 |
| `FD` | 参数错误 |
| `FE` | 命令错误 |
| `FF` | 通用错误 |
---
## 命令表
| 命令 | 参数 | 说明 |
|---|---|---|
| `M3P{ch}S{duty}` | `ch=0/1``duty=0~1000` | 推杆推出 |
| `M4P{ch}S{duty}` | `ch=0/1``duty=0~1000` | 推杆拉回 |
| `M5P{ch}` | `ch=0/1` | 停止指定通道 |
| `M999` | 无 | 返回固件版本 |
| `M888` | 无 | 软件复位(当前已注释停用) |
| `M9999` | 无 | 进入 Bootloader(当前已注释停用) |
命令示例:
```text
M3P0S500 // CH1 推出,占空比 500
M4P1S1000 // CH2 拉回,占空比 1000
M5P0 // CH1 停止
M999 // 返回版本信息
```
`M999` 当前返回格式为 `v{工程代号}.{主版本}.{次版本}.{修订号}`,当前工程为 `v51.0.0.1`
---
## 工程配置
### 项目元信息
配置文件:[cmake/project_config.cmake](E:/Hulk_Coding/actuator_ctrl/cmake/project_config.cmake)
| 配置项 | 当前值 |
|---|---|
| `PROJECT_NAME` | `actuator` |
| `BOARD_TYPE_CODE` | `51` |
| `VERSION` | `V0.0.1` |
| `BUILD_VARIANT` | `APP` |
### 功能开关
配置文件:[Inc/board_config.h](E:/Hulk_Coding/actuator_ctrl/Inc/board_config.h)
| 宏 | 当前值 | 说明 |
|---|:---:|---|
| `RS485_MODE` | `ENABLE` | 使能 RS485 通信与 DE 引脚 |
| `SEGGER_RTT_DETECTION` | `ENABLE` | 使能 SEGGER RTT 调试输出 |
| `DEBUG_MODE` | `DISABLE` | 关闭 printf 串口调试 |
| `COM_DEBUG` | `DISABLE` | 关闭命令帧调试打印 |
| `DEBUG_VERBOSE` | `DISABLE` | 关闭详细调试信息 |
| `SOFTWARE_IIC` | `DISABLE` | I2C 未参与当前推杆控制逻辑 |
### 链接脚本
配置文件:[LD/gd32e23x_flash.ld](E:/Hulk_Coding/actuator_ctrl/LD/gd32e23x_flash.ld)
```text
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
```
当前为独立调试固件,不从 Bootloader 偏移启动,向量表偏移保持 `0x00`
---
## 工程结构
```
```text
.
├── CMakeLists.txt # 主构建文件
├── CMakePresets.json # CMake 预设(Debug/Release
├── cmake/
│ ├── arm-none-eabi-gcc.cmake # ARM GCC 工具链配置
│ ├── project.cmake # 编译选项(-Os/-O0, -mcpu=cortex-m23
│ ├── project_config.cmake # 项目名/版本号/编译变体
│ └── version.h.in # 自动生成固件版本头
├── Inc/ # 头文件
│ ├── board_config.h # 板级引脚定义 + 功能开关
├── CMakePresets.json # Debug / Release 预设
├── cmake/ # 工具链与版本配置
├── Inc/
│ ├── board_config.h # 引脚、外设与功能开关
│ ├── actuator.h # 推杆驱动接口
│ ├── command.h # 串口命令协议
── i2c.h / led.h / systick.h / uart.h
│ └── uart_ring_buffer.h / gd32e23x_it.h / gd32e23x_libopt.h
├── Src/ # 源码
│ ├── main.c # 入口函数
│ ├── command.c # 命令解析处理
│ ├── board_config.c # MCU 型号自动检测
── i2c.c / led.c / systick.c / uart.c / uart_ring_buffer.c
│ └── gd32e23x_it.c / system_gd32e23x.c / syscalls.c
├── SDK/
│ ├── CMSIS/ # ARM CMSIS Core (Cortex-M23) + GD 启动文件
│ └── GD32E23x_standard_peripheral/ # GD32 标准外设库
── ...
├── Src/
│ ├── main.c # 主循环
│ ├── actuator.c # PWM / 方向控制
│ ├── command.c # 协议解析与命令处理
│ ├── uart.c # RS485 / UART 初始化
── ...
├── SDK/ # CMSIS 与 GD32 标准外设库
├── LD/gd32e23x_flash.ld # 链接脚本
├── doc/ # 芯片数据手册
└── .vscode/ # VSCode 调试/烧录配置
├── doc/ # GD32E230 数据手册与技术文档
└── .vscode/ # 编译、烧录、调试任务
```
---
## 板级配置(`Inc/board_config.h`
所有功能开关和引脚定义集中在 `Inc/board_config.h`。功能开关均为单行数值宏:将右侧的 `ENABLE` 或 `DISABLE` 改为另一值即可;其中 `ENABLE` 为 `1``DISABLE` 为 `0`。以下为完整的宏开关说明和推荐使用方式。
### 功能开关速查表
| 宏 | 作用 | 默认值 | Release 建议 |
|---|------|:---:|:---:|
| `SOFTWARE_IIC` | I2C 实现方式 | `DISABLE`(硬件) | `DISABLE` |
| `DEBUG_MODE` | printf 串口输出 | `DISABLE` | `DISABLE` |
| `COM_DEBUG` | 命令帧调试打印 | `DISABLE` | `DISABLE` |
| `DEBUG_VERBOSE` | 详细调试信息 | `DISABLE` | `DISABLE` |
| `SEGGER_RTT_DETECTION` | SEGGER RTT 支持 | `ENABLE` | `DISABLE` |
---
### `SOFTWARE_IIC` — I2C 实现方式
选择 I2C 使用硬件外设还是软件 GPIO 模拟。
> 当前工程尚未实现 `SOFTWARE_IIC` 的条件编译驱动选择;该宏已迁移为数值配置,但改值不会在此版本切换 I2C 实现。
```c
#define SOFTWARE_IIC DISABLE // DISABLE: 硬件 I2C(默认);ENABLE: 软件 I2CGPIO 模拟)
```
| 选项 | 优点 | 缺点 |
|------|------|------|
| 硬件 I2C | DMA 支持、CPU 占用低 | 仅限固定引脚、调试复杂 |
| 软件 I2C | 任意 GPIO、移植方便 | CPU 占用高、速率受限 |
> 切换后需同步修改下方 I2C 引脚定义。
---
### `DEBUG_MODE` — 调试模式
开启后 USART0 输出 printf 调试信息。**Release 固件必须关闭。**
```c
#define DEBUG_MODE DISABLE // DISABLE: 关闭(默认);ENABLE: 开启调试输出
```
**影响范围:**
- 使能 `USART0` 初始化和 `printf` 重定向到串口
- 会占用 PA2/PA3 引脚和 USART0 硬件资源
- 增加 ROM 约 2~4KB(取决于 printf 调用量)
---
### `COM_DEBUG` — 命令帧调试打印
开启后串口命令解析过程打印每帧的详细内容(地址、长度、数据、校验)。**仅调试通信协议时开启。**
```c
#define COM_DEBUG DISABLE // DISABLE: 关闭(默认);ENABLE: 开启命令帧调试
```
**依赖:** 需要先开启 `DEBUG_MODE`,否则输出无法外发。
**输出示例:**
```text
[CMD] ADDR=01 LEN=05 DATA: AA BB CC DD EE CHK=OK
```
> ⚠️ Release 必须关闭,否则大量串口输出会严重拖慢主循环。
---
### `DEBUG_VERBOSE` — 详细调试信息
在 `DEBUG_MODE` 基础上输出更底层的信息,如 I2C 总线扫描结果、MCU 型号识别等。
```c
#define DEBUG_VERBOSE DISABLE // DISABLE: 关闭(默认);ENABLE: 开启详细调试
```
**额外输出:**
- 启动时打印 MCU Flash 容量检测结果
- I2C 初始化时扫描总线上的设备地址
- 其他诊断信息
> 依赖 `DEBUG_MODE`,开启后 ROM 进一步增加约 1~2KB。
---
### `SEGGER_RTT_DETECTION` — SEGGER RTT 支持
RTTReal-Time Transfer)是 SEGGER 的调试通道技术,通过 SWD 接口传输数据,不占用串口引脚,速度远超 UART。
```c
#define SEGGER_RTT_DETECTION ENABLE // DISABLE: 禁用 RTTENABLE: 启用 RTT(默认)
```
**启用时:**
- 自动包含 `SEGGER_RTT.h`,提供 `RTT_printf` / `RTT_WriteString` / `RTT_PutChar` 宏
- `SDK/SEGGER_RTT/` 模块参与编译和链接
- 可用 J-Link RTT Viewer 或 VSCode + cortex-debug 查看实时日志
**禁用时:**
- 应用层 RTT 头文件引用与调用代码均在预处理阶段排除
- RTT 宏展开为空操作;应用目标不生成 RTT 调用代码
- 为保持现有 CMake SDK 加载方式,`SDK/SEGGER_RTT/` 仍会参与构建;静态库中未被引用的对象不会被链接器提取
> **Release 建议关闭** — RTT 依赖调试器连接,量产固件中无意义且占用 ROM。
**依赖关系总览:**
```
COM_DEBUG ──── 依赖 ──→ DEBUG_MODE
DEBUG_VERBOSE ─ 依赖 ──→ DEBUG_MODE
SEGGER_RTT_DETECTION ─ 独立,与 DEBUG_MODE 并行
```
---
### 引脚定义
所有引脚宏集中在 `board_config.h` 尾部,按需修改:
```c
/* I2C */
#define I2C_SCL_PORT GPIOF
#define I2C_SCL_PIN GPIO_PIN_1
#define I2C_SDA_PORT GPIOF
#define I2C_SDA_PIN GPIO_PIN_0
/* LED */
#define LED_RCU RCU_GPIOB
#define LED_PORT GPIOB
#define LED_PIN GPIO_PIN_1
/* UART */
#define UART_GPIO_PORT GPIOA
#define UART_TX_PIN GPIO_PIN_2
#define UART_RX_PIN GPIO_PIN_3
#define UART_BAUDRATE 115200U
```
### MCU 型号自动检测
`board_config.c` 中的 `mcu_detect_and_config()` 上电自动识别 GD32E230 的 Flash 容量(F4=16K / F6=32K / F8=64K),结果存入全局变量 `g_mcu_flash_size`,并自动选择对应的 UART 外设(USART0 或 USART1)。
---
## Flash 偏移配置(配合 Bootloader
如果固件需要通过 Bootloader 启动(Bootloader 占用 Flash 前部区域),需修改两处:
**1. 链接脚本** — `LD/gd32e23x_flash.ld` 第 15 行:
```c
// 默认:从 Flash 起始运行
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 16K
// 配合 Bootloader:前 8KB 留给 BootloaderApp 从 0x08002000 开始
FLASH (rx) : ORIGIN = 0x08002000, LENGTH = 8K
```
**2. 向量表偏移** — `Src/system_gd32e23x.c` 第 44 行:
```c
// 默认
#define VECT_TAB_OFFSET (uint32_t)0x00
// 配合 Bootloader(值 = Flash 偏移量,不含 0x0800 前缀)
#define VECT_TAB_OFFSET (uint32_t)0x2000
```
> ⚠️ 两个偏移值必须对应修改:`LD` 中的 `ORIGIN` 减去 `0x08000000` 应等于 `VECT_TAB_OFFSET`。
---
## 工具链准备
### 1. ARM GCC 工具链
- **版本**xpack-arm-none-eabi-gcc-11.3.1-1.1
- **建议解压路径**:工程根目录下 `Toolchain/xpack-arm-none-eabi-gcc-11.3.1-1.1`
- **官方下载地址**https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases
- **路径自定义**
如需自定义工具链路径,修改 `cmake/arm-none-eabi-gcc.cmake` 中的 `_TOOLCHAIN_CANDIDATES` 列表,或通过 CMake 参数传入:
```bash
cmake --preset Debug -DTOOLCHAIN_DIRECTORY=/your/path/bin
```
### 2. OpenOCD(调试/烧录)
- **版本**xpack-openocd-0.11.0-3
- **建议解压路径**:任意位置(在 `.vscode/launch.json` 中配置路径)
- **获取地址**https://github.com/burakenez/gd32-tools-xpack-openocd/tree/v0.11.0-3
- **说明**
- 本版本提取自 Embedded Builder V1.4.1.23782。
- ⚠️ 请勿随意更换版本,因 GD32 MCU 支持有限,推荐严格使用此版本。
- **路径自定义**
修改 `.vscode/launch.json` 中 `miDebuggerPath` 和 `serverpath` 指向你的 OpenOCD 路径。
---
## 使用说明
## 编译与烧录
### 编译
```bash
# Debug 构建(-O0, -g3
cmake --preset Debug
cmake --build build/Debug
# Release 构建(-Os, -g0
```powershell
cmake --preset Release
cmake --build build/Release
cmake --build --preset Release
```
Debug 版本将 `Release` 换成 `Debug`。构建产物位于 `Build/Release/Application/`
```text
Application.elf
Application.hex
Application.bin
Application.map
actuator_V0.0.1_APP_<日期>.hex
actuator_V0.0.1_APP_<日期>.bin
```
### 烧录
通过 VSCode 任务栏运行 `Flash MCU` 任务,或命令行
使用 CMSIS-DAP + OpenOCD
```bash
openocd -f interface/cmsis-dap.cfg -f target/gd32e23x.cfg -c "program build/Debug/Application.elf verify reset exit"
```powershell
& 'D:\toolchain\openocd\bin\openocd.exe' -s 'D:\toolchain\openocd\scripts' `
-f 'interface/cmsis-dap.cfg' -f 'target/gd32e23x.cfg' `
-c 'reset_config srst_only connect_assert_srst; init; reset halt; flash write_image erase Build/Release/Application/Application.elf; reset; exit'
```
### 产物
编译输出位于 `build/<Config>/`
| 文件 | 说明 |
|------|------|
| `Application.elf` | ELF 固件(调试用) |
| `{项目名}_{版本}_{编译条件}_{日期}.hex` | Hex 文件 |
| `{项目名}_{版本}_{编译条件}_{日期}.bin` | 二进制文件 |
| `{项目名}_{版本}_{编译条件}_{日期}.list` | 反汇编清单 |
| `{项目名}_{版本}_{编译条件}_{日期}.map` | 内存映射 |
也可以直接在 VSCode 中运行 `Flash MCU` 任务。
---
## 时钟配置说明
## 调试
本工程默认系统时钟为内部 IRC8M 振荡器经 PLL 倍频后的 72MHz
如需修改主频或时钟源,请编辑 `Src/system_gd32e23x.c` 文件:
1. 查找如下宏定义区:
```c
// #define __SYSTEM_CLOCK_8M_HXTAL (__HXTAL)
// #define __SYSTEM_CLOCK_8M_IRC8M (__IRC8M)
// #define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000)
#define __SYSTEM_CLOCK_72M_PLL_IRC8M_DIV2 (uint32_t)(72000000)
```
2. 取消你需要的时钟方案的注释,并注释掉其它方案。
3. 保存后重新编译工程即可生效。
详细时钟初始化流程可参考 `Src/system_gd32e23x.c` 文件中的 `system_clock_config` 及相关函数实现。
- 使用 `.vscode/launch.json` 中的 `Debug with OpenOCD` 配置进行 SWD 调试
- `SEGGER_RTT_DETECTION` 开启时,可通过 RTT Viewer 或 cortex-debug 查看 `RTT_printf` 输出。
- 当前固件 Release 也保留了 RTT,便于联调;量产固件可关闭该宏以减小 ROM。
---
## vcpkg 依赖管理(可选)
## 已知限制
本工程可选支持 vcpkg 作为 C/C++ 工具链和构建工具的自动化依赖管理方案
- 自动下载和管理如 CMake、Ninja 等构建工具,简化环境配置
- 可扩展用于第三方 C/C++ 库的统一管理。
**启用方法**
1. 在项目根目录创建 `vcpkg-configuration.json` 文件,内容如下:
```json
{
"registries": [
{
"name": "microsoft",
"location": "https://aka.ms/vcpkg-ce-default",
"kind": "artifact"
},
{
"name": "arm",
"location": "https://aka.ms/vcpkg-artifacts-arm",
"kind": "artifact"
}
],
"requires": {
"arm:tools/ninja-build/ninja": "^1.12.0",
"arm:tools/kitware/cmake": "^3.28.4"
}
}
```
2. 启动 VSCode 或命令行,vcpkg 会自动检测并安装所需工具。
如不需要 vcpkg,可忽略本文件。
- 当前固件只控制推杆的 PWM 和方向,不读取推杆位置、限位开关或电流反馈
- `M888``M9999` 当前已在 `Src/command.c` 中注释停用,避免调试时误复位或误进入 Bootloader;需要时取消注释即可恢复。
- 若后续要配合 Bootloader,需要把 `LD/gd32e23x_flash.ld` 的 Flash 起点改为 Bootloader 之后的地址,并同步修改 `Src/system_gd32e23x.c` 中的 `VECT_TAB_OFFSET`
+12 -12
View File
@@ -507,16 +507,16 @@ void handle_command(const uint8_t *frame, uint8_t len) {
/* ==========================================
* M888 软件重启命令
* ========================================== */
case 888u:
// 先发送确认响应
send_response(RESP_TYPE_OK, s_report_status_ok, sizeof(s_report_status_ok));
// case 888u:
// // 先发送确认响应
// send_response(RESP_TYPE_OK, s_report_status_ok, sizeof(s_report_status_ok));
// 短暂延时确保响应发送完成
delay_ms(100);
// // 短暂延时确保响应发送完成
// delay_ms(100);
// 执行软件重启
system_software_reset();
return;
// // 执行软件重启
// system_software_reset();
// return;
/* ==========================================
* M999 输出固件版本号命令
@@ -545,10 +545,10 @@ void handle_command(const uint8_t *frame, uint8_t len) {
/* ==========================================
* M9999 进入OTA模式
* ========================================== */
case 9999u: //M9999: 进入OTA模式
__disable_irq(); // 关中断,防止竞态条件
NVIC_SystemReset(); // 触发系统复位,进入Bootloader
return;
// case 9999u: //M9999: 进入OTA模式
// __disable_irq(); // 关中断,防止竞态条件
// NVIC_SystemReset(); // 触发系统复位,进入Bootloader
// return;
default:
send_response(RESP_TYPE_CMD_ERR, s_report_status_err, sizeof(s_report_status_err));
+1 -1
View File
@@ -1,6 +1,6 @@
# Project basic info
set(PROJECT_NAME "actuator")
set(BOARD_TYPE_CODE 99)
set(BOARD_TYPE_CODE 51)
set(VERSION_MAJOR 0)
set(VERSION_MINOR 0)
set(VERSION_PATCH 1)