MCU 外设之 flash 操作注意事项

1、Flash 使用背景

 

目前的 MCU 一般都有自带内部的 flash 。客户又想着存一些数据 ,掉电还能保存数据 ,当存完代码后还剩下一些空间 ,那么我们就可以把内部的 flash 用起来,从上一篇 《 MCU 外设之 Flash 寿命测试 》 得知 ,其实 MCU 的内部 flash 还是值得被信赖的 ,擦写次数足够 。 这样做既可以省一颗外部 EEPROM 的成本 ,还很方便。

东西是好用 ,但是也有一些需要注意的事项的 。 这不 , 前些天就有客户问了 , 你们这颗 MCU 写 flash 的时候怎么导致 MCU 死掉了 ? 拉出代码 debug 一看 ,代码直接跑飞 ,指到了 0xFFFFFFE 。这是什么原因呢 ? 往回查代码 , 发现有一处特别之处 ,代码开了 Systick 中断 。起初怀疑中断导致的 ,既然开始怀疑 ,那我们就开始测试看看 。 果断先把 Systick 中断去掉再去 debug 。

 

图一   擦除 Flash 代码跑飞

 

希望有奇迹出现 ,继续往下debug,果然程序顺利调过了擦除的函数Chip_IAP_ErasePage() , 同时可以看到 0x7800 处成功被擦除变成 0xFF . 如图二 。

 

图二  Flash 擦除正常

 

客户又问了,我的程序里面是要用到 Systick 的 ,有没有好的办法可以不去掉 Systick 的初始化呢 。此处思考一首歌的时间… 突然想起我们不是有关闭总中断的操作吗 ,上代码 。如图三 ,这样就可以完美解决了。

 


图三  开关总中断的操作

以上已经介绍了操作 flash 过程中出现程序跑飞的的情况以及解决的方法。有遇到这种情况的可以参考上面的说法去解决 。下面再看另外一种比较常见的 操作 flash 异常的情况 。

先看现象 ,当我们把擦写起始地址改成了任意地址 ,这里改成 0x7C01,发现都回来的 Flash 的值都是 0xFF,如图四 。我们容易发现 ,程序并不像上面那样会死机,只是读回值异常 。可以看到 MCU 在执行 Chip_IAP_CopyRamToFlash() 时 ,return code 为 0x3 ,如图五 。看手册可以知道 return code 为 0x3 时 ,错误描述为:SRC_ADDR_NOT_MAPPED

图四  Flash 读回异常值

图五   Flash return code

2、总结

LPC 系列 MCU 当操作 Flash 时出现上面提到的错误时 ,首先应该想到在擦写过程中是否有开中断 ,如果没有,则检查看有没有地址和擦写长度的问题。一般可以根据 IAP 命令的 return code 去找出错误原因。

  

参考资料:

  1. NXP 官网资料 UM10800 V1.1
  2. NXP 官网资料 LPC82x Product data sheet V1.2

 

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论