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

📄 19boot.lst

📁 ATEMEL AVR128 BOOT程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0062)  		asm("jmp 0x000000\n");;				/*进入应用程序区*/
    F909 940C0000  JMP	0x0
(0063)  		}
(0064) 
(0065)  	DDRB = 0xFF;
    F90B EF8F      LDI	R24,0xFF
    F90C BB87      OUT	0x17,R24
(0066) 	uart0_init();							/*串口初始化函数*/
    F90D 940EF8AD  CALL	_uart0_init
(0067) 	timer1_init();							/*定时器T初始化*/
    F90F DFE0      RCALL	_timer1_init
    F910 9508      RET
FILE: E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
(0001) /*
(0002) 实验十九:
(0003) 	mega128 BOOT实验。
(0004) 	1、AVR单片机IAP实验,使用AVRISP协议及上位机软件,进行IAP升级实验。
(0005) 		进入IAP方法:在启动时按住S7键。
(0006) 		退出IAP方法:在不按S7按键的情况下复位CPU即可。
(0007) 		使用方法:和正常的AVRISP下载方式相同。
(0008) 	2、外部3.6864 M晶振。
(0009) 	3、进行此实验请插上LED短路块,与PC机的通信由UART0完成。
(0010) 	4、这个实验是一个高难度实验,同样也是一个很有意义的实验,
(0011) 		此实验可以移植到产品里面使用。
(0012) 
(0013) 	AVR  mega128学习板
(0014) 	www.iccavr.com 阿发
(0015) 	5:18 2007-10-20
(0016) 
(0017) 	本实验代码主要参考了小松工程和马潮老师的作品。
(0018) */
(0019) 
(0020) #include "init.h"
(0021) 
(0022) /*主函数*/
(0023) void main(void) {
(0024) 
(0025) 	unsigned char rec_data;
(0026) 	static unsigned int msgCounter;
(0027) 	init();	
_main:
  rec_data             --> R20
    F911 940EF8F8  CALL	_init
    F913 C0A1      RJMP	0xF9B5
(0028) 	while (1) {
(0029) 		rec_data=getChar();
    F914 940EF8BD  CALL	_getChar
    F916 2F40      MOV	R20,R16
(0030) 		if (statusMachine == ST_START) {
    F917 91800110  LDS	R24,statusMachine
    F919 3F80      CPI	R24,0xF0
    F91A F451      BNE	0xF925
(0031) 		 	//flag = 1;
(0032) 			//TCCR1B = 0x00;
(0033) 			if (rec_data==MESSAGE_START) {					/*同步*/
    F91B 310B      CPI	R16,0x1B
    F91C F009      BEQ	0xF91E
    F91D C097      RJMP	0xF9B5
(0034) 				statusMachine = ST_GET_SEQ_NUM;	
    F91E EF81      LDI	R24,0xF1
    F91F 93800110  STS	statusMachine,R24
(0035) 				checkSum = MESSAGE_START;
    F921 E18B      LDI	R24,0x1B
    F922 93800115  STS	checkSum,R24
(0036) 				}
(0037) 			}
    F924 C090      RJMP	0xF9B5
(0038) 		else if (statusMachine == ST_GET_SEQ_NUM) {			/*序号*/
    F925 91800110  LDS	R24,statusMachine
    F927 3F81      CPI	R24,0xF1
    F928 F459      BNE	0xF934
(0039) 			seqNumber = rec_data;
    F929 93400116  STS	seqNumber,R20
(0040) 			checkSum ^= rec_data; 
    F92B 90200115  LDS	R2,checkSum
    F92D 2624      EOR	R2,R20
    F92E 92200115  STS	checkSum,R2
(0041) 			statusMachine = ST_MSG_SIZE_1;
    F930 EF82      LDI	R24,0xF2
    F931 93800110  STS	statusMachine,R24
(0042) 			}
    F933 C081      RJMP	0xF9B5
(0043) 		else if (statusMachine == ST_MSG_SIZE_1) {			/*长度*/
    F934 91800110  LDS	R24,statusMachine
    F936 3F82      CPI	R24,0xF2
    F937 F4A9      BNE	0xF94D
(0044) 			msgSize = rec_data;
    F938 2E24      MOV	R2,R20
    F939 2433      CLR	R3
    F93A 9230010F  STS	msgSize+1,R3
    F93C 9220010E  STS	msgSize,R2
(0045) 			msgSize <<=8;
    F93E 2C32      MOV	R3,R2
    F93F 2422      CLR	R2
    F940 9230010F  STS	msgSize+1,R3
    F942 9220010E  STS	msgSize,R2
(0046) 			checkSum ^= rec_data;
    F944 90200115  LDS	R2,checkSum
    F946 2624      EOR	R2,R20
    F947 92200115  STS	checkSum,R2
(0047) 			statusMachine = ST_MSG_SIZE_2;
    F949 EF83      LDI	R24,0xF3
    F94A 93800110  STS	statusMachine,R24
(0048) 			}
    F94C C068      RJMP	0xF9B5
(0049) 		else if (statusMachine == ST_MSG_SIZE_2) {			/*长度*/
    F94D 91800110  LDS	R24,statusMachine
    F94F 3F83      CPI	R24,0xF3
    F950 F4A9      BNE	0xF966
(0050) 			msgSize |= rec_data;
    F951 2E24      MOV	R2,R20
    F952 2433      CLR	R3
    F953 9040010E  LDS	R4,msgSize
    F955 9050010F  LDS	R5,msgSize+1
    F957 2842      OR	R4,R2
    F958 2853      OR	R5,R3
    F959 9250010F  STS	msgSize+1,R5
    F95B 9240010E  STS	msgSize,R4
(0051) 			checkSum ^= rec_data;
    F95D 90200115  LDS	R2,checkSum
    F95F 2624      EOR	R2,R20
    F960 92200115  STS	checkSum,R2
(0052) 			statusMachine = ST_GET_TOKEN;
    F962 EF84      LDI	R24,0xF4
    F963 93800110  STS	statusMachine,R24
(0053) 			}
    F965 C04F      RJMP	0xF9B5
(0054) 		else if (statusMachine == ST_GET_TOKEN) {			/*关键字*/
    F966 91800110  LDS	R24,statusMachine
    F968 3F84      CPI	R24,0xF4
    F969 F4A9      BNE	0xF97F
(0055) 			if (rec_data==TOKEN) {
    F96A 304E      CPI	R20,0xE
    F96B F479      BNE	0xF97B
(0056) 				checkSum ^= rec_data;
    F96C 90200115  LDS	R2,checkSum
    F96E 2624      EOR	R2,R20
    F96F 92200115  STS	checkSum,R2
(0057) 				statusMachine = ST_GET_DATA;
    F971 EF85      LDI	R24,0xF5
    F972 93800110  STS	statusMachine,R24
(0058) 				msgCounter=0;
    F974 2422      CLR	R2
    F975 2433      CLR	R3
    F976 92300244  STS	msgCounter+1,R3
    F978 92200243  STS	msgCounter,R2
(0059) 				}
    F97A C03A      RJMP	0xF9B5
(0060) 			else {
(0061) 				statusMachine = ST_START;
    F97B EF80      LDI	R24,0xF0
    F97C 93800110  STS	statusMachine,R24
(0062) 				}
(0063) 			}
    F97E C036      RJMP	0xF9B5
(0064) 		else if (statusMachine == ST_GET_DATA) {			/*读取数据*/
    F97F 91800110  LDS	R24,statusMachine
    F981 3F85      CPI	R24,0xF5
    F982 F521      BNE	0xF9A7
(0065) 			msg_buffer[msgCounter++]=rec_data;
    F983 90200243  LDS	R2,msgCounter
    F985 90300244  LDS	R3,msgCounter+1
    F987 01C1      MOVW	R24,R2
    F988 9601      ADIW	R24,1
    F989 93900244  STS	msgCounter+1,R25
    F98B 93800243  STS	msgCounter,R24
    F98D E187      LDI	R24,0x17
    F98E E091      LDI	R25,1
    F98F 01F1      MOVW	R30,R2
    F990 0FE8      ADD	R30,R24
    F991 1FF9      ADC	R31,R25
    F992 8340      STD	Z+0,R20
(0066) 			checkSum ^= rec_data;
    F993 90200115  LDS	R2,checkSum
    F995 2624      EOR	R2,R20
    F996 92200115  STS	checkSum,R2
(0067) 			if (msgCounter==msgSize) {						/*判断是否完成*/
    F998 9020010E  LDS	R2,msgSize
    F99A 9030010F  LDS	R3,msgSize+1
    F99C 90400243  LDS	R4,msgCounter
    F99E 90500244  LDS	R5,msgCounter+1
    F9A0 1442      CP	R4,R2
    F9A1 0453      CPC	R5,R3
    F9A2 F491      BNE	0xF9B5
(0068) 				statusMachine = ST_GET_CHECK;
    F9A3 EF86      LDI	R24,0xF6
    F9A4 93800110  STS	statusMachine,R24
(0069) 				}
(0070) 			}
    F9A6 C00E      RJMP	0xF9B5
(0071) 		else if (statusMachine == ST_GET_CHECK) {			/*数据校验*/
    F9A7 91800110  LDS	R24,statusMachine
    F9A9 3F86      CPI	R24,0xF6
    F9AA F451      BNE	0xF9B5
(0072) 			if (rec_data == checkSum) {
    F9AB 90200115  LDS	R2,checkSum
    F9AD 1542      CP	R20,R2
    F9AE F419      BNE	0xF9B2
(0073) 				packageProcess(seqNumber);
    F9AF 91000116  LDS	R16,seqNumber
    F9B1 D005      RCALL	_packageProcess
(0074) 				}		
(0075) 			statusMachine = ST_START;
    F9B2 EF80      LDI	R24,0xF0
    F9B3 93800110  STS	statusMachine,R24
    F9B5 CF5E      RJMP	0xF914
    F9B6 9508      RET
_packageProcess:
  temp16               --> R10
  start_address        --> Y+2
  cmd                  --> R14
  tmp                  --> Y+8
  num_bytes            --> Y+6
  i                    --> R12
  seqNum               --> Y+19
    F9B7 931A      ST	R17,-Y
    F9B8 930A      ST	R16,-Y
    F9B9 940EFC76  CALL	push_gset5
    F9BB 9729      SBIW	R28,0x9
(0076) 			}
(0077) 		}
(0078) }
(0079) 
(0080) /*数据包的处理*/
(0081) void packageProcess(unsigned   char seqNum) {
(0082) 	unsigned char cmd;
(0083) 	unsigned char tmp = 0;
    F9BC 2400      CLR	R0
    F9BD 8608      STD	Y+8,R0
(0084) 	unsigned int i;
(0085) 	unsigned int num_bytes=0;
    F9BE 2411      CLR	R1
    F9BF 821F      STD	Y+7,R1
    F9C0 820E      STD	Y+6,R0
(0086) 	unsigned int temp16;
(0087) 	unsigned long start_address = address;
    F9C1 9040010C  LDS	R4,address+2
    F9C3 9050010D  LDS	R5,address+3
    F9C5 9020010A  LDS	R2,address
    F9C7 9030010B  LDS	R3,address+1
    F9C9 01FE      MOVW	R30,R28
    F9CA 8222      STD	Z+2,R2
    F9CB 8233      STD	Z+3,R3
    F9CC 8244      STD	Z+4,R4
    F9CD 8255      STD	Z+5,R5
(0088) 	
(0089) 	cmd = msg_buffer[0];
    F9CE 90E00117  LDS	R14,msg_buffer
(0090) 	//版本信息
(0091) 	if (cmd==CMD_SIGN_ON) {
    F9D0 2D8E      MOV	R24,R14
    F9D1 3081      CPI	R24,1
    F9D2 F4B1      BNE	0xF9E9
(0092) 		num_bytes = 11;
    F9D3 E08B      LDI	R24,0xB
    F9D4 E090      LDI	R25,0
    F9D5 839F      STD	Y+7,R25
    F9D6 838E      STD	Y+6,R24
(0093) 		msg_buffer[0] = CMD_SIGN_ON;
    F9D7 E081      LDI	R24,1
    F9D8 93800117  STS	msg_buffer,R24
(0094) 		msg_buffer[1] = STATUS_CMD_OK;
    F9DA 2422      CLR	R2
    F9DB 92200118  STS	msg_buffer+1,R2
(0095) 		msg_buffer[2] = 8;
    F9DD E088      LDI	R24,0x8
    F9DE 93800119  STS	msg_buffer+2,R24
(0096) 		memcpy(msg_buffer+3,"STK500_2",8);
    F9E0 8399      STD	Y+1,R25
    F9E1 8388      STD	Y+0,R24
    F9E2 E021      LDI	R18,1
    F9E3 E031      LDI	R19,1
    F9E4 E10A      LDI	R16,0x1A
    F9E5 E011      LDI	R17,1
    F9E6 940EFC61  CALL	_memcpy
(0097) 		}
    F9E8 C213      RJMP	0xFBFC
(0098) 	//参数设置
(0099) 	else if (cmd==CMD_SET_PARAMETER) {
    F9E9 2D8E      MOV	R24,R14
    F9EA 3082      CPI	R24,2
    F9EB F451      BNE	0xF9F6
(0100) 		num_bytes = 2;
    F9EC E082      LDI	R24,2
    F9ED E090      LDI	R25,0
    F9EE 839F      STD	Y+7,R25
    F9EF 838E      STD	Y+6,R24
(0101) 		msg_buffer[0] = CMD_SET_PARAMETER;
    F9F0 93800117  STS	msg_buffer,R24
(0102) 		msg_buffer[1] = STATUS_CMD_OK;
    F9F2 2422      CLR	R2
    F9F3 92200118  STS	msg_buffer+1,R2
(0103) 		}
    F9F5 C206      RJMP	0xFBFC
(0104) 	//参数读取
(0105) 	else if (cmd==CMD_GET_PARAMETER) {
    F9F6 2D8E      MOV	R24,R14
    F9F7 3083      CPI	R24,3
    F9F8 F5B1      BNE	0xFA2F
(0106) 		switch(msg_buffer[1]) {
    F9F9 90A00118  LDS	R10,msg_buffer+1
    F9FB 24BB      CLR	R11
    F9FC 01C5      MOVW	R24,R10
    F9FD 3982      CPI	R24,0x92
    F9FE E0E0      LDI	R30,0
    F9FF 079E      CPC	R25,R30
    FA00 F091      BEQ	0xFA13
    FA01 3984      CPI	R24,0x94
    FA02 E0E0      LDI	R30,0
    FA03 079E      CPC	R25,R30
    FA04 F0A9      BEQ	0xFA1A
    FA05 3985      CPI	R24,0x95
    FA06 E0E0      LDI	R30,0
    FA07 079E      CPC	R25,R30
    FA08 F0A1      BEQ	0xFA1D
    FA09 3982      CPI	R24,0x92
    FA0A E0E0      LDI	R30,0
    FA0B 079E      CPC	R25,R30
    FA0C F09C      BLT	0xFA20
    FA0D 01C5      MOVW	R24,R10
    FA0E 398E      CPI	R24,0x9E
    FA0F E0E0      LDI	R30,0
    FA10 079E      CPC	R25,R30
    FA11 F021      BEQ	0xFA16
    FA12 C00D      RJMP	0xFA20
(0107) 			/*case PARAM_BUILD_NUMBER_LOW:
(0108) 				tmp = CONFIG_PARAM_BUILD_NUMBER_LOW;
(0109) 				break;
(0110) 			case PARAM_BUILD_NUMBER_HIGH:
(0111) 				tmp = CONFIG_PARAM_BUILD_NUMBER_HIGH;
(0112) 				break;
(0113) 			case PARAM_HW_VER:
(0114) 				tmp = CONFIG_PARAM_HW_VER;
(0115) 				break;
(0116) 			case PARAM_SW_MAJOR:
(0117) 				tmp = CONFIG_PARAM_SW_MAJOR;
(0118) 				break;*/
(0119) 			case PARAM_SW_MINOR:
(0120) 				tmp = CONFIG_PARAM_SW_MINOR;
    FA13 E08A      LDI	R24,0xA
    FA14 8788      STD	Y+8,R24
(0121) 				break;
    FA15 C00C      RJMP	0xFA22
(0122) 			case PARAM_RESET_POLARITY:
(0123) 				tmp = resetPolarity;
    FA16 90200113  LDS	R2,resetPolarity
    FA18 8628      STD	Y+8,R2
(0124) 				break;
    FA19 C008      RJMP	0xFA22
(0125) 			case PARAM_VTARGET:				//目标电压
(0126) 				tmp = 50;
    FA1A E382      LDI	R24,0x32
    FA1B 8788      STD	Y+8,R24

⌨️ 快捷键说明

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