当前位置: 首页 > news >正文

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固件,把老子吓出一身冷汗...(此处应有后怕表情)

http://www.cnnetsun.cn/news/136635.html

相关文章:

  • 基于COMSOL模拟的水力压裂技术研究:固体力学与达西定理的应用
  • Redis 性能调优(二)
  • Doris 性能调优实践指南(可直接落地)
  • presum|二分try+滑窗cnt
  • Web自动化测试:Unittest单元测试框架
  • Apache2最佳实践
  • 实力派,也可以是偶像派
  • 基于单片机的多功能万年历
  • AI搜索时代:技术演进、产业分化与深度变革
  • SGMICRO圣邦微 SGM2019-2.5YC5G/TR SC70-5 线性稳压器(LDO)
  • 一文搞懂 低功耗蓝牙BLE 中的 ATT、GATT、MTU 与 20 字节限制
  • 别让“大锅饭”逼走你的Top Sales:揭秘薪酬误差的副作用
  • 27827828
  • 12.17 vue递归组件
  • QtScrcpy高刷投屏优化指南:告别卡顿,享受流畅体验
  • 终极移动端Windows应用运行指南:从零到流畅体验
  • 大学里的网络安全专业为什么没多少人就读?
  • 信息安全和网络空间安全这2个专业怎么选?老网安告诉你答案!
  • 英语发音MP3音频库:119,376个单词标准发音完整解决方案
  • 瞄准2026:AI安全、数据隐私与云原生——网络安全趋势预测与挑战分析
  • 重磅收藏!Java程序员转AI大模型:从代码高手到AI架构师的进阶指南
  • 2026网络安全进阶路线:盘点撬动高薪的四大关键证书
  • LangGraph实战教程:构建智能旅游规划助手,深入理解AI工作流架构【值得收藏】
  • 淘宝直播弹幕采集完整指南:5分钟快速上手数据分析
  • 文本驱动可视化:5分钟掌握专业级图表制作
  • Clipper2多边形处理技术深度解析与实战应用
  • 错过再等十年:AI驱动的生物制药Agent智能实验设计新范式
  • 造纸车间的“信号指挥官”:耐达讯自动化Profinet六路集线器,让变频器“步调一致”
  • MaterialDesignInXamlToolkit实战指南:5步打造现代化WPF界面
  • 中东电商市场,正在成为中国卖家的必争之地!