📄 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 0X10000
#define LED_PORTC10 (1<<10)
#define LED_PORTC11 (1<<11)
#define RAM_ADDR 0xc000000
void (*Run)(void) = (void (*)(void))RAM_ADDR;
void PortInit(void);
void LedDisp(int LedStatus);
void CopyFromFlashToRam(INT32U* pulFlashAddr, INT32U* pulRamAddr, INT32U ulSize);
//*****************************************
// ARM引导程序
//*****************************************
void Main(void)
{ INT32U k ;
//INT16U *pdist,*psrc;
rSYSCFG=CACHECFG;
PortInit();
CopyFromFlashToRam((INT32U*)0x2000, (INT32U*)0xc000000, 0x2000);
Run(); //程序由内存引导运行
while(1)
{
LedDisp(0);
for(k=0;k<(200*1024);k++);
LedDisp(1);
for(k=0;k<(200*1024);k++); //light one led
}
}
//*****************************************
// 主程序从SST39VF160导入到SDRAM
//*****************************************
void CopyFromFlashToRam(INT32U* pulFlashAddr, INT32U* pulRamAddr, INT32U ulSize)
{
INT32U *pulSource = pulFlashAddr;
INT32U *pulDest = pulRamAddr;
INT32U i,j,k;
static int ledcount=0;
ulSize/=4;
j = ulSize / (20*1024);
for (i = 0; i < j; i++)
{
ledcount = (ledcount +1)%2;
LedDisp(ledcount + 1);
for(k=0;k<(20*1024);k++)
*pulDest++ = *pulSource++;
}
k = ulSize % (20*1024);
for(i=0;i<k;i++)
*pulDest++ = *pulSource++;
LedDisp(0x03); //program success reading from SST39VF160 to SDRAM
}
//*****************************************
// 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
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -