今天带着大家学习下飞思卡尔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笔记”-->关注-->留言获取相关资料。

还有获取更多资料。。。

飞思卡尔MC9S12X Flash驱动相关推荐

  1. 飞思卡尔MC9S12X PWM驱动

    今天带着大家学习飞思卡尔MC9S12X PWM驱动 首先什么是PWM及应用 脉冲宽度调制(PWM)是产生精确脉冲序列输出和实现D/A转换的有效方法,微控制器的脉宽调制模块被广泛应用于工业控制和新型消费 ...

  2. 飞思卡尔MC9S12X CAN驱动

    今天带着大家学习下MC9S12XS  CAN驱动模块开发.首先先了解下什么CAN,用途. CAN总线的概念: CAN是控制器局域网络(Controller Area Network)的简称,是由研发和 ...

  3. 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用

    飞思卡尔MC9S12X:CAN初始化配置 飞思卡尔MC9S12X:CAN发送配置 飞思卡尔MC9S12X:CAN接收配置 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用 关于CAN驱动的配置, ...

  4. 飞思卡尔MC9S12X:CAN接收配置

    飞思卡尔MC9S12X:CAN初始化配置 飞思卡尔MC9S12X:CAN发送配置 飞思卡尔MC9S12X:CAN接收配置 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用 一.MSCAN接收流程 ...

  5. 飞思卡尔MC9S12X:CAN发送配置

    飞思卡尔MC9S12X:CAN初始化配置 飞思卡尔MC9S12X:CAN发送配置 飞思卡尔MC9S12X:CAN接收配置 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用 一.MSCAN发送流程 ...

  6. 飞思卡尔MC9S12X:CAN初始化配置

    飞思卡尔MC9S12X:CAN初始化配置 飞思卡尔MC9S12X:CAN发送配置 飞思卡尔MC9S12X:CAN接收配置 飞思卡尔MC9S12X:CAN驱动函数在主函数中的应用 一.MSCAN初始化流 ...

  7. 飞思卡尔MC9S12X PIT模块

    今天带着大家学习了解下飞思卡尔MC9S12XS PID模块. PIT模块概述 周期性中断定时器(Periodic Interrupt Timer,PIT)模块是一组24位的定时器,由8位微定时器和16 ...

  8. 飞思卡尔比赛K60驱动OLED12864显示摄像头采集的赛道图像,完整代码分享

    一.首先采集摄像头图像,由于硬件不同采集方式也不一样,我就不多做说明 二.将采集到的图像进行二值化 三.下面为完整显示函数 备注:大家主需要修改对应的引脚就行(修改初始化和宏定义) led.c文件 # ...

  9. 【飞思卡尔 MC9S12】内部Flash读写

    上一篇:[飞思卡尔 MC9S12]PRM文件与内存映射(Flash.RAM.EEE) 上一篇讲到PRM文件与内存映射,其中有个重要寄存器叫做GPAGE,可以全局访问所有地址范围,Flash操作也是基于 ...

最新文章

  1. 一道有意思的阶乘计算题
  2. Swoft 源码剖析 - Swoft 中的注解机制
  3. .NET Core容器化@Docker
  4. SpringBoot项目中,Redis的初次使用
  5. Java Socket分发服务负载均衡
  6. Linux常用命令(持续更新)
  7. Java基础之不一样的方法重载!
  8. 局域网传输文件_WinXP系统电脑局域网传输文件的操作方法
  9. JavaScript学习初步
  10. python调用Java代码并执行--------jpype使用篇
  11. 台式计算机m4350,联想 商用台式机 ThinkCentre M4350t
  12. 命令创建vue项目工程
  13. 五个免费数据采集工具网站
  14. “无法为保留分区分配驱动器号”的解决
  15. vue在日历中使用 tippyjs 来做悬浮弹框自定义插入html
  16. VB.net小技巧——VB.net中的结构体和共用体
  17. 自定义vscode插件路径及离线安装VSIX说明
  18. 降低管理成本、增强团队协作
  19. 【颜纠日记】5个存钱方法摆脱月光族,如何存钱秘籍,轻松存到人生第一个100万。
  20. SpringBoot框架的环境搭建与使用

热门文章

  1. 计算机集群英语怎么说,cluster是什么意思_cluster的翻译_音标_读音_用法_例句_爱词霸在线词典...
  2. hbase hyperbase 区别_星环hyperbase和开源hbase的那些事
  3. clap与slap_关于SLAP
  4. TP-Link WR841N无线桥接(WDS)教程
  5. curator(curator)
  6. 浅谈静电场的边值问题(包括数学物理方法和数值计算)
  7. 7000字用户画像技术及方法论
  8. 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。...
  9. 221003工作日志
  10. 201571030132/201571030333《小学四则运算系统》结对项目报告