⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 11505.txt

📁 很好很强大
💻 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 + -