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

📄 bootloader.c

📁 c8051f310xmodembootloader.rar
💻 C
字号:
/******************************************************************************
** copyright(c) skee ltd,.co. 1996-2009
** c8051f310  256+1024 bytes ram    osc:24.5M
** iap (0x0000-0x1000) ap(0x1000-0x3dff) reserved(0x3e00-0x3fff)
** Last Modify 2009-12-07
** by jerkoh   ver1.0
** XModem 
******************************************************************************/
#include <c8051f310.h>                
#include <intrins.h>
#include <string.h>
#include <stdio.h>
#include "bootloader.h"
#include "flash.h"
#include "xmodem.h"

unsigned char xdata buf[128];

/******************************************************************************
** MAIN Routine
******************************************************************************/

void main (void)
{ 
   int st, page;
   PCA0MD &= ~0x40;                              // Disable Watchdog timer
   PORT_Init();                                  // Initialize Port I/O
   SYSCLK_Init ();   							 // 内部晶振初始化
   UART0_Init();                                 // 串口0初始化
   delayms(1);
   LEDR=1;
   BELL=0;
   DI=1;
   RE=0;


   if((FLASH_PageRead(0x1000)==FLASH_PageRead(0x0e00))&&
      (FLASH_PageRead(0x1001)==FLASH_PageRead(0x0e01))&&
	   (FLASH_PageRead(0x1002)==FLASH_PageRead(0x0e02))&&
	   (EN_IAP!=0))
   {   
       ((void(code *)(void))BL2AP)();            //简单比较前3字节
   }
   else
   {
      for(page=0x1000;page<(0x3c00);page++ )
      {
        FLASH_PageErase(page);
	    page+=511;
      }	 
   }
   	   
      while(1)
      { 
  
	     LEDR=0;
	     LEDG=1;
  	     while(1)
	     {
		   st=xmodem_rx();
		   if(st==1)
		   {
	        break;
		   }
         }	    
	     LEDR=1;
	     LEDG=0;

	    //提取0x1000开始32字节特征值	写入固定地址0x0e00 用于启动对比
	     FLASH_PageErase(0x0e00);
	     for(st=0;st<32;st++)
	     {
	        FLASH_ByteWrite (0xe00+st, FLASH_PageRead(0x1000+st));
	     }




  	   									                             
          ((void(code *)(void))BL2AP)(); 
   }


}
/******************************************************************************
** 函数: PORT_Init ()
** 入参: 
** 返回: 
** 说明: 配置交叉开关uart0 其他无关
** PORT_Init
** Configure the Crossbar and GPIO ports.
** P0.4 - UART TX
** P0.5 - UART RX
******************************************************************************/
void PORT_Init (void)
{  
   P0SKIP    = 0xcf;		 //it's null			        
   P1SKIP    = 0x03;		 //it's null		  	         
   XBR0      = 0x01;         //使能 UART on P0.4(TX) and P0.5                                         
   XBR1      = 0x42;		 //it's null
   P0MDOUT   = 0x1C;         //使能 UTX 为推挽输出  p0.2 p0.3                      
   P3MDOUT  |= 0x06;		 //it's null		   	         
}
/******************************************************************************
** 函数: SYSCLK_Init ()
** 入参: 
** 返回: 
** 说明:
** SYSCLK_Init
** This routine initializes the system clock to use the internal oscillator
** at its maximum frequency.
** Also enables the Missing Clock Detector.
******************************************************************************/
void SYSCLK_Init (void)
{
   OSCICN |= 0x03;                 // Configure internal oscillator for
                                   // its maximum frequency
   RSTSRC = 0x04;                  // Enable missing clock detector
     								     
}

/******************************************************************************
**函数功能:延时ms
**入参:	uint x
**返回值:	无
**作者:	jerkoh
**日期:	2009-03-16
**说明:	无
******************************************************************************/ 
void delayms (unsigned int x)
{
   unsigned int  j;
   while(x--)
   { 	
       for(j=0;j<1500;j++){;}
   }
}

/******************************************************************************
** 函数: UART0_Init()
** 入参: SYSCLK/BAUDRATE
** 返回: null
** 说明: null
** UART0_Init
** Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.
******************************************************************************/
void UART0_Init (void)
{
   SCON0 = 0x50;                       // SCON0: 8-bit variable bit rate
                                       // level of STOP bit is ignored
                                       // RX enabled
                                       // ninth bits are zeros
                                       // clear RI0 and TI0 bits
   if (SYSCLK/BAUDRATE/2/256 < 1) 
   {
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   } 
   else if (SYSCLK/BAUDRATE/2/256 < 4) 
   {
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01                  
      CKCON |=  0x09;
   } 
   else if (SYSCLK/BAUDRATE/2/256 < 12) 
   {
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   } 
   else 
   {
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   }

   TL1 = TH1;                          // init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;                       
   TR1 = 1;                            // START Timer1
   EA=1;							   // 禁止中断
   ES0=0;							   // 禁止串口0中断
   TI0=1;
   
 
}

/***********************(C) COPYRIGHT 2009 SKsystem***************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -