?? main.c
字號(hào):
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908GZ60.h> /* include peripheral declarations */
#include <String.h>
void DoEarseFlash(void);
void DoWriteFlash(void);
void EarseFlash_END(void);
void WriteFlash_END(void);
void EarseFlash(unsigned int addr);
void WriteFlash(unsigned int addr);
byte N=0;
byte data[64]=0;
static word pbase,pend,faddr;
static byte PrgOfRam[500]; //存放擦/寫(xiě)Flash程序的數(shù)組 操作函數(shù)必須存在ram里面運(yùn)行
byte m;
void main(void) {
EnableInterrupts; /* enable interrupts */
/* include your code here */
N=4;
data[0]=1;
data[1]=2;
data[2]=3;
data[3]=4;
asm("SEI");
//調(diào)用EarseFlash()程序之前要保護(hù)后一頁(yè)之后的區(qū)域
//如:EarseFlash(0x8000),則要保護(hù)的為$8100后的區(qū)域
FL1BPR=0b00000010; //保護(hù)$8100~$FFFF的FLASH區(qū)域
EarseFlash(0x8000);
//調(diào)用WriteFlash()程序之前要保護(hù)后一頁(yè)之后的區(qū)域
//如:WriteFlash(0x8000),則要保護(hù)的為$8100后的區(qū)域
FL1BPR=0b00000010; //保護(hù)$8100~$FFFF的FLASH區(qū)域
WriteFlash(0x8000); //將數(shù)據(jù)寫(xiě)入flash
asm("CLI");
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave this function */
}
/*EarseFlash:擦除指定flash的一頁(yè)-------------------------------------*
*功 能:擦除以addr為首地址的flash一頁(yè) *
*參 數(shù):addr要擦除的首地址 *
*返 回:無(wú) *
*-------------------------------------------------------------------------------*/
void EarseFlash(unsigned int addr)
{
void far * t;
faddr=addr; //擦除flash的首地址
//將擦除程序從Flash區(qū)拷貝到RAM區(qū)PrgOfRam
asm("ldhx @DoEarseFlash"); //擦除程序的首地址->HX
asm("sthx 0x40");
pbase=*((unsigned int *)0x40); //HX->內(nèi)存變量pbase
asm("ldhx @EarseFlash_END"); //擦除程序的末地址->HX
asm("sthx 0x42");
pend=*((unsigned int *)0x42); //HX->內(nèi)存變量pend
t=memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
//在RAM區(qū)執(zhí)行擦除程序
asm("ldhx @PrgOfRam"); //擦除程序在RAM區(qū)的首地址
asm("jsr ,X"); //執(zhí)行RAM區(qū)域的擦除程序
}
/*DoEarseFlash:擦除指定flash區(qū)-------------------------*
*功 能: 真正執(zhí)行擦除addr指向的flash區(qū)的操作 *
*參 數(shù):無(wú) *
*返 回:無(wú) *
*內(nèi)部調(diào)用:延時(shí)函數(shù)delay1 (用嵌入?yún)R編調(diào)用) *
*-----------------------------------------------------*/
void delay1(void);
void DoEarseFlash(void)
{
unsigned char i;
FL1CR=0b00000010; //①1->ERASE,0->MASS(頁(yè)擦除)
i=FL1BPR; //②讀FLBPR
*((volatile unsigned char *)faddr)=0; //③任意數(shù)->faddr,選中flash頁(yè)
asm ("bsr delay1"); //④延時(shí)10us
FL1CR=0b00001010; //⑤1->HVEN (加高壓)
asm ("bsr delay1"); //延時(shí)時(shí)間必須>1.6ms
FL1CR=0b00001000; //⑦0->Erase
asm ("bsr delay1"); //⑧10us
FL1CR=0b00000000; //⑨0->HVEN(取消高壓)
asm ("bsr delay1"); //⑩延時(shí)10us
}
void delay1(void) //延時(shí)一定時(shí)間,供上述程序調(diào)用
{ unsigned char j;
for (j=0;j<100;j++); }
void EarseFlash_END(void) //擦除程序的末地址
{ }
/*WriteFlash:向addr指向的flash區(qū)寫(xiě)入數(shù)據(jù)---------------*
*功 能:向指定flash地址寫(xiě)入數(shù)據(jù) *
*參 數(shù):addr要寫(xiě)入的首址 *
*返 回:無(wú) *
*-----------------------------------------------------*/
void WriteFlash(unsigned int addr)
{
void far * t;
faddr=addr; //寫(xiě)入flash的首地址
//將寫(xiě)入程序從Flash區(qū)拷貝到RAM區(qū)PrgOfRam
asm("ldhx @DoWriteFlash"); //寫(xiě)入程序的首地址->HX
asm("sthx 0x40");
pbase=*((unsigned int *)0x40); //HX->內(nèi)存變量pbase
asm("ldhx @WriteFlash_END");//寫(xiě)入程序的末地址->HX
asm("sthx 0x42");
pend=*((unsigned int *)0x42); //HX->內(nèi)存變量pend
//將寫(xiě)入程序從Flash區(qū)拷貝到RAM區(qū)PrgOfRam
t=memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
//在RAM區(qū)執(zhí)行寫(xiě)入程序
asm("LDHX @PrgOfRam"); //寫(xiě)入程序在RAM的首地址
asm("jsr ,X"); //執(zhí)行RAM區(qū)的寫(xiě)入程序
}
/*DoWriteFlash:實(shí)際執(zhí)行的寫(xiě)入函數(shù)----------------------*
*功 能:調(diào)入內(nèi)存執(zhí)行擦除指定flash地址的數(shù)據(jù) *
*參 數(shù):無(wú) *
*返 回:無(wú) *
*內(nèi)部調(diào)用:延時(shí)函數(shù)delay2(用嵌入?yún)R編調(diào)用) *
*-----------------------------------------------------*/
void delay2(void);
void DoWriteFlash(void)
{
unsigned char i;
unsigned char j;
FL1CR=0b00000001; //①1->PGM
i=FL1BPR; //②讀FLBPR
//③任意數(shù)->faddr,選中flash行
*((volatile unsigned char *)faddr)=0;
asm ("bsr delay2"); //④延時(shí)10us
FL1CR=0b00001001; //⑤1->HVEN
asm ("bsr delay2"); //⑥延時(shí)10us
//⑦將數(shù)據(jù)寫(xiě)入相應(yīng)的flash地址
for(i=0;i<N;i++)
{ //數(shù)據(jù)送入flash地址
*((volatile unsigned char *)faddr+i)=data[i];
for (j=0;j<30;j++); //⑧延時(shí)30us,不能調(diào)用延時(shí)程序
}
FL1CR=0b00001000; //⑨0->PGM
asm ("bsr delay2"); //⑩延時(shí)10us
FL1CR=0b00000000; //⑾0->HVEN
asm ("bsr delay2"); //⑿延時(shí)6us
}
void delay2(void) //延時(shí)一定時(shí)間
{ unsigned char j;
for (j=0;j<100;j++); }
void WriteFlash_END(void) //寫(xiě)入程序的末地址
{ }
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -