qianyn

HCS08系列单片机写Flash 范例程序

0
阅读(3621)

      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 ********************************/