飞思卡尔MC9S12X Flash驱动

今天带着大家学习下飞思卡尔MC9S12  Flash驱动

        在现今的经济社会,比拼的“快”不仅仅是速度快,更是效率高。身处社会分工细致的今天,让自己更快效率更高是有方法的。 

       每一家MCU产商都会提供他们生产的MCU型号的datasheet,Reference Manual等各种说明手册。这对于从事电子软件开发的人员来说,这是他们的第一手资料,也是他们最重要的参考资料,他们所有的软件设计工作都是参考手册上的内容,比如,硬件工程师可能比较在乎芯片的电气特性;MCU应用工程师关注外设,编程器时序开发人员则比较注重去理解Flash Module,在工作中他们要仔细并反复阅读他们所关注的部分。 

       飞思卡尔Flash 相关驱动 官网资料不是很多,都是一些零零散散的,今天就详细的带着大家学习下飞思卡尔FLASH驱动,

想学习flash 首先需要看懂下面的这个流程图,从时钟配置、读取状态位、写入命令、写入地址、写入数据等等。

 

下面大家一起来看下寄存器

 

 

 

/*********************************************************** ** 

名 称: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的说明

}

说明很简答,配合着程序注释一看就懂。

 

2、FSTAT状态寄存器

在上面的代码中出现了一行“while(FSTAT_CCIF==0);”,这就涉及到一个很重要的寄存器,就是Flash操作的状态寄存器,就像是Flash操作步骤中的“红绿灯”一样,告诉程序什么时候可以执行什么操作,什么时候必须要等待一下。如图:

 

 

数据手册如图,强烈建议还是自己读一下原文,很有好处。

再给出一些具体的代码:

CCIF的操作代码:

?
code
1
2
FSTAT_CCIF=1;           //启动执行命令,即launch指令
while (FSTAT_CCIF==0);    //等待执行完成

ACCERR和FPVIOL的操作代码:

?
code
1
2
3
4
if (FSTAT_ACCERR)           //判断并清除标志位; 
       FSTAT_ACCERR=1;    //将标志位清零
  if (FSTAT_FPVIOL)           //判断并清除标志位; 
       FSTAT_FPVIOL=1;      //将标志位清零

 

注意点:说实话,当时我自己写程序的时候,就对标志位清零操作感到非常的疑惑,说好的清零操作呢,为什么是令标志位为等于1?后来才想明白,对于标志位,写0等效于没有操作,写1代表清零。原因主要有两点:

 

1)标志位为1一般表示有什么事情发生啦,对于标志位什么时候为1,应该是单片机根据具体的情况作出自己的判断,是根据实际情况来置1的,而不应该是人为的置1。

2) 如果某次操作我们只想对状态寄存器中的某一位或某几位进行操作,那么对其余位就必须没有任何的影响,如果规定写0时等效于无操作。

 

3、执行具体的指令

将分频和状态寄存器弄好后,就可以开开心心的执行具体的指令啦。指令具体的指令主要涉及到FCCOBIX寄存器和FCCOB寄存器:

 

 

FCCOBIX寄存器和FCCOB寄存器必须要配合使用。FCCOBIX进行选择,然后往FCCOB中写入具体的指令、地址和数据。Flash操作命令表如图:

/*********************************************************** ** 名 称:void PFlash_Erase(word ADDR16) ** 功 能:擦除P-FLASH的一个分区 ** 入口参数:无 ** 出口参数:无 ** 使用说明:无 ************************************************************/ void PFlash_Erase(word ADDR16) { while(FSTAT_CCIF==0); if(FSTAT_ACCERR) //判断并清除标志位; FSTAT_ACCERR=1; if(FSTAT_FPVIOL) //判断并清除标志位; FSTAT_FPVIOL=1; FCCOBIX_CCOBIX=0x00; FCCOB=0x0A7E; //写入擦除命令和高位地址,0A是指令,7E是高地址位 FCCOBIX_CCOBIX=0x01; FCCOB=ADDR16; //写入低16位的地址 FSTAT_CCIF=1; //启动执行命令 while(FSTAT_CCIF==0); //等待执行完成 }

P-Flash的写入操作:写入操作和擦除操作是差不多的:

 

/*********************************************************** ** 

名 称:void PFlash_Write(uint16 ADDR16) ** 

功 能:向PFLASH写入数据 ** 

入口参数:无 ** 

出口参数:无 ** 

使用说明:无 

************************************************************/ 

void PFlash_Write(word ADDR16) 

byte i,j; //i为Buffer的下标,j为string的下标 

for (i=0,j=0;i<4;i++,j++) 

Buffer[i]=0x0000; 

Buffer[i]=Buffer[i]|(string[j]<<8);

 j++;

 Buffer[i]=Buffer[i]|string[j];

 } 

while(FSTAT_CCIF==0); 

if(FSTAT_ACCERR) //判断并清除标志位;

 FSTAT_ACCERR=1; 

if(FSTAT_FPVIOL) //判断并清除标志位; 

FSTAT_FPVIOL=1; F

CCOBIX_CCOBIX=0x00; 

FCCOB=0x067E; //写入命令和高位地址(06是对P-Flash进行固化的指令) 

FCCOBIX_CCOBIX=0x01; //地址后16位 FCCOB=ADDR16; //写入低16位地址 

FCCOBIX_CCOBIX=0x02; //写入第一个数据 FCCOB=Buffer[0]; 

FCCOBIX_CCOBIX=0x03; //写入第二个数据 

FCCOB=Buffer[1]; FCCOBIX_CCOBIX=0x04; //写入第三个数据 

FCCOB=Buffer[2]; FCCOBIX_CCOBIX=0x05; //写入第四个数据 

FCCOB=Buffer[3]; FSTAT_CCIF=1; //写入执行命令

 while(FSTAT_CCIF==0); //等待执行完毕 } 这段程序理解起来应该没有问题吧。


4、最后一步:

还有注意一点  MC9S12X  flash驱动一定要放在ram中。

 

 

Flash不能对本身就行操作,也就是说在Flash中的代码不能对Flash进行操作,必须转移到RAM中才可以上面图片所示是一种方法。

还可以是使用的是#pragma关键字,再配合上codewarrior的.prm文件。

#pragma CODE_SEGFLASH_RAM //在.prm文件中将FLASH_RAM定义在RAM区中

// 对flash进行操作的代码

#pragma CODE_SEG DEFAULF

关于#pragma和.prm怎么用,注意需要利用利用RELOCATE_TO。

关注微信公众号“”嵌入式软件开发学习圈“”免费获取相关源码。。

微信-->添加朋友-->搜索“Auto笔记”-->关注-->留言获取相关资料。

还有获取更多资料。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值