?? 11505.txt
字號:
附硬件接口和主從機程序:
#include <C8051F120.H>
#define SYSCLK 24500000 // Output of PLL derived from
#define BAUDRATE 9600 // Baud rate of UART in bps
void Update_Send_Char(unsigned char ch)
{
TI0=0;
SBUF0 = ch; //送入緩沖區
while(TI0 == 0); //等待發送完畢
TI0 = 0; //軟件清零
}
unsigned char Update_Get_Char(void)
{
unsigned char ch;
while(!RI0);
RI0=0;
ch=SBUF0;
return ch;
}
void Update_Send_String(unsigned char * str)
{
while(*str!='\0')
Update_Send_Char(*str++);
}
void Update_SYSCLK_Init (void)
{
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x83;
}
void Update_PORT_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = CONFIG_PAGE; // set SFR page
XBR0 = 0x04; // Enable UART0
XBR1 = 0x00;
XBR2 = 0x40; // Enable crossbar and weak pull-up
P0MDOUT |= 0x01; // Set TX0 pin to push-pull
P1MDOUT |= 0x40; // Set P1.6(LED) to push-pull
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
void Update_UART0_Init (void)
{
char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE =0x00;
SCON0 = 0x50;
SSTA0 = 0x10;
SFRPAGE = TIMER01_PAGE;
TMOD &= ~0xF0;
TMOD |= 0x20;
TH1 = -(SYSCLK/BAUDRATE/16);
CKCON |= 0x10;
TL1 = TH1;
TR1 = 1;
SFRPAGE = UART0_PAGE;
TI0 = 1;
SFRPAGE = SFRPAGE_SAVE;
}
extern void jmpmain();
void reset (void)
{
SFRPAGE=0x00;
RSTSRC=0x10;
jmpmain();
jmpmain();
}
void Del_old_Flash ( void )
{
unsigned int i;
char xdata * data address;
char SFRPAGE_SAVE = SFRPAGE; // preserve SFRPAGE
address=0x0000;
Update_Send_String("Deleting the older flash...\n");
SFRPAGE = LEGACY_PAGE;
FLSCL |= 0x01; // enable FLASH writes/erases
PSCTL |= 0x03; // PSWE = 1; PSEE = 1
if (PSCTL&0x04)
{
PSCTL |= 0x04; // set SFLE
}
while( address<0x0F800) //0xF800=62KB
{
*address = 0x00; // 向扇區空寫啟動擦除操作
for (i=0;i<10;i++);
address =address +512;
}
PSCTL &= ~0x03; // PSWE = 0; PSEE = 0
FLSCL &= ~0x01; // disable FLASH writes/erases
SFRPAGE = SFRPAGE_SAVE; // restore SFRPAGE
Update_Send_String("Deleted the older flash success!\n");
}
void Write_new_flash(void)
{
char xdata * data address=0x0000;
unsigned int data NFlen;
char SFRPAGE_SAVE = SFRPAGE; // preserve SFRPAGE
RI0=0;
Update_Send_String("Please input the new flash len(two bytes in HEX):\n");
NFlen=256*Update_Get_Char();
NFlen=NFlen+Update_Get_Char(); //接收數據的長度
Update_Send_String("Please input the new flash:\n");
SFRPAGE = LEGACY_PAGE;
FLSCL |= 0x01; // enable FLASH writes/erases
PSCTL |= 0x01; // PSWE = 1
if (PSCTL&0x04)
{
PSCTL |= 0x04; // set SFLE
}
while(NFlen--)
{
*address++=Update_Get_Char();
}
PSCTL = 00; // PSWE = 0; PSEE = 0
FLSCL =00; // disable FLASH writes/erases
SFRPAGE = SFRPAGE_SAVE; // restore SFRPAGE
}
void Update_Runing(void)
{
RSTSRC = 0x02; // enable VDDMON as reset source
Update_Send_String("Update the code running...\n");
Del_old_Flash();
Write_new_flash();
Update_Send_String("Update success,reboot now!\n");
reset();
}
void main(void)
{
WDTCN = 0xDE; // disable watchdog timer
WDTCN = 0xAD;
Update_PORT_Init();
Update_SYSCLK_Init();
Update_UART0_Init();
SFRPAGE = UART0_PAGE;
EA=0;
Update_Runing();
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -