# 自定义固件开发 自定义固件开发适合希望直接使用 STM32G0B1RCT6 编写 CAN、CAN FD、RS485 和设备控制逻辑的用户。样例已经配置好 V8 开发板的 MCU、外部 8 MHz 晶振、引脚和基础外设,可以直接导入 STM32CubeIDE 修改。 这些样例不会保留 V81 正式固件的 USB/SPI 转换、SocketCAN、管理口协议、透传模式和离线批量指令功能。如果需要保留这些能力,只增加 I2C、ADC、USART3、传感器或自己的业务代码,请选择[原厂固件二次开发](official_firmware_development)。 ## 选择合适的样例 | 开发需求 | 推荐工程 | | --- | --- | | 自定义经典 CAN、11 位标准 ID | [CAN 标准帧直接开发工程](#can-标准帧直接开发工程) | | 自定义经典 CAN、29 位扩展 ID | [CAN 扩展帧直接开发工程](#can-扩展帧直接开发工程) | | 自定义 CAN FD、11 位标准 ID | [CAN FD 标准帧直接开发工程](#can-fd-标准帧直接开发工程) | | 自定义 CAN FD、29 位扩展 ID | [CAN FD 扩展帧直接开发工程](#can-fd-扩展帧直接开发工程) | | 自定义 RS485 设备控制 | [RS485 直接开发工程](#rs485-直接开发工程) | | 保留 V81 原厂通信功能,只增加外设或业务逻辑 | [原厂固件二次开发](official_firmware_development) | 使用入口:[V8 自定义固件逐项使用说明](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/README.md) ## 两颗 MCU 使用同一套工程 开发板上的两颗 STM32G0B1RCT6 型号和引脚配置相同,同一个编译结果可以烧录到任意一颗 MCU,也可以分别烧录到两颗 MCU。 | 下载接口 | 工程中的接口 | 开发板接口 | | --- | --- | --- | | MCU(1)的 SWD | FDCAN1/FDCAN2、RS485-A/RS485-B | CAN/CAN FD-1、CAN/CAN FD-2、RS485-1、RS485-2 | | MCU(2)的 SWD | FDCAN1/FDCAN2、RS485-A/RS485-B | CAN/CAN FD-3、CAN/CAN FD-4、RS485-3、RS485-4 | 完整引脚定义见[接口和引脚说明](board_schematic)。 ## STM32CubeIDE 开发环境 五个样例使用相同的开发环境: - STM32CubeIDE,样例已使用 2.2.0 完成编译验证; - STM32G0B1RCT6; - 外部 8 MHz 晶振,系统时钟和 FDCAN 内核时钟 60 MHz; - ST-LINK 调试器。 使用 `File > Import > Existing Projects into Workspace` 导入所选工程,然后选择 `Release` 或 `Debug` 配置构建。烧录时使用目标 MCU 对应的 SWD 接口,不要执行全片擦除,以免删除开发板保存的数据。 每个直接开发工程都包含 `.ioc`,可以使用 STM32CubeMX 调整外设。生成代码前应先备份工程,生成后必须重新核对时钟、V8 引脚、CAN/CAN FD 位时序、RS485 方向控制以及 `Core/Src/main.c` 中的客户逻辑。 ## CAN 标准帧直接开发工程 逐步说明:[CAN 标准帧工程](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/direct-can-standard.md) 该工程把本 MCU 的两路 FDCAN 外设配置为 1 Mbit/s 经典 CAN。默认只接收标准帧和扩展帧并拒绝远程帧,不会自动发送数据。接收计数和最近一帧保存在: ```text g_can1_rx_count / g_can1_last_header / g_can1_last_data g_can2_rx_count / g_can2_last_header / g_can2_last_data ``` `Core/Src/main.c` 中的 `DirectCan_SendStandard()` 提供 11 位标准 ID、8 字节数据帧发送入口。接入设备前,应按设备协议确认 CAN ID、数据内容和波特率,再显式调用该函数。 ## CAN 扩展帧直接开发工程 逐步说明:[CAN 扩展帧工程](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/direct-can-extended.md) 该工程把两路 FDCAN 外设配置为 1 Mbit/s 经典 CAN,默认仅接收。`DirectCan_SendExtended()` 提供 29 位扩展 ID、8 字节数据帧发送入口。 工程不会自动发送 Cybergear 或其他电机控制指令。使用扩展帧设备前,应先按设备协议实现 ID 编码、数据缩放、状态机和安全保护。 ## CAN FD 标准帧直接开发工程 逐步说明:[CAN FD 标准帧工程](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/direct-fdcan-standard.md) 默认参数如下: | 项目 | 默认值 | | --- | --- | | 仲裁段波特率 | 1 Mbit/s | | 数据段波特率 | 5 Mbit/s | | BRS | 开启 | | 发送格式 | 11 位标准 ID、16 字节 CAN FD 数据帧 | | 默认行为 | 两路仅接收,不自动发送 | `DirectCanFd_SendStandard16()` 提供发送入口。修改数据长度时,应同时使用合法的 CAN FD DLC,并保证发送缓存和接收缓存足够大。 ## CAN FD 扩展帧直接开发工程 逐步说明:[CAN FD 扩展帧工程](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/direct-fdcan-extended.md) 该工程同样使用 1 Mbit/s 仲裁段、5 Mbit/s 数据段和 BRS,`DirectCanFd_SendExtended16()` 提供 29 位扩展 ID、16 字节 CAN FD 数据帧发送入口。主循环默认仅接收,不会自动发送。 加入设备协议前,应确认目标设备同时支持 CAN FD、BRS、29 位扩展 ID 和当前位时序。 ## RS485 直接开发工程 逐步说明:[RS485 工程](https://gitcode.com/sanpo/robot/blob/main/products/spine/v8/firmware-examples/guides/direct-rs485.md) 该工程直接控制本 MCU 的两路半双工 RS485: | 项目 | RS485-A | RS485-B | | --- | --- | --- | | UART | USART1 | USART2 | | 引脚 | TX=PC4、RX=PB7、RE=PD2 | TX=PD5、RX=PD6、RE=PC9 | | 默认参数 | 4 Mbit/s、8-N-1 | 4 Mbit/s、8-N-1 | | 默认行为 | 仅接收 | 仅接收 | 接收数据保存在两个 256 字节循环缓冲区中。`DirectRs485_Transmit()` 会切换收发方向并执行阻塞发送,但主循环不会自动调用。正式项目应根据设备协议补充报文边界、校验、超时、错误恢复,并根据实时性需求评估中断或 DMA 方案。 ## USB 和原厂协议说明 直接开发工程中的 USB 初始化代码只是基础工程资源,不是 V81 管理口、SocketCAN、USB 转 CAN/CAN FD 或 USB 转 RS485 接口。客户如需这些功能,必须自行实现完整的 USB 描述符、协议、缓存、流控和主机端支持,或者直接选择[原厂固件二次开发](official_firmware_development)。 ## 开发完成后的检查 至少完成以下检查: 1. Release 配置编译无错误; 2. MCU、外部晶振、系统时钟和引脚配置与 V8 硬件一致; 3. CAN/CAN FD 仲裁段、数据段、BRS 和 ID 类型与设备一致; 4. RS485 波特率、数据位、校验、停止位和方向控制正确; 5. 两颗 MCU 分别烧录时接口对应关系正确; 6. 保持默认仅接收状态完成接线、终端电阻和总线检查后,再启用发送; 7. 电机或执行器的控制范围、状态机和保护参数安全; 8. 长时间运行没有异常复位、通信中断、缓存溢出或明显丢帧。