📄 iflashm.c
字号:
#include "def.h"
#include "option.h"
#include <string.h>
#include "k44.h"
#include "k44lib.h"
#include "iflashl.h"
#define IFLASH_CYCLE (2)
#define SMART_OPTION_ADDR (0xe38)
#define PROTECTION_OPTION_ADDR (0xe3c)
// FMUCON
#define OPTION_SECTOR_ERASE (1<<0)
#define NORMAL_SECTOR_ERASE (1<<1)
#define OPTION_SECTOR_PROGRAM (1<<2)
#define NORMAL_SECTOR_PROGRAM (1<<3)
#define PROGRAM_ERASE_START (1<<7)
#define WR_VERIFY_ON (1)
#define ERASE_VERIFY_ON (1)
#define IFLASH_START_ADDR (0x1f00000)
void IncCounter(void);
void _WriteIflash(U32 data);
int _ReadIflash(U32 data);
void Test_IflashM(void)
{
int result;
U32 pattern=0x55555555;
rFMACON=0x80|IFLASH_CYCLE; //CPUHOLD 00000b 2clk
//1 00000 ??
Uart_Printf("[]Internal Flash Memory Endurance Test\n");
while(1)
{
if(pattern==0x55555555)pattern=0xaaaaaaaa;
else pattern=0x55555555;
Uart_Printf("E",result);
result=Iflash_EraseSectors(0,510);
if(pattern==0x55555555)Uart_Printf("W5");
else Uart_Printf("Wa");
_WriteIflash(pattern);
Uart_Printf("R");
if(_ReadIflash(pattern))
{
IncCounter();
}
else
{
Uart_Printf("ERROR!!!\n");
while(1);
}
Led_Display(pattern&0xf);
}
}
void IncCounter(void)
{
static int count=0;
int pt;
U32 value;
if(*((unsigned *)0x1f3fe00)!=0x12345678)
{
if(Iflash_EraseSectors(511,511)==0)
{
Uart_Printf("ERROR:sector 511 can't be erased.\n");
while(1);
}
Iflash_WrWord(0x3fe00,0x12345678);
}
count++;
if(count==32)
{
count=0;
for(pt=4;pt<512;pt+=4)
{
if(*((unsigned *)(0x1f3fe00+pt))!=0)break;
}
value=*((unsigned *)(0x1f3fe00+pt));
value=value>>1;
Uart_Printf("[%x=%x]",pt,value);
Iflash_WrWord(0x3fe00+pt,value);
}
}
void _WriteIflash(U32 data)
{
int addr;
int i;
for(addr=0x0;addr<0x3fe00;addr+=4)
{
rFMADDR=addr;
rFMDATA=data;
rFMKEY0=0x5a;
rFMKEY1=0xa5;
rFMKEY2=0x5a;
rFMKEY3=0xa5;
rFMUCON=NORMAL_SECTOR_PROGRAM;
rFMUCON=NORMAL_SECTOR_PROGRAM|PROGRAM_ERASE_START;
//For CPU working during flash program/erase.
//while(rFMICON&PROGRAM_ERASE_START);
}
}
int _ReadIflash(U32 data)
{
U32 i,j;
for(i=0x0;i<0x3fe00;i+=4)
{
j=*((U32 *)(i+IFLASH_START_ADDR));
if(j!=data)
{
Uart_Printf("[ERR@%x,%x]",i,j);
return 0;
}
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -