📄 main.c
字号:
/****************************************Copyright (c)**************************************************
**
** 文 件 名: main.c
** 描 述: M16_BOOTLOADER
** 版 本: V1.0
** 主 控 芯 片: M16 晶振频率:7.3728MHZ, 波特率115200
** 编 译 环 境:ICCAVR 6.31A
描 述:使用STK500_2 协议的bootloader,监控芯片 M16,数据通讯RS232
已经非常精简的使用STK500_2 协议的MEGA16的bootloader.使用
ATMEL AVRStudio 4.xx STK500工具的进行软件升级。
**********************************************************************************************************/
#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:主函数
**********************************************************************/
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:数据包的处理过程
**********************************************************************/
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: //目标电压
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 = 0x735F;
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) //将数据填入Flash缓冲页中
{
temp16=msg_buffer[i+11];
temp16<<=8;
temp16+=msg_buffer[i+10];
boot_page_fill(i,temp16);
}
boot_page_ew(address,0x05); //将缓冲页数据写入一个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;
}
//传送缓冲区数据
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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -