⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iflashm.c

📁 Dignostic test program for SMDK441f board chip peripellel. ADS1.2 compiler
💻 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 + -