《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

MC68HC908QY4单片机FLASH模拟EEPROM的方法
程序匠人 发表于 2005-9-29 13:13:00  阅读全文 | 回复(0) | 引用通告 | 编辑

MC68HC908QY4单片机FLASH模拟EEPROM的方法(网摘)
刘玉宏 发表于 2005-9-26 16:29:00 
日志标题:MC68HC908QY4单片机FLASH模拟EEPROM的方法(网摘)
发表时间:2005-8-17 17:09:17
MC68HC908QY4单片机FLASH模拟EEPROM的方法
MC68HC908QY4单片机FLASH模拟EEPROM的方法
田云锋
MC68HC908QY4是飞思卡尔半导体针对车身控制低端市场推出的低成本高性能的一款单片机。它有4K FLASH,128字节RAM,2通道16位具有输入捕捉,输出比较以及PWM功能的定时器,内部晶振,4通道8位AD转换,具有低电压禁止功能,看门狗,大电流I/O端口,键盘中断,13路双向I/O端口以及1路输入端口。它有16引脚DIP,SOIC,TSSOP三种封装形式。
MC68HC908QY4主要应用于车身控制,比如对天窗,雨刮,电动车窗,后视镜的控制。由于越来越多的汽车厂商针对车身控制大量采用LIN总线,所以MC68HC908QY4常常用来做LIN网络中的一个从节点。用户可以用定时器来模拟串口实现LIN通讯功能。飞思卡尔也提供了针对QY系列的LIN驱动程序。用户可到飞思卡尔网站上下载LIN驱动程序。

在实际的应用中,用户经常会遇到在程序运行过程中保存一些数据,比如天窗的行程,后视镜的位置等。这些数据在工作中经常会变化,所以需要及时地进行存储。存储这些数据常用的办法是用EEPROM。MC68HC908QY4虽然本身不带EEPROM,但是却可以用FLASH来模拟EEPROM,这样不仅简化了设计,而且降低了成本。

MC68HC908QY4的FLASH写入10个字节,仅需1ms,是EEPROM的10倍。它的擦除时间为4ms。它的擦写次数为1万次。
MC68HC908QY4的FLASH是以页为单位,每页64字节。它允许写入单个字节,但是擦除时,必须整页擦除。在一页内,可以依次将数据写入FLASH,当写满一页后,再全部擦除整页。比如每次写入4字节数据块,一页可以写16个数据块,写满后,再全部擦除。这样在某个页内对数据块的擦写次数可以提高16倍,即16万次。数据块的大小最好是2的n次方,并且小于32字节。这样可以一页64字节就可以全部利用。如果大于32字节,每写一次,就要擦除整页。

一般的要想对FLASH在应用编程,必须将FLASH的擦写程序拷贝到RAM中执行,但是由于MC68HC908QY4的RAM只有128字节,而且FLASH空间也有限,所以飞思卡尔把对FLASH擦写的程序在出厂前固化到了监控ROM区中。用户如需对FLASH进行编程,只需调用这几个函数即可。

----------------------------------------------------------------------------------------------------------
ERARNGE 0x2806  //擦除函数入口地址
PGRRNGE 0x2809 //编程函数入口地址

表1  固化在ROM内的函数的入口地址
------------------------------------------------------------------------------------------------------------

调用编程函数时,这些函数需要访问几个固定RAM区,因此需要先对这几个RAM区赋值。如图2所示。注意:用户的应用程序中的变量不要放在这个区域内。在调用PGRRNGE时,需要编程的FLASH的起始地址需要放在变址寄存器H:X中,所以不需要在RAM区来存储。
------------------------------------------------------------------------------------------------------------
入口参数 RAM地址 字节数  用途
CTRLBYT $88  1   控制位
CPUSPD $89  1   总线速度(单位:0.25MHz)
LSTADDR $8A-8B 2   FLASH中数据块的末尾地址
BFRSTRT $8C => 数据块的大小 数据缓冲区即要编程的数据

表2 固化在ROM内的函数用到的RAM区的地址
------------------------------------------------------------------------------------------------------------
另外需要注意的是CTRLBYT用来告诉擦除函数时页擦除,还是整体擦除。这里因为用户程序需要保留,所以应该选择页擦除。CPUSPD要告诉这两个函数总线的速度,以保证这些函数在执行时延时准确。在调用这两个函数时,要禁止所有的中断,在调用结束后,再打开中断。下面代码是使用示例,编程环境为codewarriorHC08 V3.1。
------------------------------------------------------------------------------------------------------------
#i nclude <hidef.h>  /* for EnableInterrupts macro */
#i nclude <MC68HC908QY4.h>  /* include peripheral declarations */
#define FBUS 3200000  //总线速度
#define ERARNGE() {__asm jsr 0x2806;} //跳到0x2806执行
#define PGRRNGE() {__asm jsr 0x2809;} //跳到0x2809执行
#define CTRLBYT (*(volatile unsigned char*) (0x88)) //存放控制位的RAM地址
#define CPUSPD  (*(volatile unsigned char*) (0x89)) //存总线速度的RAM地址
//LADDRH,LADDRL存储FLASH编程末尾地址的RAM地址
#define LADDRH  (*(volatile unsigned char*) (0x8A))
#define LADDRL  (*(volatile unsigned char*) (0x8B))
#define OSC_CONST  FBUS/250000  //总线速度(单位:0.25MHz)
#define FLASH_TEST_ADDRESS 0xFD40 //存放数据的FLASH页的首地址
#define RECEIVE_LENGTH 2   //编程数据的长度
unsigned char My_Receive[RECEIVE_LENGTH]@0x8C;  //存储编程数据的RAM区
void ProgramRange(word *_ini, byte _num)  //FLASH编程函数
{
word _first;
_first = *_ini; //要编程的起始地址
CPUSPD = OSC_CONST; //总线速度
LADDRH = ((_first + _num -1) & 0xFF00) >> 8;
LADDRL = ((_first + _num -1) & 0x00FF); //要编程的末尾地址
__asm ldhx _first;  //将要编程的地址装入H,X寄存器
PGRRNGE();  //调用编程函数
return;
}
void EraseRow(word *_row)  //FLASH擦除函数
{
 word _address;
 _address = *_row;  //要擦除的起始地址
 CPUSPD = OSC_CONST; //总线速度
 CTRLBYT &= 0xBF;  //控制字,页擦除
 __asm ldhx _address;  //将要擦除的地址装入H,X寄存器
 ERARNGE();   //调用擦除函数
 return;
}
void main(void)
{
word address;
word *ptr;
address = FLASH_TEST_ADDRESS;
EraseRow(&address); //擦除地址从FLASH_TEST_ADDRESS开始的一页 
My_Receive[0] = 0x18; //要写入FLASH中的数据
My_Receive[1] = 0x08; //要写入FLASH中的数据
//从FLASH_TEST_ADDRESS开始写入RECEIVE_LENGTH个字节
ProgramRange (&address, RECEIVE_LENGTH); 
EnableInterrupts; /* enable interrupts */ 
for(;;)
{
ptr=(word *) (0xFD40)); //把FLASH中刚写入的值读出来
....
}
}
FLASH模拟EEPROM使用实例
------------------------------------------------------------------------------------------------------------
上面的例子只是介绍了一种基本的FLASH模拟EEPROM的方法,用户如果想写满整页之后,再擦除,可以采用查询方式,从页的首地址开始,如果FLASH的内容等于$FF,则表示为空,然后在该地址内写入数据,一直到写满。不过此时用户的数据不能等于$FF,否则会发生错误。另外,还可以采用标志位,在保存的数据后面加一个标志位,如果查到标志位,就说明此地址内已有数据,然后继续往后查询,直到最后一个标志位,此时后面的FLASH空间内可以写数据。
如果用户需要保存历史数据,则可以采用两页FLASH来存储数据,一页存放当前数据,另一页存放历史数据。当前数据页存满以后,把数据全部转移到历史数据页中,然后在擦除当前数据页,继续写入新数据。
另外用户的应用程序为了避免意外的被擦除,应该把存放用户程序的FLASH保护起来。寄存器FLBPR可以用来保护从某一特定地址以上的FLASH区。因此用来存放数据的FLASH区应该尽量从地址开始,用户程序放在高地址。FLBPR寄存器的赋值需要对采用FLASH的编程方法写入。
在应用中,系统可能在编程中掉电,或由于其他原因程序中止,这样已经写入的数据可能是无效的或错误的,用户在开发阶段要考虑到这一点,尽量减少这种情况的发生,或者可以考虑采用数据恢复机制。不过由于FLASH的擦写速度快,所以发生这种情况时,它比EEPROM就更具有优势。
本文介绍的MC68HC908QY4单片机FLASH模拟EEPROM的这种方法,只是起到抛砖引玉的作用。用户可以根据自己的实际情况,灵活应用满足系统要求。

参考文献

1. MC68HC908QY4/D, technical data sheet
2. Application Note AN2346, “EEPROM Emulation Using FLASH in MC68HC908QY/QT MCUs”
3. Application Note AN1831, “Using MC68HC908 On-chip FLASH Programming Routines”
4. Application Note AN2183, “Using FLASH as EEPROM on the MC68HC908GP32”
5. Engineering Bulletin EB398, “Techniques to Protect MCU Applications
Against Malfunction due to Code Run-away

这篇文章我在freescale的网站上看过,不过是英文的AN,至于程序我没有对比,如果译者不是有意篡改,应该可信的.不过后面列有参考文献大家按图索骥,去读读原文即可.

 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!