📄 main.c
字号:
//******************************************************
//Chinese Academy of Sciences, Institute of Automation
//File Name: main.c
//Description: Write flash,32bits model
//Author: JuGuang,Li
//Date: 2004-3-20
//******************************************************
#include "def.h"
#include "s3c2410UART.h"
#define AM_WORD_COUNT 0x00012000
#define AM_START_ADDR 0x0000000 //0x1100000
#define AM_ADDR_UNLOCK1 0x555
#define AM_ADDR_UNLOCK2 0x2aa
#define AM_DATA_UNLOCK1 0xaaaa
#define AM_DATA_UNLOCK2 0x5555
#define AM_SETUP_WRITE 0xa0a0
#define AM_SETUP_ERASE 0x8080
#define AM_CHIP_ERASE 0x1010
#define AM_SECTOR_ERASE 0x3030
#define AM_RESET 0xf0f0
#define AM_SECTOR_ADDR_01 0x0000000
#define AM_SECTOR_ADDR_02 0x0004000
#define AM_SECTOR_ADDR_03 0x0006000
#define AM_SECTOR_ADDR_04 0x0008000
#define AM_SECTOR_ADDR_END 0x0800000
void Delay(unsigned int);
void InitUART(int Port,int Baudrate);
void PrintUART(int port,char *s);
void Chip_Erase(void);
//********************************************************************************
//功能简述: 首先擦除Flash,然后做整片的空白检测,最后将待烧写的内容写入Flash
//的0x0地址,待写入的内容首先下载到0x31000000处,写入文件的大小不超过AM_WORD_COUNT的
//定义。
//********************************************************************************
void Main()
{
volatile UINT16 *from_add,*to_add,*address;
int i;
GPHCON=0xaaaa;
InitUART(2,26);
PrintUART(2,"*******************************************************************************\n\r");
PrintUART(2,"* tianjin TCB Co., Ltd *\n\r");
PrintUART(2,"* *\n\r");
PrintUART(2,"* http://www.TCB.com *\n\r");
PrintUART(2,"* *\n\r");
PrintUART(2,"* Tel: (86-022) 26237593 26237534 *\n\r");
PrintUART(2,"*******************************************************************************\n\r");
PrintUART(2,"Flash Erase,Please Wait...\r\n");
Chip_Erase();
Delay(100);
PrintUART(2,"Blank Check...");
CHKB1:
Delay(10);
for(address=(volatile UINT16 *)AM_SECTOR_ADDR_01;address<(volatile UINT16 *)AM_SECTOR_ADDR_END;address++)
{
if(*address!=0xffff)
{PrintUART(2,".");
goto CHKB1;}
}
PrintUART(2,",OK!\r\n\r\n\r\n");
PrintUART(2,"Program to Flash,Please wait...\r\n");
to_add= (UINT16 *)0x0;
from_add=(UINT16 *)0x31000000;
//写Flash,并检测是否写完
for(i=0;i<AM_WORD_COUNT;i++)
//写Flash
{*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;
*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
*((volatile UINT16 *)AM_START_ADDR + AM_ADDR_UNLOCK1) = AM_SETUP_WRITE;
*to_add =*from_add ;
//检测是否写完
while(1)
{
if(((*to_add)&0x80)==((*from_add)&0x80))
break;
}
*to_add++;
*from_add++;
PrintUART(2,".");
}
PrintUART(2,"\r\n\r\nFlash Programe Sucessfully,Please reset system!!!\n\r");
}
void PrintUART(int Port,char *s)
{
if(Port==0)
for(;*s!='\0';s++)
{for(;(!(UTRSTAT0&0x4)););
UTXH0=*s;}
if(Port==1)
for(;*s!='\0';s++)
{for(;(!(UTRSTAT1&0x4)););
UTXH1=*s;}
if(Port==2)
for(;*s!='\0';s++)
{for(;(!(UTRSTAT2&0x4)););
UTXH2=*s;}
}
void InitUART(int Port,int Baudrate)
{
if(Port==0)
{ULCON0=0x03;
UCON0=0x09;
UBRDIV0=Baudrate;
}
if(Port==1)
{ULCON1=0x03;
UCON1=0x09;
UBRDIV1=Baudrate;
}
if(Port==2)
{ULCON2=0x03;
UCON2=0x09;
UBRDIV2=Baudrate;
}
}
//******************************************************************************
//功能简述: 发送整片Flash擦除命令。
//******************************************************************************
void Chip_Erase()
{
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_SETUP_ERASE;
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_DATA_UNLOCK1;
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK2) = AM_DATA_UNLOCK2;
*((volatile UINT16 *)AM_START_ADDR+ AM_ADDR_UNLOCK1) = AM_CHIP_ERASE;
}
void Delay(unsigned int x)
{
unsigned int i,j,k;
for(i=0;i<=x;i++)
for(j=0;j<0xff;j++)
for(k=0;k<0xff;k++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -