在现今的经济社会,比拼的“快”不仅仅是速度快,更是效率高。身处社会分工细致的今天,让自己更快效率更高是有方法的。
每一家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的操作代码:
FSTAT_CCIF=1; //启动执行命令,即launch指令
while (FSTAT_CCIF==0); //等待执行完成
ACCERR和FPVIOL的操作代码:
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。
上一篇:飞思卡尔MC9S12X PIT模块
下一篇:飞思卡尔MC9S12X SCI驱动
推荐阅读最新更新时间:2024-11-12 07:51
设计资源 培训 开发板 精华推荐
- 【训练营】Plot Clock with HI3861
- Arduino Nano,基于 ATmega328/ATmega168 ATmega AVR MCU 的 Arduino Nano 开发板平台
- 具有 2mm + 2mm 电感器的 LT8410 16V 输出升压转换器的典型应用电路
- 11自由度机械手驱动+力反馈
- LTC2908CDDB-A1、3.3V 和 2.5V 双电源监视器的典型应用电路,未来可能扩展至多达六个电源
- 具有低漂移满量程微调的 LT1021CCN8-5 CMOS DAC 基准的典型应用
- 基于STTS75的温度探针套件
- LT3091IFE 500mA LED 驱动器的典型应用,具有接地 LED 接线片(散热器)
- 使用 ROHM Semiconductor 的 BU4812 的参考设计
- C8051F327DK,用于 C8051F327 8051 MCU 的 MCU 开发套件