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

📄 main.c

📁 FLASH烧写程序
💻 C
字号:
//*----------------------------------------------------------------------------
//* File Name           : main.c
//* Object              : main application written in C
//* Creation            : dxb   18/6/2004
//*
//*----------------------------------------------------------------------------
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "flash.h"
#include "sys.h"
#include "math.h"

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

unsigned int  US1_RxLen;
unsigned char  *US1_RxBuff;
extern void AT91F_ASM_US1_Handler(void);
extern void AT91F_US1_Handler(void);
extern unsigned short * BASE_ADDRESS;
extern unsigned short * END_ADDRESS;
unsigned short TC0_COUNT;
unsigned int SHIFT_SECTOR_ADDR; 

void Sleep(unsigned int num)//延时ms
{
	int tt;
	int ttt;
	for(tt=0;tt<=num;tt++)
	{
		for(ttt=0;ttt<=2500;ttt++)//1ms
		{
			__asm{
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
			}
		}
		ttt=0;
	}
	tt=0;
}


void Sleep_100us(unsigned int num)//延时0.1ms
{
	int tt;
	int ttt;
	for(tt=0;tt<=num;tt++)
	{
		for(ttt=0;ttt<=250;ttt++)//0.1ms
		{
			__asm{
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
				NOP;
			}
		}
		ttt=0;
	}
	tt=0;
}



void AT91F_InitFlash()//初始化Flash
{
	
	AT91C_BASE_MC->MC_PUIA[0] = AT91C_MC_PROT_PRWURW;
	AT91C_BASE_MC->MC_PUP = 0;
	AT91C_BASE_MC->MC_PUER =0;	//* Memory controller protection unit disable
	AT91C_BASE_MC->MC_ASR = 0;  //* read only!
	AT91C_BASE_MC->MC_AASR = 0; //* read only!

	
	AT91C_BASE_EBI->EBI_CSA |= AT91C_EBI_CS0A_SMC;//设定片选0
	
	AT91C_BASE_EBI->EBI_CFGR = (AT91C_EBI_DBPUC & 0x00) | (AT91C_EBI_EBSEN & 0x01);//内部上拉,总线共享
   
    AT91C_BASE_SMC2->SMC2_CSR[0] = (AT91C_SMC2_NWS & 0x10) | AT91C_SMC2_WSEN|(AT91C_SMC2_TDF & 0x200) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16;
    
    AT91C_BASE_SMC2->SMC2_CSR[2] = (AT91C_SMC2_NWS & 0x10) | AT91C_SMC2_WSEN|(AT91C_SMC2_TDF & 0x200) | AT91C_SMC2_BAT | AT91C_SMC2_DBW_16;

}


void AT91F_InitUS1()//初始化US1串口
{
	
	AT91F_PIO_CfgPeriph(AT91C_BASE_PIOB, ((unsigned int) AT91C_PB20_TXD1)|((unsigned int) AT91C_PB21_RXD1),0); // Peripheral A
    AT91F_US1_CfgPMC();
    AT91F_US_Configure (AT91C_BASE_US1,AT91C_MASTER_CLOCK,AT91C_US_ASYNC_MODE , 115200 , 0); 
   	AT91F_US_EnableTx((AT91PS_USART) AT91C_BASE_US1);
    AT91F_US_EnableRx((AT91PS_USART) AT91C_BASE_US1);
    AT91F_US_EnableIt((AT91PS_USART) AT91C_BASE_US1,0x01);
      
    AT91F_AIC_ConfigureIt (
		AT91C_BASE_AIC,                        
		AT91C_ID_US1,                         
		AT91C_AIC_PRIOR_HIGHEST,   //最高优先级            
		AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
		AT91F_ASM_US1_Handler);
 
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US1);
	

}

void AT91F_InitTC0()//初始化TC0定时器中断
{
	unsigned int dummy;
	
	AT91F_TC0_CfgPMC();
   
    *AT91C_TC0_CCR=AT91C_TC_CLKDIS;   //禁止中断
    
    *AT91C_TC0_IDR=0xFFFFFFFF;        //禁止中断
    
    dummy=*AT91C_TC0_SR;              //读TC状态
    
    *AT91C_TC0_CMR=(unsigned int)(0x1<<2)|AT91C_TC_CPCTRG;//TIMER_CLOCK5=SLOWCLOCK=32768,达到计数值后停止TC
    
    *AT91C_TC0_CCR=AT91C_TC_CLKEN;                    //Enable the Clock Counter
    
    *AT91C_TC0_IER=AT91C_TC_CPCS;                    //Validate the RC compare interrupt
    
    *AT91C_AIC_IDCR=(unsigned int)(1<<AT91C_ID_TC0);                //Disable timer 1 interrupt at AIC level
    
    AT91F_AIC_ConfigureIt (
		AT91C_BASE_AIC,                       
		AT91C_ID_TC0,                         
		AT91C_AIC_PRIOR_HIGH_6,    //6级优先级            
		AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
		AT91F_ASM_TC0_Handler);
   
  
    *AT91C_AIC_ICCR=(1<<AT91C_ID_TC0);                //Clear the TC0 interrupt
    
    *AT91C_AIC_IECR=(1<<AT91C_ID_TC0);                //Enable the TC0 interrupt
    
    *AT91C_AIC_IMR=(1<<AT91C_ID_TC0);
    
    *AT91C_TC0_RC=0x8000;                            //定时器周期1s
    
    *AT91C_TC0_CCR=AT91C_TC_SWTRG;                   //使能时钟、计数器复位并启动时钟    
   
}

void AT91F_ZeroSdram()//Sdram清零
{
  int i=0;
 
  US1_RxBuff =(unsigned char  *)RxBuf_Bin;
  
  for(i=0;i<=0xFF0000;i++)
  US1_RxBuff[i] = 0xFF;
  
}

void US1_Printf(char *buffer)//US1输出
{

   while(*buffer != '\0') 
   {
		while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
		AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1, *buffer++);
	}

}





////////
int main()
{
	 	 
	unsigned int status;
	unsigned short i,j,k,number;
	unsigned int m,n;
	char rec;
			
	AT91F_InitFlash();
	
	AT91F_InitUS1();
    
 //   AT91F_ZeroSdram();
    ///////////////////////////应用程序开始
    US1_RxLen = 0;
    US1_RxBuff =(unsigned char  *)RxBuf_US1;
    US1_Printf("====Flash Programming Utility For AT91RM9200 ====\r\n");
    US1_Printf("           For SST (Version2.0)                   \r\n");
    US1_Printf("           Support:SST_39LF/VF160A                \r\n");
    US1_Printf("                   SST_39LF/VF800A                \r\n");
    US1_Printf("                   SST_39LF/VF400A                \r\n");
    US1_Printf("                   SST_39LF/VF1601                \r\n");
  
   	///////////////////////////选择主从Flash

	US1_RxBuff =(unsigned char  *)RxBuf_US1;
	US1_RxLen =0;
  	US1_Printf(">Choose the Flash:\r\n");
  	US1_Printf("1:Boot Flash\r\n");
  	US1_Printf("2:Second Flash\r\n\r\n");
  	
  	while(US1_RxLen == 0);
	
	if(US1_RxBuff[0] == '1')
	 {
         BASE_ADDRESS = (unsigned short  *)BASE_ADDRESS_1;
	     END_ADDRESS  = (unsigned short  *)END_ADDRESS_1;
	     US1_Printf("the first Flash is selected\r\n\r\n");
	 }
	
	else if(US1_RxBuff[0] == '2')
	 {
	    BASE_ADDRESS = (unsigned short  *)BASE_ADDRESS_2;
	    END_ADDRESS  = (unsigned short  *)END_ADDRESS_2;
	    US1_Printf("the second Flash is selected\r\n\r\n");
	 }
	   
	 	
	else
	 {
	    US1_RxLen = 0;
  	    US1_Printf("Error:Choose Flash Wrong! ");
  	    US1_Printf("Program Abort!     \r\n");
	    return 0;
	 }
	
	///////////////////////////检查Flash
	US1_Printf("====Phase1: Check Flash ====\r\n\r\n");
	
	status=Check_Chip();
	
	if(status == 1)
	     US1_Printf("Flash Check Succeed!:SST_39LF/VF160A  \r\n\r\n");
	else if(status == 2)     
	     US1_Printf("Flash Check Succeed!:SST_39LF/VF800A  \r\n\r\n");
	else if(status == 3)     
	     US1_Printf("Flash Check Succeed!:SST_39LF/VF400A  \r\n\r\n");
	else if(status == 4)     
	     US1_Printf("Flash Check Succeed!:SST_39LF/VF1601  \r\n\r\n");     
	
	/*else if(status ==FALSE)
	{
	     US1_Printf("Error:Flash Check fail! ");
	     US1_Printf("Program Abort!     \r\n");
	     return 0;
	}
   */    
    ///////////////////////////擦除FLASH
    US1_Printf("====Phase2: Erase Flash ====\r\n\r\n");
	US1_RxBuff =(unsigned char  *)RxBuf_US1;
	US1_RxLen =0;
  	US1_Printf(">Choose Erase Type:\r\n");
  	US1_Printf("1:Whole\r\n");
  	US1_Printf("2:Sector\r\n\r\n");
  	
  	while(US1_RxLen==0);
	if(US1_RxBuff[0] == '1')
	{	
		US1_RxBuff =(unsigned char  *)RxBuf_US1;
		US1_RxLen =0;
		US1_Printf(">Erase whole Flash?(y/n):\r\n\r\n");
	
    	while(US1_RxLen==0);
       
   		if(US1_RxBuff[0]== 'y')
		{
	   		US1_Printf("Erase flash Start!\r\n\r\n");
	   		Erase_Entire_Chip();//整片擦除
	   		US1_Printf("Erase flash Compeletly!\r\n\r\n");
		}
	
		else if(US1_RxBuff[0]== 'n')
		{   
	   		US1_Printf("Error:Flash Erase fail! ");
	   		US1_Printf("Program Abort!     \r\n");
	   		return 0;
    	}
	    	///////////////////////////烧写FLASH
	    US1_Printf("==== Phase3: Burn Flash ====\r\n\r\n");
		US1_RxLen =0;
		US1_RxBuff =(unsigned char  *)RxBuf_Bin;
		
		US1_Printf(">Send Bin File:\r\n\r\n");
	    Sleep(10000);
	    
	    TC0_COUNT = 0;
	    AT91F_InitTC0();
	    
	    while(TC0_COUNT!=3);//等直到TC0_COUNT等于3
	    
	    //////// 
	    US1_Printf("Receive Bin File Compeletly!  Size: "); 
	    
	    m=US1_RxLen;
	    n=m/100000;
	    rec=n+48;
	    if(rec!=0)
	    {
	     while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	     AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    }
	    
	    m=m-n*100000;
	    n=m/10000;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    
	    m=m-n*10000;
	    n=m/1000;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	   
	    m=m-n*1000;
	    n=m/100;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec); 
	    
	    m=m-n*100;
	    n=m/10;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	     
	    m=m-n*10;
	    n=m;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));  
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    US1_Printf("  bytes\r\n\r\n");
	    //////// 
	    US1_Printf("Start Burn whole Flash!\r\n\r\n");
	    Burn_whole_Chip((US1_RxLen)/2-1);
	    
	     ///////////////////////////校验FLASH
	   
	    i = Verify_whole_chip((US1_RxLen)/2-1);
	     
	     if(i ==0)
	     {
	     	US1_Printf("Error:whole Flash Verify fail! ");
		 	US1_Printf("Program Abort!     \r\n");
		 	return 0;
	     }
	  	 else
	  	 	US1_Printf("Burn whole Flash successfully!\r\n\r\n");
	}
	else if(US1_RxBuff[0] == '2')
    {
    	US1_RxBuff =(unsigned char  *)RxBuf_US1;
		US1_RxLen =0;
		US1_Printf(">Erase which sector flash? SST_39LF/VF400A,xxx=(1-128)\r\n\r\n");
    	US1_Printf(">Erase which sector flash? SST_39LF/VF800A,xxx=(1-256)\r\n\r\n");
    	US1_Printf(">Erase which sector flash? SST_39LF/VF160A/1601,xxx=(1-512)\r\n\r\n");
    	US1_Printf("xxx=\r\n\r\n");
    	
    	while(US1_RxLen<3);
    	i=US1_RxBuff[0];//百位
    	i=i-48;
    	j=US1_RxBuff[1];//十位
    	j=j-48;
    	k=US1_RxBuff[2];//个位
    	k=k-48;
    	number=i*100+j*10+k;//实际数字值    	
    	SHIFT_SECTOR_ADDR=0x800*(number-1);//檫除块偏移地址,从A11~A17或
    	
    	US1_RxBuff =(unsigned char  *)RxBuf_US1;
		US1_RxLen =0;
		US1_Printf(">Erase sector Flash?(y/n):\r\n\r\n");
	
    	while(US1_RxLen==0);       
   		if(US1_RxBuff[0]== 'y')
		{
	   		US1_Printf("Erase sector flash Start!\r\n\r\n");
	   		Erase_One_Sector();//扇区擦除
	   		US1_Printf("Erase sector flash Compeletly!\r\n\r\n");
		}
		else if(US1_RxBuff[0]== 'n')
		{   
	   		US1_Printf("Error:sector Flash Erase fail! ");
	   		US1_Printf("Program Abort!     \r\n");
	   		return 0;
    	}
    	///////////////////////////烧写FLASH
	    US1_Printf("==== Phase3: Burn Flash ====\r\n\r\n");
		US1_RxLen =0;
		US1_RxBuff =(unsigned char  *)RxBuf_Bin;
		
		US1_Printf(">Send Bin File:\r\n\r\n");
	    Sleep(1000);
	    
	    TC0_COUNT = 0;
	    AT91F_InitTC0();
	    
	    while(TC0_COUNT!=3);//等直到TC0_COUNT等于3
	    
	    //////// 
	    US1_Printf("Receive Bin File Compeletly!  Size: "); 
	    
	    m=US1_RxLen;
	    n=m/100000;
	    rec=n+48;
	    if(rec!=0)
	    {
	     while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	     AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    }
	    
	    m=m-n*100000;
	    n=m/10000;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    
	    m=m-n*10000;
	    n=m/1000;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	   
	    m=m-n*1000;
	    n=m/100;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec); 
	    
	    m=m-n*100;
	    n=m/10;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	     
	    m=m-n*10;
	    n=m;
	    rec=n+48;
	    while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_US1));  
	    AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_US1,rec);
	    US1_Printf("  bytes\r\n\r\n");
	    //////// 
	    US1_Printf("Start Burn sector Flash!\r\n\r\n");
	    Burn_One_Sector((US1_RxLen)/2-1);
	    
	     ///////////////////////////校验FLASH
	   
	    i = Verify_One_Sector((US1_RxLen)/2-1);
	     
	    if(i == 0)
	    {
	    	US1_Printf("Error:Flash Verify fail! ");
			US1_Printf("Program Abort!     \r\n");
			return 0;
	    }
	  	else
	    	US1_Printf("Burn sector Flash successfully!\r\n\r\n");
    	
    	
    	
    } 
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -