news 2026/7/7 13:05:09

STM32F103基于CAN协议的bootload程序源码,成功量产应用于实际项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32F103基于CAN协议的bootload程序源码,成功量产应用于实际项目

基于STM32F103的CAN bootload程序源码,包含boot和app两个工程,已应用到实际项目并量产

最近在量产一款工业控制器时遇到了头疼的问题——产品装到现场后发现程序有bug咋升级?总不能每次都拆下来用ST-Link烧录吧?这时候CAN总线Bootloader就成了救命稻草。今天就跟大伙儿聊聊我们项目中实际使用的STM32F103双工程方案,源码在文末自取。

先上硬菜,boot工程的核心跳转逻辑:

//boot_main.c关键片段 if(Check_JumpToApp() == VALID_APP_FLAG) { __disable_irq(); __set_MSP(*(__IO uint32_t*)APP_ADDRESS); /* 重设中断向量表 */ SCB->VTOR = APP_ADDRESS & 0x1FFFFF80; /* 函数指针跳转 */ uint32_t app_reset = *(__IO uint32_t*)(APP_ADDRESS + 4); ((void (*)(void))app_reset)(); }

这段代码里有个骚操作——SCB->VTOR寄存器设置。很多兄弟的Bootloader跑着跑着进APP就死机,八成是忘了这茬。STM32的中断向量表默认在0x08000000,APP工程必须修改自己的中断偏移量:

//APP工程的system_stm32f1xx.c中 #define VECT_TAB_OFFSET 0x8000 //假设bootloader占32KB

硬件抽象层才是魔鬼细节。我们的CAN配置里藏了个超时机制,防止升级过程卡死:

//CAN初始化片段 hcan.Instance->MCR |= CAN_MCR_INRQ; while(!(hcan.Instance->MSR & CAN_MSR_INAK)) { if((HAL_GetTick() - startTick) > 100) { //超时自重启 NVIC_SystemReset(); } }

实测发现,某些国产CAN芯片初始化时会卡INRQ标志,这个超时重启能让设备在异常时自动恢复,避免变砖。后来产线反馈升级成功率从87%直接飙到99.8%,这行代码值回票价。

量产时还踩过一个大坑:APP工程的bin文件必须带CRC校验。我们的方案是在生成hex后自动添加校验尾:

arm-none-eabi-objcopy -O binary app.ax7 app.bin crc32 app.bin >> app.bin

Bootloader端验证时这么玩:

uint32_t fileCRC = *(__IO uint32_t*)(flashAddr + fileSize - 4); if(HAL_CRC_Calculate(&hcrc, flashAddr, fileSize-4) != fileCRC) { //校验失败,重传 Send_Nak(CAN_ERR_CRC); }

有次产线工人误用了旧版本bin文件,结果设备自动识别校验失败,避免了整批返工。厂长听说后给项目组加了个鸡腿,这波不亏。

代码仓库里还有个骚操作——boot和app共用同一套硬件驱动。通过条件编译实现资源复用:

//hal_can.h #ifdef BOOTLOADER #define CAN_TX_MSG_ID 0x321 #else #define CAN_TX_MSG_ID 0x322 #endif

最后给个忠告:量产项目千万别用库函数擦写Flash!我们最早版本用HALFLASHProgram写死的升级包,结果有次断电导致设备变砖。后来切到底层寄存器操作才稳如老狗:

//Flash写入关键操作 FLASH->CR |= FLASH_CR_PG; *(__IO uint16_t*)address = data; while(!(FLASH->SR & FLASH_SR_EOP)); FLASH->SR = FLASH_SR_EOP;

源码已脱敏上传GitHub,搜索"Stm32f103-can-bootloader"就能找到。下期打算聊聊如何在Bootloader里集成AES128加密,防止现场被逆向——有次竞品公司买我们的设备直接dump固件,把老子吓出一身冷汗...(此处应有后怕表情)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 18:39:58

别碰那根头发!ICEM网格工程师的崩溃瞬间

ICEM网格划分每次打开ICEM看到那些支离破碎的几何体,我都想对着屏幕喊:"这破面是哪个天才设计的?!"但骂归骂,活还得干。今天就跟各位老铁分享几个保命技巧,附带实用脚本,让你在被几何…

作者头像 李华
网站建设 2026/7/7 10:21:39

网络安全工程师:为何薪资连续6年上涨,人才缺口仍超300万?

网络安全工程师:为何薪资连续6年上涨,人才缺口仍超300万? 最新发布的《2023年中国网络安全人才发展报告》显示,网络安全工程师的平均薪资已连续6年保持增长,资深岗位年薪普遍超过50万元,部分顶尖人才年薪可…

作者头像 李华
网站建设 2026/7/7 14:15:49

Math类——Java数学运算的全能工具箱

数学运算是程序开发的基础能力,从简单的数值计算到复杂的科学运算,都需要专业的工具类支撑,而Java中的Math类正是这样一个集成了各类数学操作的“全能工具箱”,它位于java.lang包下,无需导入即可直接使用,为…

作者头像 李华
网站建设 2026/7/7 16:21:38

常用工具类在Java开发中的实际应用与价值

Java常用工具类是JDK提供的“预制组件”,第10章介绍的Scanner、Date/Calendar、Math类,看似是基础的工具模块,却在实际开发中扮演着不可或缺的角色,它们的存在极大地提升了开发效率,降低了程序的开发成本和维护难度。在…

作者头像 李华
网站建设 2026/7/7 9:55:08

如何在国产化动环系统中实现智能调控与节能?

在国产化动环系统中,实现智能调控与节能的关键在于有效整合各项技术。系统通过实时监测环境数据,动态调整设备运行,提升资源利用效率。同样重要的是,联动控制与可视化管理相结合,可以优化多个设备间的协作。这样一来&a…

作者头像 李华
网站建设 2026/7/7 16:41:35

vue和springboot框架开发的基于微信小程序的电子元器件商城_ta677h1g

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 vuespringboot_ta677h1g 框架开发的基于微信小程序的…

作者头像 李华