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

📄 main.c

📁 该工程是自己在KEIL环境下写的关于C8051F020的Bootloader,调试成功
💻 C
字号:
/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////

#include "includes.h"

// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Reset_Sources_Init()
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;
}

void Timer_Init()
{
    CKCON     = 0x10;
    TCON      = 0x40;
    TMOD      = 0x20;
    TH1       = 0xFA;
}

void UART_Init()
{
    SCON0     = 0x50;
}

void Port_IO_Init()
{
    // P0.0  -  TX0 (UART0), Open-Drain, Digital
    // P0.1  -  RX0 (UART0), Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  Unassigned,  Open-Drain, Digital
    // P0.5  -  Unassigned,  Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    // P2.0  -  Unassigned,  Open-Drain, Digital
    // P2.1  -  Unassigned,  Open-Drain, Digital
    // P2.2  -  Unassigned,  Open-Drain, Digital
    // P2.3  -  Unassigned,  Open-Drain, Digital
    // P2.4  -  Unassigned,  Open-Drain, Digital
    // P2.5  -  Unassigned,  Open-Drain, Digital
    // P2.6  -  Unassigned,  Open-Drain, Digital
    // P2.7  -  Unassigned,  Open-Drain, Digital

    // P3.0  -  Unassigned,  Open-Drain, Digital
    // P3.1  -  Unassigned,  Open-Drain, Digital
    // P3.2  -  Unassigned,  Open-Drain, Digital
    // P3.3  -  Unassigned,  Open-Drain, Digital
    // P3.4  -  Unassigned,  Open-Drain, Digital
    // P3.5  -  Unassigned,  Open-Drain, Digital
    // P3.6  -  Unassigned,  Open-Drain, Digital
    // P3.7  -  Unassigned,  Open-Drain, Digital
	P1MDOUT = 0xff;
    XBR0      = 0x04;
    XBR2      = 0x40;
}

void Oscillator_Init()
{
    int i = 0;
    OSCXCN    = 0x67;
    for (i = 0; i < 3000; i++);  // Wait 1ms for initialization
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x0C;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
    Reset_Sources_Init();
    Timer_Init();
    UART_Init();
    Port_IO_Init();
    Oscillator_Init();
}

sbit P16 = P1^6;
UINT8 FlashPageMax = 119;
#define START        0x43 //向主机发送,请求数据发送
#define ACK          0x06 //每接收到一个程序,如果验证正确,发送ack
#define SOH          0x01 //主机发送帧头
#define EOT          0x04 // 发送结束.
#define NAK          0x15

//定义状态.

#define SendStart    0
#define RecData      1
#define SendAck      2
#define RunUsr       3
#define RecSOH       4
#define SaveData     5
#define SendNak     6
typedef union{
    UINT16 intnum;
    UINT8 charnum[2];
}UNION16;
void main()
{
    UINT8 flashErasePage=0;
    UINT8 stage;
    UINT8 tmp[2] = {0};
    UINT8 flashData[512] ={0};
    UINT8 tmpBuf[132] = {0};
    UINT8 tmpBufIndex;
    UINT16 flashDataIndex;
    UINT8 index = 0;
    UNION16 crc;
    Init_Device();
    stage = SendStart;
	while(1) {
    switch(stage){
        case SendStart://发送起始传输命令
            SBUF0 = START;
            while(TI0==0);
            TI0=0;

            //stage = SendStart;
            stage = RecSOH;
            break;
        case RecSOH:
            while(RI0==0);
            RI0=0;
            tmp[0] = SBUF0;
            if(SOH==tmp[0]){//接收到SOH起始帧头
                stage = RecData;
            }
            else if(EOT==tmp[0]){//接收到EOT结束帧头.
                stage = RunUsr;
            }
            break;
        case RecData:
             for(tmpBufIndex=0;tmpBufIndex<132;tmpBufIndex++){
                 while(RI0==0);
                 RI0=0;
                 tmpBuf[tmpBufIndex] = SBUF0;   
             }
             if(tmpBuf[0]+tmpBuf[1]==0xff){//序列号正确
                 crc.intnum = Crc16Cal(&tmpBuf[2],128);
                 if((crc.charnum[0]==tmpBuf[130])&&(crc.charnum[1]==tmpBuf[131])){
                     stage = SaveData;
                 }    
             }else{
                 stage = SendNak;
             }
        case SaveData:
           /* for(flashDataIndex;flashDataIndex+128;flashDataIndex++){
                 flashData[flashDataIndex] = tmpBuf[tmpBufIndex++];
            }
            if(flashDataIndex ==512){
                 if(flashErasePage>FlashPageMax){
                      while(1){
                          SBUF0 =0x43;//C
                          while(TI0 == 0);
                          TI0 = 0;
                      }
                 }
                 FlashErase(flashErasePage);
                 FlashWrite(flashData,flashErasePage);
                 flashDataIndex = 0;
                 flashErasePage++;
                 
                  
            } */
            stage = SendAck;
             break;
        case SendAck:
            SBUF0 = ACK;
            stage = RecSOH;
            break;
        case SendNak:
            SBUF0 = NAK;
            stage = RecSOH;
            break;
        case RunUsr:
            SBUF0 = ACK;
            while(TI0==0);
            TI0=0;
            while(1);
            break;

            
       
      }       
	}
}


⌨️ 快捷键说明

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