案例研究: 如何在飞思卡尔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例程执行过程中停止通信外设),利用该功能,从而提高效率。
本文关键字:暂无联系方式嵌入式系统-技术,单片机-工控设备 - 嵌入式系统-技术
上一篇:基于Linux的SOPC开发