📄 romprg.c
字号:
#include "option.h"
#include "44b.h"
#include "romdef.h"
#include "def.h"
#include "stdio.h"
#include "stdlib.h"
#define LED_PORTC10 (1<<10)
#define LED_PORTC11 (1<<11)
#define _WR(ulADDR,usDATA) *((INT16U *)(ulADDR<<1))=(INT16U)usDATA //the addr should be shifted
#define _RD(ulADDR) (*((INT16U *)(ulADDR<<1)))
#define _RESET() _WR(0x0,0xf0f0)
//#define BADDR2WADDR(ulADDR) (ulADDR>>1)
void LedDisp(int LedStatus);
void PortInit(void);
INT8U SST39VF160_ChipProg(INT32U ulRomAddr, INT32U ulRamAddr, INT32U ulRomSize);
//*****************************************
// ARM烧写主程序
//*****************************************
void Main(void)
{
rSYSCFG=CACHECFG;
PortInit();
SST39VF160_ChipProg(0x0,0x0c200000,RomSize);
LedDisp(0x03);
while(1);
}
//*****************************************
// 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
}
//*****************************************
// 检验SST39VF160指定地址的内容
//*****************************************
INT8U CheckBlank(INT32U ulRomAddr,INT32U ulRomSize)
{
INT32U i;
for (i=ulRomAddr;i<(ulRomAddr+ulRomSize);i+=4)
{
if(*((volatile INT32U *)i)!=0xffffffff)
return 0;
}
return 1; //every cell is 0xffffffff
}
//*****************************************
// 验证SST39VF160 和SDRAM 指定地址的内容
//*****************************************
INT8U Verify(INT32U ulRomAddr,INT32U ulRamAddr,INT32U ulRomSize)
{
INT32U i;
for (i=0x0;i<ulRomSize;i+=4)
{
if(*((volatile INT32U *)(i+ulRomAddr))!=*((volatile INT32U *)(i+ulRamAddr)))
return 0; //the data is ROM and RAM is different!
}
return 1;
}
//*****************************************
// 等待BIT6 toggle
//*****************************************
INT8U _WAIT(void) //Check if the bit6 toggle ends.
{
volatile INT16U flashStatus,old;
old=*((volatile INT16U *)0x0);
while(1)
{
flashStatus=*((volatile INT16U *)0x0);
if( (old&0x1000) == (flashStatus&0x1000) )
break;
old=flashStatus;
}
return 1;
}
//*****************************************
// 获取SST39VF160 版本号
//*****************************************
INT32U SST39VF160_CheckId(void)
{
INT16U usManId,usDevId;
_RESET();
_WR(SeqAddr1,SeqCom1);
_WR(SeqAddr2,SeqCom2);
_WR(SeqAddr1,SoftIdEntry);
usManId=_RD(ManuIdAddr);
usDevId=_RD(DevIdAddr);
_RESET();
return ((usManId<<16)+usDevId);
}
//*****************************************
// 向SST39VF160 指定地址写数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -