首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

9S08系列单片机写Flash的程序代码(头文件)

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,命令代码0x20mByteProg(字节写入命令)
以这段程序为基础,修改0x000xFD000x20等三个数据,就可以实现写入批量字节、删除Flash扇区等命令。这段程序在写批量数据时不是最快的,如命令mBurstProgmByteProg快一倍,但是体积会大很多,而且不方便和删除程序合用一段程序,在折衷了速度、体积等因素之后,剩下这32字节程序。ColdFireV1的程序跟这个类似,是52字节的程序,一次写4个字节数据。
下面是全部代码: AW60SH8LG32DZ60QB8QD4QG8试验通过)
/********************************************************/
/***
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 (14.12 KB)

胜固欣然败亦喜
格式有点乱
胜固欣然败亦喜
/****************************************************/
/***  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 *****************/
胜固欣然败亦喜
头文件重发一个:
/***********************************************/
/***  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
胜固欣然败亦喜
好东西,支持一下
返回列表