
STM32 bootloader使用CAN通信传输HEX文件至Flash并附源代码与通讯协议(STM32C
ubeIDE工程)
最近在折腾STM32的CAN Bootloader实现,发现这玩意儿对理解嵌入式底层通讯和存储器操作特别
有帮助。今天咱们就手把手搞个能通过CAN总线烧写Hex文件的bootloader,顺便聊聊实现过程中那些有意
思的坑(附完整工程代码)。
先看硬件连线,随便找个带CAN的STM32板子(我用的是F407),CAN_H接CAN_H,CAN_L接CAN_L,记得挂
120Ω终端电阻。软件方面用CubeMX配个基础工程,开启CAN1,波特率建议先设500kbps(后面可以自己调)。
通讯协议咱们自定义个简单的:
```c
// CAN数据帧格式
typedef __packed struct {
uint32_t address; // 目标地址
uint8_t data[8]; // 数据内容
} CanFrame;
// 命令定义
#define CMD_ERASE 0x01
#define CMD_WRITE 0x02
#define CMD_JUMPAPP 0x03
#define CMD_ACK 0xA5
#define CMD_NACK 0xEE
```
核心代码先从CAN接收处理开始。CubeMX生成的HAL库用起来挺方便,但要注意接收中断的处理:
```c
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
static CanRxMsgTypeDef rx_msg;
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_msg.Header, rx_msg.Data) == HAL_O
K) {
process_can_frame((CanFrame*)rx_msg.Data); // 关键处理函数
}
HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);