📄 flash.c
字号:
#include <mc9s12e64.h> /* derivative information */
#define NOP {__asm NOP; }
void FlashWrite_ROM(byte *WriteData,word * address,byte page);
void FlashWrite_RAM(byte *WriteData,word * address,byte page);
//一次擦除是256个word
//一个扇区为256个word
//写入的地址必须为偶地址
//WriteData--写入的数据
//address----写入的地址
//page-------页地址,不存在的页写入值0
//以下的为一个扇区的写入函数
#pragma CODE_SEG PROGRAM_ROM
void FlashWrite_ROM(byte *WriteData,word * address,byte page) {
word len;
if(page!=0) PPAGE=page;
FCLKDIV_PRDIV8=0; //直接使用晶体时钟
FCLKDIV_FDIV =52; //分频后的时钟在150KHZ到200KHZ之间,还要满足运行时间要求
FPROT =0xFF; //打开所有的保护
FSTAT_PVIOL =1 ; //清除保护出错标志
FSTAT_ACCERR =1 ; //清除Flash访问错误发生标志
//擦除操作
(*address) = 0x00A0; //随便写入一个数据,表示开始擦除
FCMD = 0x40; //帧擦除
FSTAT_CBEIF= 1; //清除该位
while(!FSTAT_CCIF);
//以下是开始写入
for(len=0;len<256;len++) {
while(!FSTAT_CBEIF);
FSTAT_PVIOL =1 ; //清除保护出错标志
FSTAT_ACCERR =1 ; //清除Flash访问错误发生标志
*(address+len) = (*(WriteData+2*len))*256+*(WriteData+2*len+1); //随便写入一个数据,表示开始擦除
FCMD = 0x20; //帧擦除
FSTAT_CBEIF= 1; //清除该位
while(!FSTAT_CCIF);
}
FPROT=0x00; //保护Flash块
}
#pragma CODE_SEG PROGRAM_RAM
void FlashWrite_RAM(byte *WriteData,word * address,byte page) {
word len;
if(page!=0) PPAGE=page;
FCLKDIV_PRDIV8=0; //直接使用晶体时钟
FCLKDIV_FDIV =52; //分频后的时钟在150KHZ到200KHZ之间,还要满足运行时间要求
FPROT =0xFF; //打开所有的保护
FSTAT_PVIOL =1 ; //清除保护出错标志
FSTAT_ACCERR =1 ; //清除Flash访问错误发生标志
//擦除操作
(*address) = 0x00A0; //随便写入一个数据,表示开始擦除
FCMD = 0x40; //帧擦除
FSTAT_CBEIF= 1; //清除该位
while(!FSTAT_CCIF);
//以下是开始写入
for(len=0;len<256;len++) {
while(!FSTAT_CBEIF);
FSTAT_PVIOL =1 ; //清除保护出错标志
FSTAT_ACCERR =1 ; //清除Flash访问错误发生标志
*(address+len) = (*(WriteData+2*len))*256+*(WriteData+2*len+1); //随便写入一个数据,表示开始擦除
FCMD = 0x20; //帧擦除
FSTAT_CBEIF= 1; //清除该位
while(!FSTAT_CCIF);
}
FPROT=0x00; //保护Flash块
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -