📄 main.c
字号:
#include <hidef.h> /* common defines and macros */
#include <mc9s12dp256.h> /* derivative information */
#pragma CODE_SEG DEFAULT
/***************************************************************************************
Function Name : FLASHInit
Arguments : none
Returns : none
Notes : This function initialize FLASH module.
****************************************************************************************/
void FLASHInit(void)
{
unsigned char i;
FCLKDIV=0x8b;
FCNFG_CBEIE=0; /*disable CBEIE interrupt*/
FCNFG_CCIE=0; /*disable CCIE interrupt*/
FCNFG_KEYACC=0; /*write data into flash*/
for(i=0;i<4;i++)
{
FCNFG_BKSEL=i; /*select flash block*/
FSTAT_PVIOL=1; /*clear the PVIOL flag bit*/
FSTAT_ACCERR=1; /*clear the ACCERR flag bit*/
FPROT_FPOPEN=1; /*sectors not protected and are enabled for program or erase*/
FPROT_FPHDIS=1; /*higher protection disable*/
FPROT_FPLDIS=1; /*lower protection disable*/
}
}
/***************************************************************************************
Function Name : FLASHEraseVerify
Arguments : none
Returns : FAIL:0
OK:1
Notes :
****************************************************************************************/
unsigned char FLASHEraseVerify(void)
{
while(!FSTAT_CBEIF){} //if there are still some commands in the buffer, wait
FCMD=0x05;
FSTAT_CBEIF=1; //clear interrupt flag
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))//if there errors
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear error flags
return(0);
}
while(!FSTAT_CBEIF){} //wait for the command complete
if(FSTAT_BLANK==1)
return(1); //if flash is blank
else
return(0);
}
/***************************************************************************************
Function Name : FLASHWordProgram
Arguments : addr
data
Returns FAIL:0
OK:1
Notes :
****************************************************************************************/
unsigned char FLASHWordProgram(unsigned int addr,unsigned int data)
{
unsigned int *paddr;
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear error flags
}
paddr=(unsigned int *)addr;
while(!FSTAT_CBEIF){} //if there are still some commands in the buffer, wait
*paddr=data; //write the data into the address
FCMD=0x20;
FSTAT_CBEIF=1; //clear the interrupt flag.
if(FSTAT_PVIOL==1 || FSTAT_ACCERR==1) //there are errors.
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear the error flags.
return(0);
}
if(*paddr==data) //if write a correct data.
return(1);
else
return(0);
}
/***************************************************************************************
Function Name : FLASHSectorErase
Arguments : addr
Returns : FAIL:0
OK:1
Notes :
****************************************************************************************/
unsigned char FLASHSectorErase(unsigned int addr)
{
unsigned int *paddr,i;
if(addr%512!=0) //if address is not aligned
return(0);
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear error flags
return(0);
}
paddr=(unsigned int*)addr;
while(!FSTAT_CBEIF){} //if there are still some commands in the buffer, wait
*paddr=0xFF;
FCMD=0x40;
FSTAT_CBEIF=1; //clear the interrupt flag
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))//if there are erros
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear error flags
return(0);
}
for(i=0;i<256;i++) //check result
{
if(*paddr==0xFFFF)
paddr+=2;
else
return(0);
}
return(1);
}
/***************************************************************************************
Function Name : FLASHMassErase
Arguments : none
Returns : FAIL:0
OK:1
Notes :
****************************************************************************************/
unsigned char FLASHMassErase(void)
{
unsigned int *paddr;
unsigned int addr;
addr=0x4000;
paddr=(unsigned int*)addr; //paddr point to the start address of eeprom
if(FLASHEraseVerify()==1) //if the eeprom is already blank
return(1);
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))//if there are still error flags
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1;
return(0);
}
while(!FSTAT_CBEIF){} //if there are still some commands in the buffer, wait
*paddr=0xFF;
FCMD=0x41;
FSTAT_CBEIF=1; //clear interrupt flag
if((FSTAT_PVIOL==1) || (FSTAT_ACCERR==1))//if there are errors
{
FSTAT_PVIOL=1;
FSTAT_ACCERR=1; //clear error flags
return(0);
}
return FLASHEraseVerify();
}
#pragma CODE_SEG DEFAULT
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"
void main(void) {
/* put your own code here */
unsigned char test;
EnableInterrupts;
FLASHInit();
/*write a word into unbanked flash*/
FCNFG_BKSEL=0; /*select flash block*/
test=FLASHWordProgram(0x4000,0x9999);
//test=FLASHSectorErase(0x4000);
//test=FLASHMassErase();
for(;;) {} /* wait forever */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -