📄 dp_flash.c
字号:
#include "MC9S12XS128.h"
#include "DP_Flash.h"
uchar P[10]={0x1C,0x01,0x06,0x80,0x1F,0x01,0x06,0x80,0xFB,0x0A};
//FSTAT_CCIF=1; //写入执行命令
//while(FSTAT_CCIF==0); //等待执行完毕
//结尾处0x0A为返回代码RTS
uchar RAMOfProgram[10];
/*************************************************************/
/* 初始化DFLASH */
/*************************************************************/
void Flash_Init(void)
{
while(FSTAT_CCIF==0); //等待正在处理的FLASH操作完成
FCLKDIV=0x0F; //外部晶振为16M.FLASH时钟不超过1M,具体参照手册
FCNFG=0x00; //禁止中断
while(FCLKDIV_FDIVLD==0); //等待时钟设置成功
ProgramToRam(); //将程序调入到RAM中
}
/*************************************************************/
/* 擦除DFLASH的一个扇区 */
/*************************************************************/
/* 注意: ADDR16即为Global address 的后16位 */
/* ADDR16的取值范围 0x0000-0x1FFF */
/*************************************************************/
void DFlash_Erase_Sector(uint ADDR16)
{ //擦除地址所在扇区
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1210; //写入擦除命令和高位地址
FCCOBIX_CCOBIX=0x01;
FCCOB=ADDR16; //写入低16位的地址
FSTAT_CCIF=1; //启动执行命令
while(FSTAT_CCIF==0); //等待执行完成
}
/*************************************************************/
/* 向DFLASH写入数据(Phrase) */
/*************************************************************/
/* 注意: ADDR16即为Global address 的后16位 */
/* ADDR16的取值范围 0x0000-0x1FFF */
/*************************************************************/
void DFlash_Write_Phrase(uint ADDR16,uint arr[])
{ //写入4个字的数据
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x1110; //写入命令和高位地址
FCCOBIX_CCOBIX=0x01; //地址后16位
FCCOB=ADDR16; //写入低16位地址
FCCOBIX_CCOBIX=0x02; //写入第一个数据
FCCOB=arr[0];
FCCOBIX_CCOBIX=0x03; //写入第二个数据
FCCOB=arr[1];
FCCOBIX_CCOBIX=0x04; //写入第三个数据
FCCOB=arr[2];
FCCOBIX_CCOBIX=0x05; //写入第四个数据
FCCOB=arr[3];
FSTAT_CCIF=1; //写入执行命令
while(FSTAT_CCIF==0); //等待执行完毕
}
/*************************************************************/
/* 由DFLASH读取数据 */
/*************************************************************/
/* 注意: ADDR16即为Global address 的后16位 */
/* ADDR16的取值范围 0x0000-0x1FFF */
/*************************************************************/
uint DFlash_Read (uint ADDR16)
{ //返回一个字
byte lastepage; //用于存储EPAGE的值
byte epage; //用于计算EPAGE的值
unsigned int data; //读取出的数据
lastepage = EPAGE; //保存EPAGE的值
epage = (byte)(ADDR16 >>10);//计算EPAGE
EPAGE=epage; //给EPAGE赋值
data = Read_near((ADDR16 & (DFLASH_PAGE_SIZE - 1)) + DFLASH_PAGE_WINDOW_START);
//读取页面窗口中的数据
EPAGE= lastepage; //恢复EPAGE的值
return(data); //返回一个字
}
/*************************************************************/
/* 将程序调入到RAM中 */
/*************************************************************/
void ProgramToRam(void)
{
uchar i;
for(i=0x00;i<10;i++)
{
RAMOfProgram[i]=P[i];
}
}
/*************************************************************/
/* 擦除PFLASH的一个扇区 */
/*************************************************************/
/* 注意: ADDR32即为Global address */
/* ADDR32的取值范围 0x007E_0000-0x7F_FFFF */
/*************************************************************/
void PFlash_Erase_Sector(ulong ADDR32)
{ //擦除地址所在扇区
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x0A00|((uint)(ADDR32>>16));
//写入擦除命令和高位地址 0x0A 扇区擦除命令
FCCOBIX_CCOBIX=0x01;
FCCOB=(uint)ADDR32; //取低16位的地址写入
_asm("CALL RAMOfProgram");//执行RAM中的程序
//FSTAT_CCIF=1; //启动执行命令
//while(FSTAT_CCIF==0); //等待执行完成
}
/*************************************************************/
/* 向PFLASH写入数据(Phrase) */
/*************************************************************/
/* 注意: ADDR32即为Global address */
/* ADDR32的取值范围 0x007E_0000-0x7F_FFFF */
/*************************************************************/
void PFlash_Write_Phrase(ulong ADDR32,uint arr[])
{ //写入4个字的数据
while(FSTAT_CCIF==0);
if(FSTAT_ACCERR) //判断并清除标志位;
FSTAT_ACCERR=1;
if(FSTAT_FPVIOL) //判断并清除标志位;
FSTAT_FPVIOL=1;
FCCOBIX_CCOBIX=0x00;
FCCOB=0x0600|((uint)(ADDR32>>16));
//写入program命令和高位地址 0x06 写入Phrase命令
FCCOBIX_CCOBIX=0x01; //地址后16位
FCCOB=(uint)ADDR32; //取低16位的地址写入
FCCOBIX_CCOBIX=0x02; //写入第一个数据
FCCOB=arr[0];
FCCOBIX_CCOBIX=0x03; //写入第二个数据
FCCOB=arr[1];
FCCOBIX_CCOBIX=0x04; //写入第三个数据
FCCOB=arr[2];
FCCOBIX_CCOBIX=0x05; //写入第四个数据
FCCOB=arr[3];
_asm("CALL RAMOfProgram");
//FSTAT_CCIF=1; //写入执行命令
//while(FSTAT_CCIF==0); //等待执行完毕
}
/*************************************************************/
/* 由DFLASH读取数据 */
/*************************************************************/
/* 注意: ADDR32即为Global address */
/* ADDR32的取值范围 0x007E_0000-0x7F_FFFF */
/*************************************************************/
uint PFlash_Read (ulong ADDR32)
{
uint data;
data = Read_far(ADDR32);
return(data); //返回一个字
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -