在嵌入式系统中,诸如变频器和伺服驱动器等工业应用,乃至CD播放器等众多消费电子产品,都需要保存最近的用户设置,在下次上电后加载使用。如果使用MCU内置Flash,一般擦写次数限制在10k次,无法满足寿命和耐久性要求,所以只能通过外置实现。
本文引用地址:新推出的系列MCU支持使用Flash,在小容量存储需求的场合能节省外部芯片,实现成本控制。系列MCU的Flash容量覆盖16KB到128KB,其中低32KB的Flash区域支持10万次擦写,而剩余区域支持1万次擦写,如下图G3507规格书所示。所以,在使用FlashEEPROM时,应尽可能选择低32KB区域。
当使用<=32KB Flash容量产品时,这时芯片的全部Flash区域都支持10万次擦写,只需要根据用户代码量以及存储需求确定EEPROM的容量大小,然后放置到Flash的尾部地址即可。
当使用>32KB Flash容量产品时,这时用户代码占用空间可能较大,如果直接选取低32KB尾部地址作为EEPROM,有可能与用户代码地址相冲突而造成误擦写,如下图所示:
这时则需要在代码中向编译器声明EEPROM的位置及长度,使其安排Code及Data时避开用户设置的EEPROM区域。
在CCS IDE with Clang中,需要做两步修改:
在.cmd文件中添加Sections的声明如下图:
其中EEPROM 为自定义的section名字,0x00001000为自定义的开始地址。
2. 在需要使用的.c文件中(如c)添加数组定义如下:
以上语句定义了一个名为EEPROM、类型为uint32,长度为4096的const数组,并且存放在上面开辟的.EEPROM Sections,其中添加__attribute((used))可以避免编译器把该数组优化掉。
完成以上修改后,编译器会避开自定义的EEPROM SECONS,代码只会存放于.text SECTIONS,这样修改后就可以保证EEPROM地址和长度都落在期望的Lower 32KB区域且不会与代码段冲突。
添加修改并编译后,查看Memory Allocation如下图,可见EEPROM段与.text代码段分开,所定义的EEPROM数组也成功初始化。
最后就可以进行Flash的Erase/Program操作,具体可参考drivelib中的flashctl_program_with_ecc等例程,这里不再赘述。
本文针对MSPM0系列MCU使用FlashEEPROM时需要在Lower 32KB开辟EEPROM专用区域的工况,提出使用SECTIONS分配的方式解决与EEPROM和Code可能重合的问题,配合SDK的Flash操作,可以很容易实现EEPROM在任意Flash区域的开辟。