HCS08系列单片机写Flash 范例程序
0赞
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 /*****************************************************************************/
/*** 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 ********************************/
