双组Flash实施方案 - 带有双组闪存的MCU优点
双组Flash意味着同一器件中有两个不同的Flash块。本文从这里开始以飞思卡尔MC9S08MM128 MCU为例进行阐述。该器件拥有128kB的Flash存储器,分成两个64kB的阵列。上一章解释过在写入或擦除Flash的这段时间,整个Flash块都不能读取。提到有两种替代方法来执行Flash操作:CPU拖延或从RAM运行。同一逻辑适用于一个双组Flash,但是由于现在有两个不同的组,因此代码可以在Flash A中运行以写入或擦除Flash B,反之亦然。
当使用非易失性存储器来存储变量时,双组Flash可以设计为将所有非易失性变量都存储在一个Flash组中,即:一个块用作伪EEPROM,代码在另一个组中。 例如,所有数据都将存储在Flash B中,写入和擦除存储器的代码将在Flash A中,以便更加高效地使用RAM和堆栈。在双组Flash MCU中也不需要CPU 拖延。系统可以保持运行,因为只有一半的存储器需要高电压,另一半可以继续正常的代码执行。当构建应用来避免阻塞代码时,这尤为重要(代码的各部分,要么停止CPU,或在环路等待事件发生以继续代码执行,在这种情况下等待Flash命令完成)。
将数据保存在Flash B中的另一个好处是不需要禁用中断功能,因为中断矢量表是Flash A的一部分。这意味着所有串行通信、模数转换、定时器等都可以保持运行,启用中断功能,代码可以在命令执行的过程中进行跳转,提取中断矢量,执行中断服务例程,并返回,以验证Flash操作是否完成,以及是否需要启动新操作。
另外一个特点是向执行整个设计远程升级的应用添加故障容忍功能。可以将新项目版本保存在一个Flash组中,在另一个组中作为备份进行保存。一旦上传了新版本并通过了验证,那么以前的版本便可以擦除。在系统设计级,可以总是使用Flash A在Flash B中写入新版本,反之亦然。这样,即使在更新过程中发生了故障,也不会丢失工作版本。
EEPROM仿真
使用Flash存储非易失性信息的一个限制是字节必须处于已擦除状态(所有位都设为逻辑“1”)才能够写入。这意味着擦除操作将所有位都从扇区转换为“1”,而写入操作将某些或全部位都改为“0”。这样产生的问题是,如果一个变量发生了改变,需要进行非易失性备份,那么首先需要擦除字节,但是由于Flash不能逐个字节擦除,因此需要擦除整个扇区。
执行EEPROM仿真的例程旨在使用Flash而不是单字节写入和擦除功能来提供EEPROM功能。一般做法是使用需要存储在Flash中的所有变量创建一个结构;该结构添加一个字段,指示该扇区是否活动(这应该是写入的最后一个字节,以验证所有数据是否已经正确写入)。当需要在Flash中更新某些信息时,复制整个结构。每当字节改变时都进行非易失性更新,或根据定时器持续进行备份作为应用执行的一部分。
根据应用类型,可能进行某些改变,以减少执行EEPROM仿真或增加系统强劲性所需的Flash容量。例如,如果使用一个Flash扇区,非易失性结构将写入同一扇区,只要适合扇区大小,能写入多少次就写多少次(因此,建议结构大小适合扇区内的准确次数,通常是两种大小的功率)。在Flash扇区填满后,代码需要擦除扇区并重新开始。这种方法的好处是只使用一个Flash扇区,限制是如果在扇区擦除步骤发生断电,那么所有信息都会丢失。 另外,Flash耐用性也将加倍。
另一种方法是使用两个扇区进行EEPROM仿真。只有在把信息写入新扇区后才擦除一个扇区,因此在Flash中总是有信息的有效副本,从而更加强韧,能够确保即使在擦除或写入过程中发生掉电,信息也不会丢失,还增加了存储非易失性信息所需的Flash容量。 根据应用要求来确定应该使用哪种方法。
案例研究: 如何在飞思卡尔S08系列中写入/擦除Flash
在S08系列中执行写入或擦除操作的步骤与此类似。如果要独立进行写入、突发写入、擦除或整体擦除,第一步是用一些数据写入Flash位置(区别在于如果命令是擦除或整体擦除,那么所写入的数据是没有影响的)。之后,寄存器FCMD(Flash命令)需要写入要执行的操作,然后在Flash状态寄存器中写入一个位来下发命令,代码需要检查下发的Flash命令是否会产生错误。在单组Flash部署中,代码需要等待设置Flash命令完成标志,以便它可以返回正常的代码执行,对于双组Flash,在检查了下发Flash命令没有导致错误产生后将立即返回执行其它代码部分。建议在下发新命令前,代码总是检查以前的命令是否已经完成,以避免潜在的问题。
下面的文本框是关于如何为MCU部署Flash命令的代码示例。
#define Flash_Busy() FSTAT_FCCF
#define EraseSectorFlashB(Addr) FlashB_Command(Addr, 0xff, FLASH_ERASE_CMD)
#define WriteByteFlashB(Addr, Data) FlashB_Command(Addr, Data, FLASH_PROGRAM_CMD)
void main(void)
{
unsigned char FlashErasedAddress = 0x4000;
unsigned char FlashWrittenAddress = 0x4000;
unsigned char FlashWrittenData = 'A';
if (!Flash_Busy())
{
EraseSectorFlashB(FlashErasedAddress);
}
if (!Flash_Busy())
{
WriteByteFlashB(FlashWrittenAddress, FlashWrittenData);
}
对于双组Flash:
本节显示了Flash B部分主要文件调用擦除和单字节写入例程的典型实施方案。宏定义允许为两种目的使用相同的例程,因为这两种操作非常相似。下面是一种推荐的写入/擦除Flash例程的部署方法。
#pragma CODE_SEG FLASH_A
unsigned char FlashB_Command(unsigned int FlashAddress, unsigned char FlashData, unsigned char Command)
{
/* Write Data into Flash*/
(*(volatile unsigned char *)(FlashAddress)) = FlashData;
/* Write Command */
FCMD = Command;
/* Launch command by setting FSTAT.FCBEF to 1 */
FSTAT = 0x80;
/* Wait at least 4 cycles to read the Error Flags */
_asm NOP;
_asm NOP;
_asm NOP;
_asm NOP;
/* Check if Flash Access Error or Protection Violation Error are Set */
if (FSTAT & (FSTAT_FACCERR_MASK|FSTAT_FPVIOL_MASK))
{
/* If so, finish the function returning FLASH_ERROR to indicate error */
FlashClearErrorFlags();
return (FLASH_ERROR);
}
/* Return FLASH_OK to indicate that the function executed Ok */
return (FLASH_OK);
}
#pragma CODE_SEG DEFAULT
所有寄存器和位名称对应于飞思卡尔S08系列MCU中现有的名称。
结论
飞思卡尔双组Flash是一个简单的想法,通过增强性能、避免CPU拖延情况、在代码执行过程中保持中断服务例程、不需要把例程复制到RAM,简化了应用设计。有了这些功能,可以更容易地设计和部署在代码执行过程中需要写入或擦除Flash存储器的最终应用。
引导程序或EEPROM仿真等应用通过考虑正确的存储器分配并消除一些限制(如在Flash例程执行过程中停止通信外设),利用该功能,从而提高效率。
- 第 1 页:带有双组闪存的MCU优点
- 第 2 页:双组Flash实施方案
本文导航
非常好我支持^.^
(4) 100%
不好我反对
(0) 0%
相关阅读:
- [电子说] PY32F002A系列单片机:高性价比、低功耗,满足多样化应用需求 2023-10-24
- [电子说] HOLTEK新推出BH66F2475连续血糖监测MCU 2023-10-24
- [电子说] STM32基础知识:定时器的定时计数功能 2023-10-24
- [电子说] HASH算法加密芯片的工作原理及其在STM32 MCU上的应用 2023-10-24
- [PCB设计] PCB板第一次上电会发生什么事情? 2023-10-24
- [处理器/DSP] 国内外龙头RISC-V布局情况分析 2023-10-24
- [电子说] 士兰微电子多款家电及工具类电机控制解决方案 2023-10-24
- [电子说] 续写新篇章!德珑集团总部及高端制造基地开工仪式成功举行 2023-10-24
( 发表人:Spring )