📄 romprg.c
字号:
#include "option.h"
#include "44b.h"
#include "def.h"
//#include "romdef.h"
//#include "stdio.h"
//#include "stdlib.h"
#define FLASH_START_ADDR 0X0000
#define FLASH_ADDR_UNLOCK1 0X5555
#define FLASH_ADDR_UNLOCK2 0X2AAA
#define FLASH_DATA_UNLOCK1 0XAAAA
#define FLASH_DATA_UNLOCK2 0X5555
#define FLASH_DATA_WRITE 0XA0A0
#define FLASH_ERASE 0X8080
#define FLASH_ERASE_SECTOR 0X3030
#define FLASH_ERASE_BLOCK 0X5050
#define FLASH_ERASE_CHIP 0X1010
#define FLASH_SID_QUERY 0X9090
#define FLASH_CFI_QUERY 0X9898
#define FLASH_SID_EXIT 0XF0F0
#define FLASH_OP_TIMEOUT 0Xffff
#define LED_PORTC10 (1<<10)
#define LED_PORTC11 (1<<11)
#define RAM_ADDR 0xc000000
void (*Run)(void) = (void (*)(void))RAM_ADDR;
void infoFlash(void);
int wait_flash_ready ( INT16U *address, INT16U data );
int writeFlash(INT16U *Address,INT16U Data);
int eraseSector(INT16U* SectorAddr);
int eraseChip(void);
void PortInit(void);
void LedDisp(int LedStatus);
//*****************************************
// ARM引导程序
//*****************************************
void Main(void)
{ INT32U k ;
INT16U *pdist,*psrc;
rSYSCFG=CACHECFG;
PortInit();
//CopyFromFlashToRam((INT32U*)0x10000, (INT32U*)0xc000000, 0x1F0000);
//Run(); //程序由内存引导运行
//while(1);
//edit by winglion,try led control
//infoFlash();
eraseChip();
psrc=(INT16U *)0xc300000;
//for(k=1;k<0x8001;k++)
// *ptr++=k;
for(k=0;k<0x4000;k++)
*psrc++=0x0; //clear ram
psrc=(INT16U *)0xc300000;
pdist=(INT16U *)0x0;
for(k=0;k<0x4000;k++) //write 8 k ram to flash
writeFlash(pdist++,*psrc++);
//eraseSector(0x0000);
while(1)
{
LedDisp(0);
for(k=0;k<(200*1024);k++);
LedDisp(2);
for(k=0;k<(200*1024);k++);//light one led afte finish
}
}
//*****************************************
// ARM端口初始化
//*****************************************
void PortInit(void)
{
//PORTC GROUP
//LED2->PC11 LED1->PC10
/* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 */
/* INPUT INTPUT RXD1 TXD1 OUTPUT OUTPUT OUTPUT OUTPUT VD4 VD5 VD6 VD7 OUTPUT OUTPUT OUTPUT INPUT */
/* 00 00 11 11 01 01 01 01 11 11 11 11 01 01 01 00 */
rPDATC = 0xffff; //All IO is high
rPCONC = 0x0f55ff54;
rPUPC = 0x3000; //PULL UP RESISTOR should be enabled to I/O
}
//*****************************************
// 发光二极管显示程序
//*****************************************
void LedDisp(int LedStatus)
{
if((LedStatus&0x01)==0x01)
rPDATC &= (~LED_PORTC10); //LED ON
else
rPDATC |= LED_PORTC10; //LED OFF
if((LedStatus&0x02)==0x02)
rPDATC &=(~LED_PORTC11); //LED ON
else
rPDATC |=LED_PORTC11; //LED OFF
}
//*****************************************
// 查FLASH信息
//*****************************************
void infoFlash()
{
int i,j;
INT16U *pFlash;
*((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_SID_QUERY;
for(i=0;i<(2*1024);i++);//WAIT SOME 150 NS
pFlash=FLASH_START_ADDR;
i=0;j=0;
i=(INT16U)*pFlash++;
j=(INT16U)*pFlash;
//exit soft id query mode
*((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_CFI_QUERY;
pFlash=(INT16U *)(FLASH_START_ADDR+(0X2F));
// i=(INT16U)*pFlash++;
*((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
}
//*****************************************
// 擦除整个flash
//*****************************************
int eraseChip()
{
*((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE_CHIP;
if( wait_flash_ready((INT16U *)FLASH_START_ADDR,0xffff) )
return 1;
else return 0;
}
//*****************************************
// erase one sector
//*****************************************
int eraseSector(INT16U* SectorAddr)
{
*((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_ERASE;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*SectorAddr=FLASH_ERASE_SECTOR;
if(wait_flash_ready(SectorAddr,0xffff))
return 1;
else return 0;
}
//*****************************************
// 写falsh
//*****************************************
int writeFlash(INT16U *Address,INT16U Data)
{ *((volatile INT16U *)FLASH_START_ADDR)=FLASH_SID_EXIT;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_UNLOCK1;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK2)=FLASH_DATA_UNLOCK2;
*((volatile INT16U *)FLASH_START_ADDR+FLASH_ADDR_UNLOCK1)=FLASH_DATA_WRITE;
*Address=Data;
if(wait_flash_ready(Address,Data))
return 1;
else return 0;
}
//*****************************************
// wait for operation finish
//*****************************************
int wait_flash_ready ( INT16U *address, INT16U data )
{
static INT32U tmp;
volatile INT16U *p;
tmp =0xfff;
p=address;
while(((*p)&0x8080)!=(data&0x8080))
{tmp--;
if (tmp==0x0)
return 1; // timeout
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -