# NO9control **Repository Path**: overlook1127/no9control ## Basic Information - **Project Name**: NO9control - **Description**: 九号电车控制器的的cmake+ota初版 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-08 - **Last Updated**: 2026-07-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 九号控制器 — CAN OTA 固件升级系统 基于 **CAN 总线** 的 MCU 固件在线升级(OTA / IAP)系统,适用于 AT32F415 系列。 ## 系统组成 | 部分 | 路径 | 说明 | |------|------|------| | **Bootloader** | `bootloader/` | Keil MDK 工程,驻留在 Flash 低 16KB,负责固件接收/烧写/校验 | | **APP** | `app/` | CMake + GCC 工程,VS Code 开发,运行在 `0x08004000` 起始的应用固件 | | **上位机** | `上位机/` | Python CLI 工具,通过 CANable 走 CAN 协议烧录固件 | ## 硬件 | 项目 | 规格 | |------|------| | MCU | AT32F415CCT7 (Cortex-M4, 256KB Flash, 32KB SRAM) | | CAN 适配器 | CANable 2.0 (SLCAN 固件),默认 COM43 | | CAN 波特率 | 1 Mbps | | 调试器 | J-Link (仅烧录 Bootloader) | ## Flash 布局 ``` 0x08000000 ┌──────────────┐ │ Bootloader │ 16 KB 0x08004000 ├──────────────┤ │ │ │ APP 固件 │ ~240 KB │ │ 0x08040000 └──────────────┘ ```text SRAM 末尾 `0x20007FF0` 存放 Magic 标记 (`0x424C4D47`),软复位后 Bootloader 读取该标记决定是否留在 BL。 ## 通信协议 | CAN ID | 方向 | 用途 | |--------|------|------| | `0x100` | PC → MCU | 命令帧 | | `0x101` | MCU → PC | 应答帧 | | `0x102` | PC → MCU | 数据帧(256B/块,每帧 6B 数据) | | `0x103` | MCU → PC | 日志/Banner | | 命令 | 功能 | |------|------| | `0x00` PING | 检测设备在线 | | `0x01` GET_INFO | 获取芯片 ID / Flash 容量 | | `0x02` ERASE | 擦除 APP 区域 | | `0x03` WRITE_PREPARE | 准备接收数据块 | | `0x04` WRITE_FINALIZE | 完成写入,触发 CRC32 校验 | | `0x05` GO | 校验通过,跳转 APP | | `0x06` RESET | 软复位 | | `0x07` ENTER_BL | APP 运行时请求跳回 Bootloader | CRC32 多项式 `0xEDB88320`,对全固件计算。 ## 快速开始 ### 1. 烧录 Bootloader 用 Keil MDK 打开 `bootloader/Project/Temperature_Reading.uvprojx`,编译后通过 J-Link 烧录到 MCU。 > Bootloader 只需烧录一次,后续所有固件更新都通过 CAN OTA 完成。 ### 2. APP 开发(VS Code + CMake) ```bash # 配置项目(首次) # VS Code 中打开项目根目录,CMake Tools 会自动根据 CMakePresets.json 配置 # 或命令行: cmake --preset Debug cmake --build --preset Debug --target compile ``` VS Code 左侧 CMake 侧栏提供三个按钮: | 按钮 | 功能 | |------|------| | **compile** | 仅编译,生成 `.bin`,不烧录 | | **download** | 仅 OTA 烧录(用已有的 `.bin`,不编译) | | **flash** | 编译 + OTA 烧录一条龙 | 快捷键:`Ctrl+Shift+B` → 编译。 ### 3. 上位机依赖 ```bash cd 上位机 pip install python-can pyserial ``` ### 4. OTA 烧录 确保 CANable 插入并识别为 `COM43`(可在 `app/CMakeLists.txt` 中修改端口),然后: - **VS Code 中**:点击 CMake 侧栏的 `[flash]` 按钮 - **命令行**: ```bash cmake --build --preset Debug --target flash ``` - **直接调用 Python**: ```bash python 上位机/can_bl_gui.py --port COM43 --enter-bl --firmware build/Debug/app/ota_app.bin ``` ## 目录结构 ```text ├── bootloader/ # Bootloader (Keil MDK) │ ├── BL/ # 主逻辑 │ ├── APP/ # 入口 + 中断 │ ├── BSP/ # CAN / Flash / CRC32 / I2C 驱动 │ ├── FWLib/ # AT32F415 标准外设库 │ └── Project/ # Keil 工程文件 ├── app/ # APP (CMake + GCC) │ ├── APP/ # 入口 + 中断 │ ├── BSP/ # CAN / GPIO / NVIC 驱动 │ ├── FWLib/ # AT32F415 标准外设库 │ ├── CORE/ # CMSIS │ ├── linker/ # 链接脚本模板 │ └── CMakeLists.txt # 构建配置(含 compile/download/flash 目标) ├── 上位机/ # PC 上位机 (Python) │ └── can_bl_gui.py # CLI 烧录工具 ├── cmake/ # CMake 工具链 │ └── gcc-arm-none-eabi.cmake ├── CMakeLists.txt # 根构建文件 └── CMakePresets.json # CMake 预设 ``` ## 注意事项 - CAN 时钟精度要求 ≤1.58%,必须使用外部晶振(HEXT) - APP 的 `VTOR` 必须设为 `0x08004000` - Magic 标记地址不可被栈/堆覆盖 - 上位机依赖 `python-can` 的 SLCAN 接口,确保 CANable 固件为 candleLight 或 compatible