9S08系列单片机写Flash的程序代码(头文件)
- UID
- 144448
- 性别
- 男
|
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
|
|
|
|
|
|
- UID
- 144448
- 性别
- 男
|
|
|
|
|
|
- UID
- 144448
- 性别
- 男
|
/****************************************************/
/*** 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 *****************/ |
|
|
|
|
|
- UID
- 144448
- 性别
- 男
|
头文件重发一个:
/***********************************************/
/*** 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 |
|
|
|
|
|
- UID
- 186569
- 性别
- 男
|
|
|
|
|
|