📄 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 + -