STM32首次烧录选择erase sectors导致程序跑飞
一、故障现象小批量打样回来的板子烧录程序后一切正常蜂鸣器响0.5sLED闪烁等待握手但是断电重启后蜂鸣器长鸣LED不闪烁无法正常运行。二、分析解决过程首先我看了一下电源电压、电流都是对的这说明硬件上没有短路等大毛病。那么我感觉这是程序跑飞了可能是程序启动有问题是不是从SRAM起了而不是从flash起的我第一怀疑板子焊接有问题目检了一遍特别是boot0引脚那边重点检查了一下没有任何毛病。谨慎起见我还是将整个MCU重新加焊了一遍。可惜的是故障依旧看来不是焊接的问题。其实从故障现象来看基本可以肯定是跟flash有关了。想一想断电重启后到程序跑到main函数中间芯片经过几个过程1、上电电源稳定后硬件自动从flash起始地址0x80000000读取栈顶地址MSP然后从0x80000004读取复位中断函数地址Reset_Handler再设置堆栈指针MSP最后跳转Reset_Handler。这个是硬件自动执行的死规定改不了的。2、进入复位函数Reset_Handler干4件事初始化数据段、清零BBS段、调用SystemInit()、调用_main入口。在这个过程中如果初始化没有完成或者完成错误了那也有可能程序跑飞。这里有一定可能性的是时钟如果用外部晶振的话如果晶振坏掉了、没有焊接好那么这里可能会有问题。但是我这个现象不是我是烧完程序后是OK的断电重启后不行了。看来很可能还是flash读前面两个地址的时候挂了。我检查了一下KEIL中程序地址都没有什么问题。但是在检查算法ram的时候我注意到擦除选项选的是erase sectors这是之前为了烧录快一点而设置的。我们都知道擦sectors只擦除用到的扇区会不会是这里有问题。于是我将擦除选项改成Erase Full Chip烧录后再断电重启这下子一切都正常了。三、原因分析首先Erase Full Chip和Erase Sectors的区别特性Erase Full ChipErase Sectors擦除范围整个flash除OTP、选项字节用到的扇区速度慢快数据全部清除保留未擦除扇区的数据寿命消耗1次flash擦写次数消耗对应扇区擦鞋次数这里要先讲一下flash的特性只能从非FF写0不能从非FF写1。这是因为STM32用的是浮栅型Flash可以理解成每个bit有一个电子陷阱电子在陷阱里0电子被拿走1。而擦除动作是加高压将所有浮栅上的电子全部抽走这样所有的bit都变成了1。写入动作就是加低压把电子注入某些bit这样就把1变成了0。擦除是批量抽电子写入是逐个塞电子。flash不支持批量塞电子所以擦除后的部分变成了1。还有一个事实是虽然理论上flash出厂时应该是全0xFF但是工程应用中拿到手的焊接成品的PCBA上这颗MCU中的flash很有可能已经经过测试甚至不能保证芯片是全新的。这种时候拿到手的芯片中的数据是脏的flash中可能是随机数据。所以选择erase sectors后只有用到的部分sectors变成了FF但是其他部分很可能还有00存在而写入只能将1变成0而不能将0变成1。这就导致其他sectors中很可能还是乱码。那么还有一个问题为什么我用到的sectors已经擦除了还会跑飞呢这是因为1、中断向量表附近有脏数据例如程序占sector0但中断向量表、堆栈指针在flash开头这部分没有被擦除。如果这部分不干净MCU一读就错直接HardFault。2、堆栈区域是脏数据程序运行需要栈空间如果栈所在的地址有脏数据那么一进函数就死机。3、编译器填充区域残留乱码有些位置编译器会留空、填0xFF实际却是乱码这会导致程序判断逻辑出错。4、选项字节/保护位干扰有部分芯片会默认读保护扇区擦除不会碰这些位置。这些原因导致的现象一般有1、下载成功但芯片不运行2、一运行就硬件错误中断Hardfault3、偶尔能跑偶尔死机不稳定4、仿真时PC指针跳到很奇怪的地方。四、工程建议1、拿到手的板子第一次烧录选择Erase Full Chip2、开发调试优先用Erase Full Chip3、只有明确要保留Flash里的数据例如配置、序列号时采用扇区擦除。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2477255.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!