# 自定义固件开发 自定义固件开发适合希望自己编写 CAN、RS485 和设备控制逻辑的用户。样例已经配置好 STM32F407、开发板引脚和基础外设,可以直接用 Keil 5 打开并修改。 这些样例不包含 V47 原厂固件的 USB/SPI 转 CAN/RS485、SocketCAN 和离线执行功能。如果需要保留这些功能,只增加 IIC、ADC、串口设备或自己的业务代码,请选择[原厂固件二次开发](official_firmware_development)。 ## 选择合适的样例 | 开发需求 | 推荐工程 | | --- | --- | | 自定义固件控制 CAN 标准帧设备 | [CAN 标准帧控制样例](#can-标准帧控制样例) | | 自定义固件控制 CAN 扩展帧设备 | [CAN 扩展帧控制样例](#can-扩展帧控制样例) | | 自定义固件控制 RS485 设备 | [RS485 控制样例](#rs485-控制样例) | | 保留 SANPO 原厂USB/SPI转CAN/RS485控制功能,只增加外设 | [原厂固件二次开发](official_firmware_development) | 样例下载入口:[F407 自定义固件样例](https://gitcode.com/sanpo/robot/tree/main/products/spine/v4/f407/firmware-examples/direct-development) ![SANPO SPINE STM32F407 引脚定义](SCH_SANPO_SPINE_F407.png) ## 两颗 MCU 使用同一套固件 开发板上的两颗 STM32F407 型号和引脚配置相同,CAN 和 RS485 样例都只需要一套工程。同一个编译结果可以烧录到任意一颗 MCU,也可以分别烧录到两颗 MCU。 | 下载接口 | 工程中的接口 | 开发板接口 | | --- | --- | --- | | MCU(1)的 SWD | CAN1/CAN2、RS485-A/RS485-B | CAN-1/CAN-2、RS485-1/RS485-2 | | MCU(2)的 SWD | CAN1/CAN2、RS485-A/RS485-B | CAN-3/CAN-4、RS485-3/RS485-4 | ## Keil 开发环境 三个样例使用相同的开发环境: - Keil MDK 5; - Arm Compiler 5.06 update 7; - `Keil::STM32F4xx_DFP` 3.1.1; - ST-LINK 调试器。 打开样例中的 `.uvprojx` 文件,按 `F7` 编译。烧录时选择 ST-LINK(SWD)下载口,不要执行全片擦除,以免删除开发板出厂信息和原厂固件保存的数据。 每个样例都包含 `.ioc`。可以使用 STM32CubeMX 调整基础外设,但生成代码前应先备份工程;生成后要重新核对 CAN/RS485 参数、方向控制、用户代码和 Keil 工程设置。 ## CAN 标准帧控制样例 下载:[CAN 标准帧控制样例](https://gitcode.com/sanpo/robot/tree/main/products/spine/v4/f407/firmware-examples/direct-development/can-standard) 该工程默认以 1 Mbit/s 从本 MCU 对应的两路 CAN 每秒发送一条标准帧: ```text ID = 0x141 Data = 9A 00 00 00 00 00 00 00 ``` 调试串口 USART3 使用 `115200-8-N-1`,会显示发送和接收到的 CAN ID、数据长度和内容。 默认数据只用于演示发送方法,不保证适用于所连接的设备。接入电机或执行器前,应先按照设备协议修改 CAN ID 和数据。具体修改位置和 Keil 操作步骤见样例目录中的 README。 ## CAN 扩展帧控制样例 下载:[CAN 扩展帧控制样例](https://gitcode.com/sanpo/robot/tree/main/products/spine/v4/f407/firmware-examples/direct-development/can-extended) 该工程演示 Cybergear 扩展帧控制。默认参数如下: | 项目 | 默认值 | | --- | ---: | | CAN 波特率 | 1 Mbit/s | | Motor ID | 12 | | 往复幅度 | 0.2 rad | | 往复频率 | 0.2 Hz | | 发送周期 | 10 ms | | Kp / Kd | 10.0 / 0.5 | 烧录后程序会自动设置模式、使能电机并开始往复运动。首次测试必须架空输出轴、清空运动范围,并准备随时断开电机电源。程序默认把指令发送到本 MCU 的两路 CAN;只测试一路时,建议只连接目标电机或修改发送函数。 具体参数位置、调试串口输出和 Keil 操作步骤见样例目录中的 README。 ## RS485 控制样例 下载:[RS485 控制样例](https://gitcode.com/sanpo/robot/tree/main/products/spine/v4/f407/firmware-examples/direct-development/rs485) 该工程演示宇树 GO-M8010 类电机的 17 字节控制指令和 16 字节反馈,默认使用: | 项目 | 默认值 | | --- | --- | | RS485 参数 | 4 Mbit/s、8-N-1 | | 两路 Motor ID | 1 | | 每次目标位置增量 | 0.2 rad | | Kp / Kd | 2.5 / 0.12 | | 调试串口 | USART3,115200-8-N-1 | 烧录后两路 RS485 都可能驱动电机运动。首次测试必须固定电机、架空输出轴并检查 A/B 接线和供电。USART3 返回的是 16 字节二进制反馈,需要使用十六进制方式查看。 该样例使用等待式发送和接收,便于阅读和修改,不适合直接用于高频实时控制。正式产品应根据控制周期改用中断或 DMA,并完成连续运行和丢帧测试。 ## 开发完成后的检查 至少完成以下检查: - Keil 编译为 `0 Error(s)`; - CAN 波特率或 RS485 参数与设备一致; - 两颗 MCU 分别烧录时,接口对应关系正确; - 设备能够发送指令并收到合法反馈; - 电机控制范围和保护参数安全; - 长时间运行没有异常复位、通信中断或明显丢帧。