?? main.c
字號:
/****************************************Copyright (c)**************************************************
**
** 小松工程出品 ilan2003@163.com 2006-1-30
**
** 文 件 名: main.c
** 描 述: M16_BOOTLOADER
** 版 本: V1.0
** 主 控 芯 片: M16 晶振頻率:7.3728MHZ, 波特率115200
** 編 譯 環(huán) 境:ICCAVR 6.31A
描 述:使用STK500_2 協(xié)議的bootloader,監(jiān)控芯片 M16,數(shù)據(jù)通訊RS232
已經(jīng)非常精簡的使用STK500_2 協(xié)議的MEGA16的bootloader.使用
ATMEL AVRStudio 4.xx STK500工具的進(jìn)行軟件升級。
本軟件適合于個(gè)人學(xué)習(xí),用于商業(yè)用途建議加加密措施
注意事項(xiàng):在升級firmware后,進(jìn)行verify,總是出錯(cuò),這是正常現(xiàn)象
因?yàn)樯壍膄irmware文件不含bootloader程序,而verify時(shí)將讀取整片
flash的內(nèi)容,所以總是校驗(yàn)出錯(cuò)。如果你不放心,讀取flash的內(nèi)容和
你燒寫的firmware對比一下,看看哪里不一致就是了。
大家看看有沒有什么寫的不好的地方,請?zhí)岢鰧氋F的意見!
**********************************************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include <string.h>
#include "define.h"
#include "function.h"
#include "command.h"
#include "para.h"
/**********************************************************************
functionName:void main(void)
description:主函數(shù)
**********************************************************************/
void main(void)
{
uint08 rec_data;
static uint16 msgCounter;
allInit();
while(1)
{
rec_data=getChar();
if(statusMachine == ST_START)
{
flag = 1;
TCCR1B = 0x00;
if(rec_data==MESSAGE_START)
{
statusMachine = ST_GET_SEQ_NUM;
checkSum = MESSAGE_START;
}
}
else if(statusMachine == ST_GET_SEQ_NUM)
{
seqNumber = rec_data;
checkSum ^= rec_data;
statusMachine = ST_MSG_SIZE_1;
}
else if(statusMachine == ST_MSG_SIZE_1)
{
msgSize = rec_data;
msgSize <<=8;
checkSum ^= rec_data;
statusMachine = ST_MSG_SIZE_2;
}
else if(statusMachine == ST_MSG_SIZE_2)
{
msgSize |= rec_data;
checkSum ^= rec_data;
statusMachine = ST_GET_TOKEN;
}
else if(statusMachine == ST_GET_TOKEN)
{
if(rec_data==TOKEN)
{
checkSum ^= rec_data;
statusMachine = ST_GET_DATA;
msgCounter=0;
}
else
{
statusMachine = ST_START;
}
}
else if(statusMachine == ST_GET_DATA)
{
msg_buffer[msgCounter++]=rec_data;
checkSum ^= rec_data;
if(msgCounter==msgSize)
{
statusMachine = ST_GET_CHECK;
}
}
else if(statusMachine == ST_GET_CHECK)
{
if(rec_data == checkSum)
{
packageProcess(seqNumber);
}
statusMachine = ST_START;
}
}
}
/**********************************************************************
functionName:void packageProcess(uint08 seqNum)
description:數(shù)據(jù)包的處理過程
**********************************************************************/
void packageProcess(uint08 seqNum)
{
uint08 cmd;
uint08 tmp=0;
uint16 i;
uint16 num_bytes=0;
uint32 start_address = address;
cmd = msg_buffer[0];
//命令CMD_SIGN_ON
if(cmd==CMD_SIGN_ON)
{
num_bytes = 11;
msg_buffer[0] = CMD_SIGN_ON;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = 8;
memcpy(msg_buffer+3,"STK500_2",8);
}
//命令CMD_SET_PARAMETER
else if(cmd==CMD_SET_PARAMETER)
{
num_bytes = 2;
msg_buffer[0] = CMD_SET_PARAMETER;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_GET_PARAMETER
else if(cmd==CMD_GET_PARAMETER)
{
switch(msg_buffer[1])
{
/*case PARAM_BUILD_NUMBER_LOW:
tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
break;
case PARAM_BUILD_NUMBER_HIGH:
tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
break;
case PARAM_HW_VER:
tmp = CONFIG_PARAM_HW_VER;
break;
case PARAM_SW_MAJOR:
tmp = CONFIG_PARAM_SW_MAJOR;
break;*/
case PARAM_SW_MINOR:
tmp = CONFIG_PARAM_SW_MINOR;
break;
case PARAM_RESET_POLARITY:
tmp = resetPolarity;
break;
case PARAM_VTARGET: //目標(biāo)電壓
tmp = 50;
break;
case PARAM_VADJUST:
tmp = 50; //參考電壓
break;
/*case PARAM_TOPCARD_DETECT:
tmp = TOP_CARD_STK520;
break;
case PARAM_CONTROLLER_INIT:
tmp = paramControllerInit;
break;
case PARAM_SCK_DURATION:
tmp = clockSpeed;
break;*/
default:
tmp = CONFIG_PARAM_SW_MAJOR;
break;
}
num_bytes = 3;
msg_buffer[0] = CMD_GET_PARAMETER;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = tmp;
}
//命令CMD_OSCCAL
/*else if(cmd==CMD_OSCCAL)
{
num_bytes = 2;
msg_buffer[0] = CMD_OSCCAL;
msg_buffer[1] = STATUS_CMD_OK;
}*/
//命令CMD_LOAD_ADDRESS
else if(cmd==CMD_LOAD_ADDRESS)
{
//address = ((unsigned long)msg_buffer[1])<<24;
//address |= ((unsigned long)msg_buffer[2])<<16;
address = ((unsigned long)msg_buffer[3])<<8;
address |= ((unsigned long)msg_buffer[4]);
num_bytes = 2;
msg_buffer[0] = CMD_LOAD_ADDRESS;
msg_buffer[1] = STATUS_CMD_OK;
}
//CMD_CHIP_ERASE_ISP
else if(cmd==CMD_CHIP_ERASE_ISP)
{
num_bytes = 2;
msg_buffer[0] = CMD_CHIP_ERASE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_ENTER_PROGMODE_ISP
else if(cmd == CMD_ENTER_PROGMODE_ISP)
{
num_bytes = 2;
msg_buffer[0] = CMD_ENTER_PROGMODE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令 CMD_LEAVE_PROGMODE_ISP
else if(cmd==CMD_LEAVE_PROGMODE_ISP)
{
num_bytes = 2;
msg_buffer[0] = CMD_LEAVE_PROGMODE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
flag = 0;
TCNT1 = 0x2d11;
TCCR1B = 0x05;
}
//命令CMD_PROGRAM_FLASH_ISP
else if(cmd==CMD_PROGRAM_FLASH_ISP)
{
uint16 temp16;
boot_page_ew(address,0x03); //擦除頁
wait_page_rw_ok(); //等待擦除完成
for(i=0;i<(SPM_PAGESIZE<<1);i+=2) //將數(shù)據(jù)填入Flash緩沖頁中
{
temp16=msg_buffer[i+11];
temp16<<=8;
temp16+=msg_buffer[i+10];
boot_page_fill(i,temp16);
}
boot_page_ew(address,0x05); //將緩沖頁數(shù)據(jù)寫入一個(gè)Flash頁
wait_page_rw_ok(); //等待寫入完成
address+=(SPM_PAGESIZE<<1);
num_bytes = 2;
msg_buffer[0] = CMD_PROGRAM_FLASH_ISP;
msg_buffer[1] = STATUS_CMD_OK;
}
//命令CMD_READ_FLASH_ISP
else if(cmd==CMD_READ_FLASH_ISP)
{
for(i=0;i<(SPM_PAGESIZE<<2);i++)
{
msg_buffer[i+2] = read_program_memory (address+i,0x00);
}
address+=SPM_PAGESIZE<<2;
num_bytes = (SPM_PAGESIZE<<2)+3;
msg_buffer[0] = CMD_READ_FLASH_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[(SPM_PAGESIZE<<2)+2] = STATUS_CMD_OK;
}
//命令CMD_READ_FUSE_ISP
else if(cmd==CMD_READ_FUSE_ISP)
{
switch(msg_buffer[2])
{
case 0x50:
msg_buffer[2] = read_program_memory(0x0000,1); //讀熔絲位
break;
case 0x58:
msg_buffer[2] = read_program_memory(0x0003,1); //讀高熔絲位
break;
default:
break;
}
num_bytes = 4;
msg_buffer[0] = CMD_READ_FUSE_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//命令CMD_PROGRAM_LOCK_ISP
else if(cmd==CMD_PROGRAM_LOCK_ISP)
{
write_lock_bits (msg_buffer[4]|0xC0);
num_bytes = 3;
msg_buffer[0] = CMD_PROGRAM_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[2] = STATUS_CMD_OK;
}
//命令CMD_READ_LOCK_ISP
else if(cmd==CMD_READ_LOCK_ISP)
{
msg_buffer[2] = read_program_memory(0x0001,1);
num_bytes = 4;
msg_buffer[0] = CMD_READ_LOCK_ISP;
msg_buffer[1] = STATUS_CMD_OK;
msg_buffer[3] = STATUS_CMD_OK;
}
//傳送緩沖區(qū)數(shù)據(jù)
if(num_bytes>0)
{
putChar(MESSAGE_START);
checkSum=MESSAGE_START;
putChar(seqNum);
checkSum^=seqNum;
tmp=(num_bytes&0xFF00)>>8;
putChar(tmp);
checkSum^=tmp;
tmp=num_bytes&0x00FF;
putChar(tmp);
checkSum^=tmp;
putChar(TOKEN);
checkSum^=TOKEN;
for(i=0;i<num_bytes;i++)
{
putChar(msg_buffer[i]);
checkSum^=msg_buffer[i];
}
putChar(checkSum);
checkSum=0x00;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -