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

📄 bldstk500.lst

📁 使用STK500_2 协议的bootloader
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    1C2F E001      LDI	R16,1
    1C30 BF05      OUT	0x35,R16
    1C31 E002      LDI	R16,2
    1C32 BF05      OUT	0x35,R16
    1C33 E5CF      LDI	R28,0x5F
    1C34 E0D4      LDI	R29,4
    1C35 BFCD      OUT	0x3D,R28
    1C36 BFDE      OUT	0x3E,R29
    1C37 51C0      SUBI	R28,0x10
    1C38 40D0      SBCI	R29,0
    1C39 EA0A      LDI	R16,0xAA
    1C3A 8308      STD	Y+0,R16
    1C3B 2400      CLR	R0
    1C3C E6EA      LDI	R30,0x6A
    1C3D E0F0      LDI	R31,0
    1C3E E011      LDI	R17,1
    1C3F 3AE3      CPI	R30,0xA3
    1C40 07F1      CPC	R31,R17
    1C41 F011      BEQ	0x1C44
    1C42 9201      ST	R0,Z+
    1C43 CFFB      RJMP	0x1C3F
    1C44 8300      STD	Z+0,R16
    1C45 E5E4      LDI	R30,0x54
    1C46 E3F8      LDI	R31,0x38
    1C47 E6A0      LDI	R26,0x60
    1C48 E0B0      LDI	R27,0
    1C49 E318      LDI	R17,0x38
    1C4A 35EE      CPI	R30,0x5E
    1C4B 07F1      CPC	R31,R17
    1C4C F021      BEQ	0x1C51
    1C4D 95C8      LPM
    1C4E 9631      ADIW	R30,1
    1C4F 920D      ST	R0,X+
    1C50 CFF9      RJMP	0x1C4A
    1C51 D056      RCALL	_main
_exit:
    1C52 CFFF      RJMP	_exit
FILE: F:\job\stk500\AVRMEG~1\bldSTK500\uart.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                               
(0003) **                                     开	发	部
(0004) **                             
(0005) ** 文   件   名: uart.c
(0006) ** 最后修改日期: 2005-7-9 20:36
(0007) ** 描        述: ATmega16L的操作函数
(0008) ** 版	     本: V1.0
(0009) ** 主  控  芯 片:M16  晶振频率:7.3728MHZ, 
(0010) **********************************************************************************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include "define.h"
(0014) #include "function.h"
(0015) #include "extern.h"
(0016) 
(0017) /**********************************************************************
(0018) functionName:putChar(uint8 sentData)
(0019) description:通过串口发送数据sentData
(0020) **********************************************************************/
(0021) void putChar(uint08 sentData)
(0022) {
(0023)  	 while(!(UCSRA&(1<<UDRE)));
_putChar:
  sentData             --> R16
    1C53 9B5D      SBIS	0x0B,5
    1C54 CFFE      RJMP	_putChar
(0024) 	 UDR=sentData;
    1C55 B90C      OUT	0x0C,R16
    1C56 9508      RET
(0025) }
(0026) 
(0027) /**********************************************************************
(0028) functionName:putChars(uint08 *sentData)
(0029) description:通过串口接受数据
(0030) **********************************************************************/
(0031) uint08 getChar(void)
(0032) {
_getChar:
    1C57 C00C      RJMP	0x1C64
(0033) 	while(!(UCSRA&BIT(RXC)))
(0034) 	{
(0035) 	 	if(!flag)
    1C58 90200060  LDS	R2,flag
    1C5A 2022      TST	R2
    1C5B F441      BNE	0x1C64
(0036) 			if(TCNT1 < 20)
    1C5C B58C      IN	R24,0x2C
    1C5D B59D      IN	R25,0x2D
    1C5E 3184      CPI	R24,0x14
    1C5F E0E0      LDI	R30,0
    1C60 079E      CPC	R25,R30
    1C61 F410      BCC	0x1C64
(0037) 			asm("jmp 0x000000\n");
    1C62 940C0000  JMP	0x0
    1C64 9B5F      SBIS	0x0B,7
    1C65 CFF2      RJMP	0x1C58
(0038) 	};
(0039) 	return(UDR);
    1C66 B10C      IN	R16,0x0C
    1C67 9508      RET
FILE: F:\job\stk500\AVRMEG~1\bldSTK500\initial.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                                
(0003) **                                     开	发	部
(0004) **                              
(0005) ** 文   件   名: initial.c
(0006) ** 最后修改日期: 2006-1-23 13:47
(0007) ** 描        述: 初始化程序
(0008) ** 版	     本: V1.0
(0009) ** 主  控  芯 片:M16  晶振频率:7.3728MHZ, 
(0010) **********************************************************************************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include "define.h"
(0014) #include "extern.h"
(0015) #include "function.h"
(0016) #include "command.h"
(0017) 
(0018) 
(0019) /**********************************************************************
(0020) functionName:void paraInit(void)
(0021) description:变量初始化
(0022) **********************************************************************/
(0023) void globalParaInit(void)
(0024) {
(0025) 	statusMachine = ST_START;
_globalParaInit:
    1C68 EF80      LDI	R24,0xF0
    1C69 93800070  STS	statusMachine,R24
(0026) 	paramControllerInit=0x00;
    1C6B 2422      CLR	R2
    1C6C 92200072  STS	paramControllerInit,R2
(0027) 	prgMode=0;
    1C6E 92200071  STS	prgMode,R2
    1C70 9508      RET
(0028) 
(0029) }
(0030) //TIMER1 initialize - prescale:1024
(0031) // WGM: 0) Normal, TOP=0xFFFF
(0032) // desired value: 15Sec
(0033) // actual value: 15.000Sec (0.0%)
(0034) void timer1_init(void)
(0035) {
(0036)  TCCR1B = 0x00; //stop
_timer1_init:
    1C71 2422      CLR	R2
    1C72 BC2E      OUT	0x2E,R2
(0037)  TCNT1H = 0x2D; //setup
    1C73 E28D      LDI	R24,0x2D
    1C74 BD8D      OUT	0x2D,R24
(0038)  TCNT1L = 0x11;
    1C75 E181      LDI	R24,0x11
    1C76 BD8C      OUT	0x2C,R24
(0039)  OCR1AH = 0xD2;
    1C77 ED82      LDI	R24,0xD2
    1C78 BD8B      OUT	0x2B,R24
(0040)  OCR1AL = 0xEF;
    1C79 EE8F      LDI	R24,0xEF
    1C7A BD8A      OUT	0x2A,R24
(0041)  OCR1BH = 0xD2;
    1C7B ED82      LDI	R24,0xD2
    1C7C BD89      OUT	0x29,R24
(0042)  OCR1BL = 0xEF;
    1C7D EE8F      LDI	R24,0xEF
    1C7E BD88      OUT	0x28,R24
(0043)  ICR1H  = 0xD2;
    1C7F ED82      LDI	R24,0xD2
    1C80 BD87      OUT	0x27,R24
(0044)  ICR1L  = 0xEF;
    1C81 EE8F      LDI	R24,0xEF
    1C82 BD86      OUT	0x26,R24
(0045)  TCCR1A = 0x00;
    1C83 BC2F      OUT	0x2F,R2
(0046)  TCCR1B = 0x05; //start Timer
    1C84 E085      LDI	R24,5
    1C85 BD8E      OUT	0x2E,R24
    1C86 9508      RET
(0047) }
(0048) 
(0049) /**********************************************************************
(0050) functionName:void uart0Init(void)
(0051) description:串口初始化函数
(0052) desired baud rate: UBRRL决定
(0053) UBRRL = 3; //115200
(0054) UBRRL = 7; //57600
(0055) UBRRL = 23; //19200
(0056) UBRRL = 47; //9600
(0057) char size: 8 bit
(0058) parity: Disabled
(0059) **********************************************************************/
(0060) void uart0Init(void)
(0061) {
(0062)  	UCSRB = 0x00; 		//disable while setting baud rate
_uart0Init:
    1C87 2422      CLR	R2
    1C88 B82A      OUT	0x0A,R2
(0063)  	UCSRA = 0x02;
    1C89 E082      LDI	R24,2
    1C8A B98B      OUT	0x0B,R24
(0064)  	UCSRC = 0x86;
    1C8B E886      LDI	R24,0x86
    1C8C BD80      OUT	0x20,R24
(0065) 	UBRRL = BAUD115200; 	//set baud rate lo
    1C8D E083      LDI	R24,3
    1C8E B989      OUT	0x09,R24
(0066)  	UBRRH = 0x00; 		//set baud rate hi
    1C8F BC20      OUT	0x20,R2
(0067) // 	UCSRB = 0x98;		//使用中断
(0068) 	UCSRB = 0x18;
    1C90 E188      LDI	R24,0x18
    1C91 B98A      OUT	0x0A,R24
    1C92 9508      RET
(0069) 	
(0070) }
(0071) 
(0072) 
(0073) 
(0074) /**********************************************************************
(0075) functionName:void portInit(void)
(0076) description:M16 IO初始化
(0077) **********************************************************************/
(0078) void portInit(void)
(0079) {
(0080)  	PORTA=0xFF;
_portInit:
    1C93 EF8F      LDI	R24,0xFF
    1C94 BB8B      OUT	0x1B,R24
(0081)  	DDRA=0x00;
    1C95 2422      CLR	R2
    1C96 BA2A      OUT	0x1A,R2
(0082)  	PORTB=0xFF;
    1C97 BB88      OUT	0x18,R24
(0083)  	DDRB=0x00;
    1C98 BA27      OUT	0x17,R2
(0084)  	PORTC=0xFF;
    1C99 BB85      OUT	0x15,R24
(0085)  	DDRC=0x00;
    1C9A BA24      OUT	0x14,R2
(0086)  	PORTD=0xFF;
    1C9B BB82      OUT	0x12,R24
(0087)  	DDRD=0x00;
    1C9C BA21      OUT	0x11,R2
    1C9D 9508      RET
(0088) }
(0089) 
(0090) 
(0091) 
(0092) 
(0093) /**********************************************************************
(0094) functionName:void allInit(void)
(0095) description:初始化所有的器件以及变量
(0096) **********************************************************************/
(0097) void allInit(void)
(0098) {
(0099)  	//开始初始化工作
(0100)  	CLI(); 				//关闭中断源 
_allInit:
    1C9E 94F8      BCLR	7
(0101)  	globalParaInit();		//变量初始化
    1C9F DFC8      RCALL	_globalParaInit
(0102)  	portInit();			//M16 IO初始化
    1CA0 DFF2      RCALL	_portInit
(0103) 	uart0Init();			//串口初始化函数
    1CA1 DFE5      RCALL	_uart0Init
(0104) 	timer1_init();
    1CA2 DFCE      RCALL	_timer1_init
(0105) 	MCUCR = 0x00;
    1CA3 2422      CLR	R2
    1CA4 BE25      OUT	0x35,R2
(0106)  	GICR  = 0x00;
    1CA5 BE2B      OUT	0x3B,R2
(0107)  	TIMSK = 0x00; 			
    1CA6 BE29      OUT	0x39,R2
    1CA7 9508      RET
FILE: F:\job\stk500\AVRMEG~1\bldSTK500\main.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                               
(0003) **       小松工程出品    ilan2003@163.com 	2006-1-30                            
(0004) **                              
(0005) ** 文   件    名: main.c
(0006) ** 描         述: M16_BOOTLOADER
(0007) ** 版	      本: V1.0
(0008) ** 主  控  芯 片: M16  晶振频率:7.3728MHZ, 波特率115200
(0009) ** 编  译  环 境:ICCAVR 6.31A	
(0010) 
(0011) 描    述:使用STK500_2 协议的bootloader,监控芯片 M16,数据通讯RS232
(0012) 		  已经非常精简的使用STK500_2 协议的MEGA16的bootloader.使用
(0013) 		  ATMEL AVRStudio 4.xx STK500工具的进行软件升级。
(0014) 		  
(0015) 		  本软件适合于个人学习,用于商业用途建议加加密措施  
(0016) 		  
(0017) 		  注意事项:在升级firmware后,进行verify,总是出错,这是正常现象
(0018) 		  因为升级的firmware文件不含bootloader程序,而verify时将读取整片
(0019) 		  flash的内容,所以总是校验出错。如果你不放心,读取flash的内容和
(0020) 		  你烧写的firmware对比一下,看看哪里不一致就是了。
(0021) 		  
(0022) 		  大家看看有没有什么写的不好的地方,请提出宝贵的意见!
(0023) 		
(0024) **********************************************************************************************************/
(0025) #include <iom16v.h>
(0026) #include <macros.h>
(0027) #include <string.h>
(0028) #include "define.h"
(0029) #include "function.h"
(0030) #include "command.h"
(0031) #include "para.h"
(0032) 
(0033) 
(0034) 
(0035) /**********************************************************************
(0036) functionName:void main(void)
(0037) description:主函数
(0038) **********************************************************************/
(0039) void main(void)
(0040) {
(0041) 	uint08 rec_data;
(0042) 	static uint16 msgCounter;
(0043) 	allInit();
_main:
  rec_data             --> R20
    1CA8 940E1C9E  CALL	_allInit
    1CAA C0A6      RJMP	0x1D51
(0044) 	while(1)
(0045) 	{
(0046) 		rec_data=getChar();
    1CAB 940E1C57  CALL	_getChar
    1CAD 2F40      MOV	R20,R16
(0047) 		if(statusMachine == ST_START)
    1CAE 91800070  LDS	R24,statusMachine
    1CB0 3F80      CPI	R24,0xF0
    1CB1 F479      BNE	0x1CC1
(0048) 		{
(0049) 		 	flag = 1;
    1CB2 E081      LDI	R24,1
    1CB3 93800060  STS	flag,R24
(0050) 			TCCR1B = 0x00;
    1CB5 2422      CLR	R2
    1CB6 BC2E      OUT	0x2E,R2
(0051) 			if(rec_data==MESSAGE_START)
    1CB7 310B      CPI	R16,0x1B
    1CB8 F009      BEQ	0x1CBA
    1CB9 C097      RJMP	0x1D51
(0052) 			{
(0053) 				statusMachine = ST_GET_SEQ_NUM;	
    1CBA EF81      LDI	R24,0xF1
    1CBB 93800070  STS	statusMachine,R24
(0054) 				checkSum = MESSAGE_START;
    1CBD E18B      LDI	R24,0x1B
    1CBE 93800075  STS	checkSum,R24
(0055) 			}
(0056) 		}
    1CC0 C090      RJMP	0x1D51
(0057) 		else if(statusMachine == ST_GET_SEQ_NUM)
    1CC1 91800070  LDS	R24,statusMachine
    1CC3 3F81      CPI	R24,0xF1
    1CC4 F459      BNE	0x1CD0
(0058) 		{
(0059) 			seqNumber = rec_data;
    1CC5 93400076  STS	seqNumber,R20
(0060) 			checkSum ^= rec_data; 
    1CC7 90200075  LDS	R2,checkSum
    1CC9 2624      EOR	R2,R20
    1CCA 92200075  STS	checkSum,R2
(0061) 			statusMachine = ST_MSG_SIZE_1;
    1CCC EF82      LDI	R24,0xF2
    1CCD 93800070  STS	statusMachine,R24
(0062) 		}
    1CCF C081      RJMP	0x1D51
(0063) 		else if(statusMachine == ST_MSG_SIZE_1)
    1CD0 91800070  LDS	R24,statusMachine
    1CD2 3F82      CPI	R24,0xF2
    1CD3 F4A9      BNE	0x1CE9
(0064) 		{
(0065) 			msgSize = rec_data;
    1CD4 2E24      MOV	R2,R20
    1CD5 2433      CLR	R3
    1CD6 9230006F  STS	msgSize+1,R3
    1CD8 9220006E  STS	msgSize,R2
(0066) 			msgSize <<=8;
    1CDA 2C32      MOV	R3,R2
    1CDB 2422      CLR	R2
    1CDC 9230006F  STS	msgSize+1,R3
    1CDE 9220006E  STS	msgSize,R2
(0067) 			checkSum ^= rec_data;
    1CE0 90200075  LDS	R2,checkSum
    1CE2 2624      EOR	R2,R20
    1CE3 92200075  STS	checkSum,R2
(0068) 			statusMachine = ST_MSG_SIZE_2;	
    1CE5 EF83      LDI	R24,0xF3
    1CE6 93800070  STS	statusMachine,R24
(0069) 		}
    1CE8 C068      RJMP	0x1D51
(0070) 		else if(statusMachine == ST_MSG_SIZE_2)
    1CE9 91800070  LDS	R24,statusMachine
    1CEB 3F83      CPI	R24,0xF3
    1CEC F4A9      BNE	0x1D02
(0071) 		{
(0072) 			msgSize |= rec_data;
    1CED 2E24      MOV	R2,R20
    1CEE 2433      CLR	R3
    1CEF 9040006E  LDS	R4,msgSize
    1CF1 9050006F  LDS	R5,msgSize+1
    1CF3 2842      OR	R4,R2
    1CF4 2853      OR	R5,R3
    1CF5 9250006F  STS	msgSize+1,R5
    1CF7 9240006E  STS	msgSize,R4
(0073) 			checkSum ^= rec_data;
    1CF9 90200075  LDS	R2,checkSum
    1CFB 2624      EOR	R2,R20
    1CFC 92200075  STS	checkSum,R2
(0074) 			statusMachine = ST_GET_TOKEN;	
    1CFE EF84      LDI	R24,0xF4
    1CFF 93800070  STS	statusMachine,R24
(0075) 		}
    1D01 C04F      RJMP	0x1D51
(0076) 		else if(statusMachine == ST_GET_TOKEN)
    1D02 91800070  LDS	R24,statusMachine
    1D04 3F84      CPI	R24,0xF4
    1D05 F4A9      BNE	0x1D1B
(0077) 		{
(0078) 			if(rec_data==TOKEN)
    1D06 304E      CPI	R20,0xE
    1D07 F479      BNE	0x1D17
(0079) 			{
(0080) 				checkSum ^= rec_data;
    1D08 90200075  LDS	R2,checkSum
    1D0A 2624      EOR	R2,R20
    1D0B 92200075  STS	checkSum,R2
(0081) 				statusMachine = ST_GET_DATA;
    1D0D EF85      LDI	R24,0xF5
    1D0E 93800070  STS	statusMachine,R24
(0082) 				msgCounter=0;
    1D10 2422      CLR	R2
    1D11 2433      CLR	R3
    1D12 9230006B  STS	msgCounter+1,R3
    1D14 9220006A  STS	msgCounter,R2
(0083) 			}
    1D16 C03A      RJMP	0x1D51
(0084) 			else
(0085) 			{
(0086) 				statusMachine = ST_START;
    1D17 EF80      LDI	R24,0xF0
    1D18 93800070  STS	statusMachine,R24
(0087) 			}
(0088) 		}
    1D1A C036      RJMP	0x1D51
(0089) 		else if(statusMachine == ST_GET_DATA)
    1D1B 91800070  LDS	R24,statusMachine
    1D1D 3F85      CPI	R24,0xF5
    1D1E F521      BNE	0x1D43
(0090) 		{
(0091) 			msg_buffer[msgCounter++]=rec_data;
    1D1F 9020006A  LDS	R2,msgCounter
    1D21 9030006B  LDS	R3,msgCounter+1
    1D23 01C1      MOVW	R24,R2
    1D24 9601      ADIW	R24,1
    1D25 9390006B  STS	msgCounter+1,R25
    1D27 9380006A  STS	msgCounter,R24
    1D29 E787      LDI	R24,0x77
    1D2A E090      LDI	R25,0
    1D2B 01F1      MOVW	R30,R2
    1D2C 0FE8      ADD	R30,R24
    1D2D 1FF9      ADC	R31,R25

⌨️ 快捷键说明

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