本帖最后由 damiaa 于 2023-11-19 12:35 编辑
【MSPM0L1306 LaunchPad】 10 eeprom仿真A模型
MSPM0L1306的flash可以做模拟eeprom,这里介绍具体介绍一下(eeprom仿真A模型)
这里介绍几个概念,flash和eeprom是不相同的,flash可以字节写,但不能字节擦除,擦除最小单位为扇区,MSPM0L1306自然也一样。Eeprom可以字节写字节擦。
那问题来了,怎么样模拟你字节擦字节写的类似操作呢。这里实际的是模拟一条记录的擦写和读。
这个模型实际上是空间换功能。两个扇区模拟一条记录的读写擦除。
记录的情况如下:
上面的图可以看除,每条记录擦除后是活动记录标记已用记录也是记录结束也是0xffff 实际上擦除后所有区域都是0xffff
记录开始会标记 一下活动标记为0x0000,然后记录写数据,写完后会再记录结束标记写0x0000,下一条记录写进去(记录结束标记标记完)的时候会把上一条记录的已用记录标记标为0x0000,说明和条记录已经用完,不是最后的记录了。下次就会从最后的记录开始。也可以根据记录的标记在下次上电的时候恢复记录。
两个扇区的情况如下:
这个时候我们写完第n+1条记录后就擦除第一扇区
然后继续写第二扇区记录直到记录2n写完,就去写第一扇区的第一条记录,同时把第二扇区擦除。
这也就是为什么要两个扇区的原因。
eeprom仿真A模型的原理就是这样。
下面跑一下这个程序的应用
打开ccs 生成eeprom_emulation_type_a_test_LP_MSPM0L1306_nortos_ticlang项目如下:
这里主要关心eeprom_emulation_type_a.c eeprom_emulation_type_a.h main.c文件 前两个文件实现算法,main.c中进行调用。
main.c中主要是上电初始化,然后是数据改变后写,每改变一次写一次。中断中看数据。如果我们restart后发现数据没变,证明是保存到flash了。但因为调试不能加载flash去重新调试。这样flash数据全部被调试器擦除了。
下面演示一下调试过程:
1,在Debug Project(.....)加载这个项目(这里会擦除所有flash空间 包括模拟eeprom部分 注意)。
2,单步调试,观察EEPROMEmulationBuffer 会发现开始数据都是0,后面第一第二个数据有变化。
记得这里都是单步调试哦。
3,复位 在单步调试到EEPROM_TypeA_init之后,看数据是否变化。
复位后
调试到EEPROM_TypeA_init之后:
发现上次复位前的数据恢复了。证明数据存储到flash了,而且数据正确。
到此,这个实验验证正确了,剩下的就是以后咋们怎么应用他到产品中了。
谢谢