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

📄 main.c

📁 程序下载在M16中后
💻 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 + -