新闻动态   News
联系我们   Contact
你的位置:首页 > 新闻动态 > 新闻资讯

2025.4.23 经验分享会

2025/4/25 11:52:41      点击:


      2025年4月23日下午,上海实邦电子科技有限公司开展了一次经验交流会,由和杨工一起分享了他们在工作中积累的一些经验

      首先是分享了----Bootloader

      一、Bootloader 基础概念与在 ARM 架构中的定位
      1. Bootloader 定义
      Bootloader 是嵌入式系统上电后运行的第一段软件,负责初始化硬件、加载并启动主程序(如固件或操作系统)。在 ARM 设备(如 Cortex-M 系列单片机)中,      Bootloader 通常位于芯片 Flash 的起始地址(如 0x08000000),承担 “引导桥梁” 作用。
      2. ARM 架构对 Bootloader 的特殊要求
      启动流程:ARM 芯片复位后从固定地址(如 0x00000000 或 0x80000000,取决于配置)读取栈顶地址(MSP)和复位向量(PC 初始值),Bootloader 需正确设置这两个值(如通过 MSR MSP, r0 指令)。
      异常向量表:ARM 架构要求异常处理函数地址位于固定偏移(如 Cortex-M 的向量表默认在 0x00000000),Bootloader 若涉及地址重映射(如从 Flash 搬移到 RAM 运行),需重新配置向量表基址寄存器(VTOR)。
指令集兼容性:支持 Thumb/Thumb-2 指令集,需注意代码编译时的指令集选项(如 __ASM 内联汇编需匹配架构)。
      二、Bootloader 升级核心技术点(ARM 架构相关)
      1.升级触发机制
      硬件触发:通过特定引脚(如 BOOT0 按键)电平判断是否进入 Bootloader 模式。
      软件触发:主程序通过修改特定标志位(如 Flash 某区域的魔术数),复位后 Bootloader 检测到标志位后进入升级流程。
      ARM 寄存器状态:进入 Bootloader 时,需确保 CPU 处于特权模式(非用户模式),避免权限不足导致初始化失败。
      2.内存分区与地址管理
      Flash 分区:通常划分为 Bootloader 区、主程序区、数据存储区(如用于升级包缓存)。 栈与堆管理:Bootloader 需独立设置栈顶(MSP),避免与主程序栈冲突(如通过 MSR_MSP 函数初始化栈空间,见用户代码示例)。
      接口支持:UART(如 DFU 协议)、USB、CAN、以太网或 OTA(需网络协议栈)。
      ARM 缓存处理:若芯片含 Cache(如 Cortex-A 系列),升级前需刷新(Invalidate)或禁用 Cache,避免旧数据干扰。
      3.内存分区与地址管理
      接收升级包:通过接口将数据写入临时存储区(如 RAM 或 Flash 预留区域)。
      校验完整性:使用 CRC32、MD5、异或等算法验证数据正确性,防止错误固件写入。
      擦除目标区域:按 Flash 块大小(如 4KB / 块)擦除主程序区,ARM 芯片需通过寄存器操作(如 STM32 的 FLASH_CR 寄存器)控制擦写。
      写入新固件:逐页编程(Page Program)Flash,确保电压稳定(避免编程过程中掉电导致芯片损坏)。
      更新标志位:写入成功后清除升级标志,复位后跳转至新程序。
      4.程序跳转逻辑(ARM 关键操作)
      读取新程序的栈顶地址(即主程序 Flash 起始地址处的第一个字,*(__IO uint32_t*)APP_START_ADDR)。
      设置主栈指针(MSR MSP, r0)。
      跳转至复位向量(第二个字,typedef void (*pFunction)(void); pFunction JumpToApplication = (pFunction)*(__IO uint32_t*)(APP_START_ADDR + 4); JumpToApplication();)。
      注意:跳转前需关闭所有中断,避免异常处理函数指向旧程序地址。
      三、Bootloader 升级注意事项(ARM 架构场景)
      1. 硬件初始化的最小化
      Bootloader 需初始化必要外设(如串口、Flash 控制器),但避免初始化主程序依赖的外设(如 LCD、传感器),减少资源冲突。
      ARM 芯片的时钟配置(如 PLL)需正确设置,确保外设工作在预期频率。
      2.Flash 操作的安全性
      擦写操作前必须解锁 Flash 控制器(如 STM32 的 FLASH_Unlock()),完成后锁定(FLASH_Lock()),防止误操作。
      禁止在 Flash 擦写过程中响应中断(可通过 __disable_irq() 关闭全局中断)。
      3.内存保护与隔离
      使用 ARM 的内存保护单元(MPU,Cortex-M3 及以上)划分 Bootloader 与主程序的内存区域,防止越界访问。
      确保升级过程中不会覆盖 Bootloader 自身区域(通过地址范围检查,如写入地址需大于 Bootloader 结束地址)。
      4.异常处理与复位管理
      升级失败时,需保留 Bootloader 区的完整性,确保设备可重新进入升级模式(“不死 boot” 机制)。
      复位前清除所有未处理的中断标志,避免跳转后主程序进入错误的异常处理函数。
      5.电源稳定性


      升级过程中需保证电源电压稳定(如外接备用电源或检测电压低于阈值时禁止升级),防止 Flash 擦写中途掉电导致芯片变砖。
      6.版本兼容性与回退
      记录 Bootloader 和主程序的版本号(如在 Flash 固定区域存储版本信息),升级前检查兼容性(如主程序版本需高于当前版本)。
      支持回退机制:若新程序启动失败(如校验失败),自动回滚到旧版本。
      7.调试与日志
      保留调试接口(如 SWD/JTAG)用于 Bootloader 开发,但量产时可禁用或加密。
      在 Flash 预留日志区域,记录升级过程中的错误代码(如擦写失败、校验错误),便于故障排查。
      8.代码优化与大小控制
      Bootloader 需保持轻量(通常几 KB 到几十 KB),避免占用过多 Flash 空间,影响主程序大小。
      使用 ARM 编译器优化选项(如 -O2),减少代码体积,同时确保关键操作(如 Flash 擦写)的时序正确性。
      四、典型问题与解决案例(ARM 平台常见问题)
      问题 1:跳转后主程序无法运行。
      原因:未正确设置 MSP 或跳转地址错误。
      解决:通过调试器检查主程序起始地址的前两个字(MSP 和 PC 初始值)是否正确,确保跳转前关闭中断。
      问题 2:Flash 擦写失败。
      原因:未按芯片手册要求的时序操作,或擦写地址超出范围。
      解决:严格遵循芯片厂商提供的 Flash 操作指南(如 STM32 的《参考手册》中 FLASH 章节),擦写前检查地址合法性。
      问题 3:升级过程中设备复位。
      原因:电源波动或代码中未禁止中断导致异常触发。
      解决:增加电源监控电路,升级时禁用全局中断(__disable_irq()),操作完成后重新使能。
      五、总结
      Bootloader 升级是嵌入式系统的核心功能,在 ARM 架构下需紧密结合其启动机制、内存管理和异常处理特性。关键在于确保升级流程的原子性(失败时不破坏现有固件)、地址操作的准确性(MSP/PC 正确设置)以及硬件操作的安全性(Flash 擦写时序、电源稳定)。通过合理的分区设计、校验机制和错误处理,可实现可靠的固件升级,满足嵌入式设备长期维护的需求。



      杨工分享了-----如何检测电磁阀的存在


      结果

 可以检测到电磁阀有无,但是无法在高电平检测,高电平驱动时,检测脚也是高电平

 驱动电平低,检测电平,则说明电磁阀存在且正常