标题:
9S08系列单片机写Flash的程序代码(头文件)
[打印本页]
作者:
zhangxian
时间:
2010-2-1 19:28
标题:
9S08系列单片机写Flash的程序代码(头文件)
经常看到有人问S08单片机中写Flash的程序,就把我多年使用的程序发一个,如有高手改进了程序,告诉我一声:
zhangxian9s08@163.com
调用程序之前别忘了设置FCDIV寄存器。
150K < (FBUS/(FCDIV+1)) < 200K
HCS08
系列单片机的
Flash
可以保存重要参数,运行时可以重新写入。在正在写入时,
Flash
加了高电压,不能读,所以这时也不能从
Flash
取指令,必须从
RAM
区取指令。首先在
RAM
区建立一个
32
字节的数组,这是一段写
Flash
中一个字节的程序
:
void
FlashMem( void )
{
__asm
LDA
#0x10
// A6 10
__asm
STA
FSTAT
// C7 18 25
// FSTAT = 0x10;
__asm
LDA
#0x00
// A6 00
__asm
STA
0xFD00
// C7 FD 00
// (*(uint8 *)0xFD00) = 0x00;
__asm
LDA
#0x20
// A6 20
__asm
STA
FCMD
// C7 18 26
// FCMD
= mByteProg;
__asm
LDA
#0xC0
// A6 C0
__asm
STA
FSTAT
// C7 18 25
// FSTAT = 0xC0;
__asm
NOP
// 9D
__asm
NOP
// 9D
__asm
NOP
// 9D
__asm
NOP
// 9D
while(
!FSTAT_FCCF
) { }
}
这段程序是向地址为
0xFD00
写入一个字节数据
0x00
,命令代码
0x20
是
mByteProg(
字节写入命令
)
,
以这段程序为基础,修改
0x00
、
0xFD00
、
0x20
等三个数据,就可以实现写入批量字节、删除
Flash
扇区等命令。这段程序在写批量数据时不是最快的,如命令
mBurstProg
比
mByteProg
快一倍,但是体积会大很多,而且不方便和删除程序合用一段程序,在折衷了速度、体积等因素之后,剩下这
32
字节程序。
ColdFireV1
的程序跟这个类似,是
52
字节的程序,一次写
4
个字节数据。
下面是全部代码
:
(
AW60
、
SH8
、
LG32
、
DZ60
、
QB8
、
QD4
、
QG8
试验通过)
/********************************************************/
/***
Copyright (c) 2008
张多多单片机技术研究所
***/
/***
***/
/***
文件名称
: S08SaveToFlash.h
***/
/***
摘
要
: 9S08
芯片运行中编程
***/
/***
程
序
员
:
张
宪
(
zhangxian9s08@163.com
)
***/
/***
完成日期
: 2008-10-25
***/
/*****************************************************/
#ifndef __S08SAVETOFLASH_H
#define __S08SAVETOFLASH_H
typedef
unsigned
char
uint8;
typedef
unsigned
short
uint16;
void
EraseFlash(
uint16 Base_Flash);
void
SaveToFlash(uint16 Base_Flash, uint8 *pData, uint16 SaveBytes);
#endif
附件:
HCS08系列单片机写Flash的程序.rar
(2010-2-1 19:28, 14.12 KB) / 下载次数 501
http://bbs.eccn.com/attachment.php?aid=7871&k=850843f9c1ad710128bb886557072592&t=1732395258&sid=7hdoo9
作者:
zhangxian
时间:
2010-2-1 19:32
格式有点乱
作者:
zhangxian
时间:
2010-2-1 19:34
/****************************************************/
/*** Copyright (c) 2008 张多多单片机技术研究所 ***/
/*** ***/
/*** 文件名称: S08SaveToFlash.C ***/
/*** 摘 要: 9S08芯片运行中编程 ***/
/*** 程 序 员: 张 宪 (
zhangxian9s08@163.com
) ***/
/*** 完成日期: 2008-10-25 ***/
/***********************************************/
uint8 FlashMem[32] =
{
0xA6,0x10,0xC7,0x18,0x25,0xA6,0x00,0xC7,0xFD,0x00,0xA6,0x20,0xC7,0x18,0x26,0xA6,
0xC0,0xC7,0x18,0x25,0x9D,0x9D,0x9D,0x9D,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF9,0x81
};
/******************************************************/
#define FlashData FlashMem[6] // 数据字节,如:0x00
#define FlashAddr (*((uint16 *)(&FlashMem[8])) ) // 数据地址,如:0xFD00
#define FlashCmd FlashMem[11] // 命令, 如:0x20
#define RunFlashCmd ((void (*)(void))((uint16)FlashMem)) // 函数入口
/***********************************************/
/*** 此函数需要中断保护: ***/
/**********************************************/
void EraseFlash(uint16 Base_Flash)
{
__RESET_WATCHDOG();
FlashAddr = Base_Flash; // Flash地址
FlashCmd = mPageErase; // 扇区删除命令: 0x40
RunFlashCmd(); // 32字节程序入口
}
/***********************************************/
/*** 此函数需要中断保护: ***/
/**********************************************/
void SaveToFlash(uint16 Base_Flash, uint8 *pData, uint16 SaveBytes)
{
Assert( SaveBytes>0 );
while( SaveBytes-- )
{
__RESET_WATCHDOG();
FlashData = *pData++; // 更新数据
FlashAddr = Base_Flash++; // 更新地址
FlashCmd = mByteProg; // 字节编程命令: 0x20
RunFlashCmd(); // 32字节程序入口
}
}
/****************** End of file *****************/
作者:
zhangxian
时间:
2010-2-1 19:39
头文件重发一个:
/***********************************************/
/*** Copyright (c) 2008 张多多单片机技术研究所 ***/
/*** ***/
/*** 文件名称: S08SaveToFlash.h ***/
/*** 摘 要: 9S08芯片运行中编程 ***/
/*** 程 序 员: 张 宪 (
zhangxian9s08@163.com
) ***/
/*** 完成日期: 2008-10-25 ***/
/************************************************/
#ifndef __S08SAVETOFLASH_H
#define __S08SAVETOFLASH_H
typedef unsigned char uint8;
typedef unsigned short uint16;
void EraseFlash( uint16 Base_Flash);
void SaveToFlash(uint16 Base_Flash, uint8 *pData, uint16 SaveBytes);
#endif
作者:
shengds
时间:
2010-2-1 20:35
好东西,支持一下
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0