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