📄 main.c
字号:
#include "..\inc\44b.h"
#include "..\44blibs\catch.h"
#include "..\44blibs\io_port.h"
#include "..\44blibs\sst39vf160.h"
#include "..\44blibs\intserve.h"
#include "..\44blibs\lcd.h"
#include "..\44blibs\sysloader.h"
#include "..\44blibs\iic.h"
void __LoadSYS();
void (*__SYS)(void);
unsigned int __SYS_WAIT_Count = 0;
unsigned int __SYS_WAIT_COM;
unsigned int __T_BAS = 0;
unsigned int __SYS_T_BAS = 0;
unsigned int __SYS_LED = 0;
//========================
void Com_Proc();
unsigned int C_sum(unsigned char *pBuf,unsigned int PL);
unsigned int COM_MARK = 0;
unsigned int COM_TIME = 0;
//========================
void __irq Uart1_TxInt();
void __irq Uart1_RxInt();
unsigned char TX_BUF[256];
unsigned int TXP = 0;
unsigned int TXLEN = 0;
unsigned int isTXing = 0;
void TX(char *pBuf,unsigned int TL);
//========================
unsigned int DC[240][320/32];
int Main(int argc, char **argv)
{
unsigned int p,q;
/*初始化Cache*/
Cache_Init();
/*初始化IO*/
IO_PortInit();
IO_PortSetLed(LEDOFF);
/*初始化IIC*/
Iic_Init();
/*初始化串口*/
//Uart_Init(1,115200);
rULCON1 = 0x03;
rUCON1 = 0x02C5;
rUFCON1 = 0x17;
rUMCON1 = 0x00;
rUBRDIV1 = (int)( 66000000/(115200*16) + 0.5 ) - 1;
/* ====================================== */
IntServe_Reg((unsigned int)ISR_UTXD1,(unsigned int)Uart1_TxInt);
IntServe_Reg((unsigned int)ISR_URXD1,(unsigned int)Uart1_RxInt);
rINTMSK = ~( (~rINTMSK) | BIT_URXD1 );
/*初始化LCD 单色320*240*/
Lcd_Init(&DC);
/*打开中断*/
rINTCON = 0x01;
rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );
/*系统开始*/
TX("COM2: BOOT!",11);
//===============
Sst_Start();
__SYS = (void(*)())0x0c002000;
__SYS_WAIT_COM = 1;
//__SYS_WAIT_COM = 0;
while(1)
{
//===================
if( __SYS_WAIT_COM ) __SYS_WAIT_Count++;
if(__SYS_WAIT_Count > 0x2000)
{
Sst_End();
IO_PortSetLed(LEDOFF);
__LoadSYS();
(*__SYS)();
}else
{
//===================
__T_BAS++;
if( __T_BAS > 0x1500 )
{
__T_BAS = 0;
__SYS_T_BAS++;
__SYS_LED++;
//==========
if( COM_MARK )
{
COM_TIME++;
}
}
//===================
if( __SYS_LED > 3 && !__SYS_WAIT_COM )
{
IO_PortSetLed(LEDON);
}
if( __SYS_LED > 6 && !__SYS_WAIT_COM )
{
IO_PortSetLed(LEDOFF);
__SYS_LED = 0;
}
Com_Proc();
}
}
return 0;
}
//=====================
//
//=====================
unsigned char RX_BUF[1024];
unsigned short W_BUF[256];
unsigned int RX_COUNT = 0;
unsigned int RX_PLEN = 0;
unsigned int RX_HP = 0;
unsigned int SA,EA;
unsigned char *pStr;
void Com_Proc()
{
unsigned int i,Len,ret;
unsigned char IPBuf[8],Buf,Mark;
//check data
if( RX_HP )
{
if( C_sum(RX_BUF,RX_PLEN) )
{
//联机
if( RX_BUF[4] == 'L' && RX_BUF[5] == 'L' )
{
__SYS_WAIT_COM = 0;
TX( "Y",1);
__SYS_WAIT_Count = 0;
/*初始化字库*/
Sysloader_LoadFont0816(); // 8*16 ASCII 字库
Sysloader_LoadFont1616(); //16*16 国标字库
/*初始化LCD 单色320*240*/
Lcd_Init(&DC);
Lcd_printf(&DC,"联机成功。\n");
}
//擦除 Flash
if( RX_BUF[4] == 'E' && RX_BUF[5] == 'E' )
{
pStr = (unsigned char*)&SA;
pStr[0] = RX_BUF[6];
pStr[1] = RX_BUF[7];
pStr[2] = RX_BUF[8];
pStr[3] = RX_BUF[9];
pStr = (unsigned char*)&EA;
pStr[0] = RX_BUF[10];
pStr[1] = RX_BUF[11];
pStr[2] = RX_BUF[12];
pStr[3] = RX_BUF[13];
Lcd_printf(&DC,"擦除中。。。。。\n");
rINTMSK = rINTMSK | BIT_GLOBAL ;
ret = Sst_Erase( SA, EA);
rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );
if( ret)
{
TX( "Y" , 1);
Lcd_printf(&DC,"擦除成功。\n");
}else
{
Lcd_printf(&DC,"擦除失败。\n");
}
}
//编程
if( RX_BUF[4] == 'P' && RX_BUF[5] == 'P' )
{
pStr = (unsigned char*)&SA;
pStr[0] = RX_BUF[6];
pStr[1] = RX_BUF[7];
pStr[2] = RX_BUF[8];
pStr[3] = RX_BUF[9];
pStr = (unsigned char*)&EA;
pStr[0] = RX_BUF[10];
pStr[1] = RX_BUF[11];
pStr[2] = RX_BUF[12];
pStr[3] = RX_BUF[13];
Len = ( RX_PLEN -10 + 1)/2;
pStr = (unsigned char*)W_BUF;
for( i = 0 ; i < RX_PLEN -10 ; i++ ) pStr[i] = RX_BUF[14 + i];
rINTMSK = rINTMSK | BIT_GLOBAL ;
ret = Sst_Program(SA , W_BUF, Len);
rINTMSK = ~( (~rINTMSK) | BIT_GLOBAL );
if( ret)
{
TX( "Y" , 1);
Lcd_printf(&DC,"[%08XH]--[%08XH]编程成功。\n",SA,EA+1);
}else
{
Lcd_printf(&DC,"[%08XH]--[%08XH]编程失败。\n",SA,EA+1);
}
}
//设置IP
if( RX_BUF[4] == 'I' && RX_BUF[5] == 'S' )
{
for( i = 0 ; i < 4 ; i++ )
{
Wr24LCxx(0xA0,4+i,RX_BUF[6+i]);
}
Mark = 0;
for( i = 0 ; i < 4 ; i++ )
{
Rd24LCxx(0xA0,4+i,&Buf);
if(Buf != RX_BUF[6+i] ) Mark = 1;
}
if( !Mark )
{
TX( "Y" , 1);
Lcd_printf(&DC,"IP设置成功。\n");
}else
{
Lcd_printf(&DC,"IP设置失败。\n");
}
}
//读取IP
if( RX_BUF[4] == 'I' && RX_BUF[5] == 'R' )
{
for( i = 0 ; i < 4 ; i++ )
{
Rd24LCxx(0xA0,4+i,IPBuf + 1 + i);
}
IPBuf[0] = 'Y';
TX( (char*)IPBuf , 5);
Lcd_printf(&DC,"IP读取成功。\n");
}
//设置网卡地址
if( RX_BUF[4] == 'N' && RX_BUF[5] == 'S' )
{
for( i = 0 ; i < 3 ; i++ )
{
Wr24LCxx(0xA0,i,RX_BUF[6+i]);
}
Mark = 0;
for( i = 0 ; i < 3 ; i++ )
{
Rd24LCxx(0xA0,i,&Buf);
if(Buf != RX_BUF[6+i] ) Mark = 1;
}
if( !Mark )
{
TX( "Y" , 1);
Lcd_printf(&DC,"网卡地址设置成功。\n");
}else
{
Lcd_printf(&DC,"网卡地址设置失败。\n");
}
}
//读取网卡地址
if( RX_BUF[4] == 'N' && RX_BUF[5] == 'R' )
{
for( i = 0 ; i < 3 ; i++ )
{
Rd24LCxx(0xA0,i,IPBuf + 1 + i);
}
IPBuf[0] = 'Y';
TX( (char*)IPBuf , 4);
Lcd_printf(&DC,"网卡地址读取成功。\n");
}
}
RX_COUNT = 0;
COM_MARK = 0;
COM_TIME = 0;
RX_HP = 0;
}
//time out
if( COM_TIME > 38 )
{
RX_COUNT = 0;
COM_MARK = 0;
COM_TIME = 0;
RX_HP = 0;
}
}
//===================
void TX(char *pBuf,unsigned int TL)
{
unsigned int i;
if( TL > 256 ) TL = 256;
while( isTXing );
for( i = 0 ; i < TL ; i++ )TX_BUF[i] = pBuf[i];
TXLEN = TL;
TXP = 0;
isTXing = 1;
rINTMSK = ~( (~rINTMSK) | BIT_UTXD1 );
}
void __irq Uart1_TxInt()
{
while( !(rUFSTAT1 & 0x200) && ( TXP < TXLEN ) ) //until tx fifo full or end of string
{
rUTXH1 = TX_BUF[TXP];
TXP++;
}
rI_ISPC = BIT_UTXD1;
if( TXP >= TXLEN )
{
TXP = 0;
TXLEN = 0;
isTXing = 0;
rINTMSK = rINTMSK | BIT_UTXD1 ;
}
}
void __irq Uart1_RxInt()
{
unsigned char rd;
rI_ISPC = BIT_URXD1;
if( !RX_HP )
{
RX_BUF[RX_COUNT] = rURXH1;
if( RX_COUNT == 0 ) COM_MARK = 1;
RX_COUNT++;
}else
{
rd = rURXH1;
}
if( RX_COUNT > 1023 ) RX_COUNT = 1023;
if( RX_COUNT == 1 )
{
if( RX_BUF[0] != 0x55 ) RX_COUNT = 0;
}
if( RX_COUNT == 2 )
{
if( RX_BUF[0] != 0x55 || RX_BUF[1] != 0xAA ) RX_COUNT = 0;
}
if( RX_COUNT == 4 )
{
RX_PLEN = RX_BUF[2]*256 + RX_BUF[3];
}
if( RX_COUNT >= RX_PLEN + 6 ) RX_HP = 1;
while( (rUFSTAT1&0xf) >0 )
{
if( !RX_HP )
{
RX_BUF[RX_COUNT] = rURXH1;
if( RX_COUNT == 0 ) COM_MARK = 1;
RX_COUNT++;
}else
{
rd = rURXH1;
}
if( RX_COUNT > 1023 ) RX_COUNT = 1023;
if( RX_COUNT == 1 )
{
if( RX_BUF[0] != 0x55 ) RX_COUNT = 0;
}
if( RX_COUNT == 2 )
{
if( RX_BUF[0] != 0x55 || RX_BUF[1] != 0xAA ) RX_COUNT = 0;
}
if( RX_COUNT == 4 )
{
RX_PLEN = RX_BUF[2]*256 + RX_BUF[3];
}
if( RX_COUNT >= RX_PLEN + 6 ) RX_HP = 1;
}
}
//======================
unsigned int C_sum(unsigned char *pBuf,unsigned int PL)
{
unsigned int i,sum = 0;
for( i = 0; i < PL + 4 ; i++ )
{
sum = sum + RX_BUF[i];
}
if( RX_BUF[i] == ((sum & 0xFFFF) >> 8) && RX_BUF[i+1] == (sum & 0xFF) ) return 1;
return 0;
}
void __LoadSYS()
{
unsigned int *pLen;
unsigned int Len;
unsigned int *pS , *pD;
pLen = (unsigned int *)0xF000;
Len = (*pLen) + 16 + 0x0c002000;
pS = (unsigned int *)0x00010000;
pD = (unsigned int *)0x0c002000;
while( (unsigned int)pD < Len )
{
*pD++ = *pS++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -