关于Flash的擦除和写入,真的是让我最费力的一部分,网上的相关资料很少,好不容易找到了一点相关代码,却发现程序不能正常的运行,而且更令人无解的是程序本身怎么检查都检查不出错误。好啦,一点一点的说说我的辛酸史。
至于擦除和写入的原理是什么,这个不是我们关心的,我也不去赘述,我主要说明一下相关的具体操作。
我们主要是对飞思卡尔Flash中的PFlash即存放程序段的Flash进行操作。如图:
步骤大概分为:
1、设置Flash分频寄存器:
Flash的操作对频率有一定的要求,过低擦除不成功,过高会损毁Flash,如图为:
MC9S12XS128的FCLKDIV寄存器,所有位都是可读的但是只有7位可写入。至于应该如何设置分频数,有一张表格可以参考:
如表格说明,分频数是根据外部时钟来定的,MC9S12XS128的外部时钟是16MHz,所以我选择了0x10作为分频数。
给出一一些具体的代码:
/***********************************************************
** 名 称:void PFlash_Init(void)
** 功 能:PFlash初始化
** 入口参数:无
** 出口参数:无
** 使用说明:无
************************************************************/
void PFlash_Init(void)
{
while(FSTAT_CCIF==0); //等待正在处理的Flash操作,即CCIF=1时,操作完成
FCLKDIV=0x10; //外部晶振为16MHz,Flash时钟设置为1MHz
FCNFG=0x00; //禁止中断
while(FCLKDIV_FDIVLD==0); //等待时钟设置成功,即FDIVLD为1时设置成功
}
这里补充一下对
FCLKDIV_FDIVLD
的说明