升级时突然断电,为什么不能先擦掉旧程序? 升级时突然断电为什么不能先擦掉旧程序本文为教学接线与设计预期尚无实物测量记录使用 NUCLEO-F030R8。问题升级包只收到一半就断电重启后还能运行旧程序吗关键不是串口传得快不快而是写入新程序时有没有动旧程序。今天用一块明确型号的开发板讲教学分区先把新包放在另一块地方检查完才切换启动选择。物件动作小熊先拿旧程序旗站在甲货架前快递员把新包送到乙货架小熊拿尺子检查包有没有超出格子再拿校验卡逐字比对。没检查完即使灯熄了旗仍指甲。通过后才换旗。回到芯片货架是两块内部存储区旗是启动记录不是板外的开关。真实连接电脑通过数据线接开发板上的调试器板内串口通路经两个焊桥接芯片的第二组串口发送端负责回话接收端负责收包。电脑发来的升级字节进入单片机。甲乙两个程序区和启动记录都在同一颗芯片的闪存内部图里不画虚假的外接存储芯片。原因与结果本例芯片有一百二十八千字节闪存。教学设计留三十二千字节给加载程序和记录给甲、乙各四十八千字节。启动仍选甲时只擦写乙收到完整乙包后检查长度、校验码和入口再写新的启动记录。写记录前断电甲仍是已确认版本。验证设计检查分四步甲有效时能启动甲只收到半包就断电仍选甲乙完整且校验通过才改选乙乙校验错误就不改旗。用串口日志和调试器读闪存记录比对不把动画说成实板断电测试。边界这不是芯片自带的双闪存银行而是在同一块闪存里由软件划出的两格每格最多四十八千字节。校验码能查出许多意外损坏却不能证明来源可信也不能保证发现所有错误。真正要防恶意篡改仍要做签名验证断电恢复也必须在实板反复测试。为什么直接覆盖会使旧程序无处可退假设一个升级文件只收到了前一半用户此时拔掉电源。如果程序在接收前就擦掉唯一的旧固件区域重启后不能指望从残缺的新文件正常运行。ST 的 AN2557 Rev8 证明 STM32F10x 可以运行用户自写的 USART 在应用升级程序从串口接收映像并写入片内 Flash它并没有替本文的双槽方案做过断电承诺。这个题只讲一个可画、可复算的设计原则先写未使用的槽核对通过后才改变启动记录。把它画成货架小熊拿旧程序旗站在甲架前快递员把新包送到乙架小熊拿尺子检查包不超格再拿校验卡比对。只有完整检查后小熊才把旗从甲架移到乙架。如果灯在搬运时熄灭旗仍指甲架。回到芯片甲乙是同一颗 MCU 的内部闪存地址范围尺子对应映像长度检查校验卡对应 CRC 和入口检查旗对应双页启动记录。这里的货架不是板外两颗存储芯片。器件、板内数据链路和真正的存储位置选定 ST NUCLEO-F103RB目标芯片是 STM32F103RB。ST 产品页和 DS5319 数据手册给出它有 128 KB 片内 Flash、20 KB SRAM。UM1724 Rev17 第6.8节给出板内 USART2 通路目标 PA2 是发送、PA3 是接收默认通过 SB13/SB14 焊桥连接 ST-LINK 虚拟串口而 SB62/SB63 关闭。实际板卡修订和焊桥状态必须先看实物若被改焊视频中的默认通路就不成立。电脑的 USB 数据经板上 ST-LINK 虚拟串口再沿目标 MCU 的 PA3 进入自写升级程序应答由 PA2 返回。ST-LINK 虚拟串口只是字节通道不是那个自写升级程序也不等同于芯片出厂系统存储器中的 ROM 下载模式。电源、地按 NUCLEO 板卡手册连接不要为了‘升级’再从电脑串口脚给目标板灌另一种电压。图把真实板内串口通路画在上半部把内部地址分区画在下半部。两者之间不画一根仿佛能焊到 Flash 槽位的外部电线。RM0008 Rev21 第3.3.3节说明中密度器件主闪存按 1 KB 页组织只有 XL 密度器件才具有资料明确提到的硬件双银行读写并行能力。本例 A/B 是一颗 STM32F103RB 的单主块软件分区。写未选槽时需按该系列 Flash 擦写规则工作不能在视频里说成两银行可随意同时读写。把 128 KB 算清楚不能光说‘两个槽’本例教学分区是 324848128 KB所有边界落在 1 KB 擦除页上。0x08000000 至 0x08007FFF 共 32 KB留给自写加载程序与元数据其中末尾两页 0x08007800 和 0x08007C00 分别作启动记录页。甲程序槽从 0x08008000 到 0x08013FFF共 48 KB乙槽从 0x08014000 到 0x0801FFFF也是 48 KB。加载程序必须真的编译进预留空间元数据格式、擦除次数和错误恢复还需单独实现这不是厂家提供的现成分区。若新文件有 49153 字节已经超过 48×102449152 字节收到再完整也必须拒绝不能越界写到另一分区。链接脚本和中断向量偏移必须分别按甲乙起点构建。收包、校验、提交的顺序假设当前记录选甲。第一步仍启动甲并只擦写未选的乙页收到文件的声明长度、实际长度和乙槽上限都要核对。第二步对收到的完整映像重新计算 CRC并核对文件自带的校验值。CRC 能发现很多意外传输错误但不是签名既不保证发现所有错误也不能阻止攻击者重算 CRC。第三步核对程序入口Cortex-M3 的向量表起始字应是该芯片 SRAM 范围内的栈顶下一字应是落在乙槽内且 Thumb 位有效的复位处理地址PM0056 Rev7 第2.3.4节解释向量表的栈指针、复位向量及最低位约束。仅有一个算对的 CRC仍不能证明程序安全或功能正确。最后才考虑提交在两页记录中保留一页已经完整、可识别的旧记录把包含新槽号、版本、长度、CRC 的新记录写入另一页提交标记最后写。每次启动先查记录格式、序号和映像再选可信的版本。若新记录不完整旧记录仍可被选用。这是一种需要严密实现的写入顺序不是‘只要把标记最后写就绝对抗断电’。尤其擦旧记录页的时机、Flash 磨损、正在写时的复位、电源下陷、启动程序自身损坏及受保护位都要逐项进行实板掉电注入。本文没有这样的测试不能宣称实际已做到可靠回滚。四步验证与安全边界先给甲装一份可识别的教学程序并核对启动日志再让乙只收到半包就中断预期启动记录仍选甲随后送完整且校验正确的乙包预期提交后选乙再送一个改坏一位的包预期拒绝提交仍保留上一个可信槽。调试器应读出两页记录、槽位字节与实际程序指纹串口日志也要包含长度、校验、选槽和重启原因。画面里的四格是计划中的检查而不是已经做过实物试验的读数。更换芯片容量、板卡焊桥、闪存页大小或升级传输方式地址与连接都要重核。小文件才能放进 48 KB 槽旧程序也必须曾经完成有效校验否则‘保留旧版’只是在保留一个可能坏掉的版本。若产品面对恶意固件必须另外验证数字签名并保护验证密钥若需要保证业务连续性还须验证应用数据迁移、外设安全状态和恢复流程。随文 C11 代码只复算大小与提交条件不会真的擦写 STM32 Flash。逐线接线清单电脑 USB 数据线 → NUCLEO-F103RB 板载 ST-LINK USB 接口升级包从电脑输入USB 亦按板卡供电说明供电ST-LINK 虚拟串口 TX → SB13/SB14 默认通路 → 目标 STM32F103RB PA3 USART2_RX板内接收通路上电前核对实际板版焊桥目标 STM32F103RB PA2 USART2_TX → SB13/SB14 默认通路 → ST-LINK 虚拟串口 RX板内发送回执通路板载电源与公共 GND → ST-LINK 串口接口与目标 STM32 电平参考板内同参考不另接高压或把串口当电源STM32F103RB 内部 Flash 0x08000000–0x08007FFF → 自写加载程序和两页提交记录32 KB 教学预留不是厂家固化的 Boot ROM内部 Flash 0x08008000–0x08013FFF → 甲程序区 A48 KB当前已确认程序收乙时不擦 A内部 Flash 0x08014000–0x0801FFFF → 乙程序区 B48 KB接收新包到未选区非芯片第二硬件银行校验完成的乙程序 → 另一个记录页中的提交记录先验证后切换提交标记最后写本例软件设计计算与实施边界ST STM32F103RB 产品页128 KB FlashRM0008 Rev21 第3.3.3节中密度器件单主存储块、128 个 1 KB 页不是具备读写并行能力的 XL 双银行结构ST UM1724 Rev17 第6.8节USART2 PA2/PA3 可经板上 ST-LINK 虚拟串口通信默认 SB13/SB14 ON、SB62/SB63 OFF实际板版焊桥需现场核查ST AN2557 Rev8STM32F10x 可运行用户自写的 USART 在应用升级程序本例 324848 KB 双槽与双记录页是新的教学分区不是 AN2557 的现成程序或厂家断电保证32 KB0x800048 KB0xC000甲起点 0x08008000乙起点 0x08014000末尾 0x0801FFFF各边界为 1 KB 擦除页边界CRC32 示例按软件 IEEE 802.3 参数复算能检测很多偶发比特改变但不保证所有错误都发现也不鉴别固件来源安全升级另需签名和密钥管理本题无真实上板升级、掉电注入或持久化实测记录记录提交、向量入口校验、跳转和掉电恢复仅为需要实现与验证的教学设计这些参数和数值是本例选择或可复算计算实际测量前应先检查电源极性、公共地、元件额定值、仪器探头连接。完整可运行的核心算例与验收以下 C11 程序可在电脑上用 C 编译器单独编译运行用来复算状态或数值它不是已配置 GPIO、ADC、定时器和驱动的开发板固件。移植到实板时应按前述接线配置外设、检查读取错误并另做实测。#includestdbool.h#includestdint.h#includestdio.h/* 教学分区和提交条件的可复算模拟不会烧写 STM32 闪存。 */enum{LOADER_KB32,SLOT_KB48,TOTAL_KB128};staticboolmay_commit(unsignedreceived,unsigneddeclared,bool crc_ok,bool vector_in_slot){returnreceiveddeclareddeclared0declaredSLOT_KB*1024ucrc_okvector_in_slot;}intmain(void){printf(partition: %d%d%d%d KB\n,LOADER_KB,SLOT_KB,SLOT_KB,LOADER_KBSLOT_KBSLOT_KB);printf(half packet: %d, complete: %d, bad CRC: %d\n,may_commit(10000,20000,true,true),may_commit(20000,20000,true,true),may_commit(20000,20000,false,true));return0;}验收时同时记录输入、关键节点电压或波形、程序输出若发现传感器通信失败、输入超出允许范围或波形明显异常应停止并排查。官方资料https://www.st.com/en/microcontrollers-microprocessors/stm32f103rb.htmlhttps://www.st.com/resource/en/datasheet/stm32f103rb.pdfhttps://www.st.com/resource/en/reference_manual/cd00171190-stm32f101-103-105-107-stm32f100-series-armbased-32bit-mcus-stmicroelectronics.pdfhttps://www.st.com/resource/en/user_manual/um1724-.pdfhttps://www.st.com/resource/en/application_note/cd00161640.pdfhttps://www.st.com/resource/en/programming_manual/cd00228163.pdf