完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
话说,重要和敏感数据的掉电保存和可靠读写一直是嵌入式系统中比较常见到的需求,比如说产品校准数据的保存、工作参数的存储和产品Firmware信息及产品序列号的写入等等,而对这些类似的无需频繁操作的数据,无论从成本考虑还是资源利用率上来说,随着MCU自带的Flash空间越来越大,很多工程师们倾向于使用内部冗余的Flash作为这些数据的存储介质而无须使用传统的EEPROM,毕竟大多情况下代码空间并没有充分的占用整个芯片的Flash空间,所以剩余的Flash空间(必须大于一个Sector)则可以作为一个数据备份空间来用。不过相比于传统的EEPROM存储数据,Flash空间存储数据的方法的确是有一些其局限性和特别注意的地方。下面我就以飞思卡尔公司的Kinetis系列为例,列出一些我们在使用。
Flash烧写数据时需要特别注意的问题: 1. 同一地址的Flash空间不能连续写两次数据,而必须遵守先擦除再写入的原则,这是由Flash的工作机制决定的,即Flash的每一位只能由1写成0而不能由0写成1(具体原理,google一下就了然了),所以如果想向某一个地址的Flash空间写入数据则必须先将其擦写成全1然后再写入数据(是1的位不动,是0的位则写0)。不过Flash的最小擦除单位不是字节而是扇区(Sector),而不同的芯片其Sector的大小也不一样,比如Kinetis K系列,其Sector Size为2048个字节,L系列为1024个字节,而E系列则为512个字节。既然原理搞懂了,那我可以举个例子,如果我们往同一地址的Flash空间连续写数据则需要每次写入前先将该地址所在的扇区擦除然后再写入,而如果我们往同一个扇区不同地址的Flash空间写入数据则不需要每次擦除扇区而是等整个扇区写满后再执行一次擦除操作即可。当然,读操作是不受上述条件限制的,这个可以放心,哈哈; 2. 如果想选择Flash作为数据保存的空间,建议数据烧写的首地址为扇区Size的整数倍以避免空间的浪费,另外该数据所要烧写地址所在的扇区也建议选择整片Flash空间的最后面的扇区,防止代码空间对这部分数据空间的覆盖,做好保护工作; 3. 这一点需要特别注意,Flash读写操作都是由MCU自己通过其内部Flash Controller来实现的,这就会出现一个问题,就是擦写Flash的指令会与程序正常执行的读指令操作会冲突(因为FlashController只有一个),从而导致CPU Lock错误复位的现象。解决这个问题的方法就是将擦写Flash的指令Copy到RAM中执行同时期间关掉中断响应从而避免冲突的发生,另外,飞思卡尔Kinetis系列也针对此类冲突的发生增加了一个stall机制(通过配置MCM_PLACR寄存器中的ESFC位),即在Flash被其他资源占用而外部再次发生读写请求的时候芯片自动将CPU stall住避免错误复位,不过通常的建议是这两者同时都用起来以提高系统的可靠性。至于怎么实现这两种操作,下面我就给出KE系列相关处理的底层代码(基于IAR),如下图1,只需要将Flash_LaunchCMD这个启动擦写函数声明成__ramfunc类型,然后在系统的启动代码部分会有一个对ramfunction代码copy到ram中的一个操作,如图2: 转载 |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
1876个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36227 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4324 浏览 0 评论
5953 浏览 1 评论
6693 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4144 浏览 0 评论
565浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
555浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
548浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
636浏览 2评论
697浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-2 15:52 , Processed in 0.884209 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号