📄 main.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 + -