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

📄 main.s

📁 ATEMEL AVR128 BOOT程序
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module main.c
	.area bss(ram, con, rel)
L2:
	.blkb 2
	.area text(rom, con, rel)
	.dbfile E:\ICCAVR\project\AVRMEG~3\icc\019-BOOT\main.c
	.dbfunc e main _main fV
	.dbsym s msgCounter L2 i
;       rec_data -> R20
	.even
_main::
	.dbline -1
	.dbline 23
; /*
; 实验十九:
; 	mega128 BOOT实验。
; 	1、AVR单片机IAP实验,使用AVRISP协议及上位机软件,进行IAP升级实验。
; 		进入IAP方法:在启动时按住S7键。
; 		退出IAP方法:在不按S7按键的情况下复位CPU即可。
; 		使用方法:和正常的AVRISP下载方式相同。
; 	2、外部3.6864 M晶振。
; 	3、进行此实验请插上LED短路块,与PC机的通信由UART0完成。
; 	4、这个实验是一个高难度实验,同样也是一个很有意义的实验,
; 		此实验可以移植到产品里面使用。
; 
; 	AVR  mega128学习板
; 	www.iccavr.com 阿发
; 	5:18 2007-10-20
; 
; 	本实验代码主要参考了小松工程和马潮老师的作品。
; */
; 
; #include "init.h"
; 
; /*主函数*/
; void main(void) {
	.dbline 27
; 
; 	unsigned char rec_data;
; 	static unsigned int msgCounter;
; 	init();	
	xcall _init
	xjmp L4
L3:
	.dbline 28
; 	while (1) {
	.dbline 29
; 		rec_data=getChar();
	xcall _getChar
	mov R20,R16
	.dbline 30
; 		if (statusMachine == ST_START) {
	lds R24,_statusMachine
	cpi R24,240
	brne L6
	.dbline 30
	.dbline 33
; 		 	//flag = 1;
; 			//TCCR1B = 0x00;
; 			if (rec_data==MESSAGE_START) {					/*同步*/
	cpi R16,27
	breq X1
	xjmp L7
X1:
	.dbline 33
	.dbline 34
; 				statusMachine = ST_GET_SEQ_NUM;	
	ldi R24,241
	sts _statusMachine,R24
	.dbline 35
; 				checkSum = MESSAGE_START;
	ldi R24,27
	sts _checkSum,R24
	.dbline 36
; 				}
	.dbline 37
; 			}
	xjmp L7
L6:
	.dbline 38
; 		else if (statusMachine == ST_GET_SEQ_NUM) {			/*序号*/
	lds R24,_statusMachine
	cpi R24,241
	brne L10
	.dbline 38
	.dbline 39
; 			seqNumber = rec_data;
	sts _seqNumber,R20
	.dbline 40
; 			checkSum ^= rec_data; 
	lds R2,_checkSum
	eor R2,R20
	sts _checkSum,R2
	.dbline 41
; 			statusMachine = ST_MSG_SIZE_1;
	ldi R24,242
	sts _statusMachine,R24
	.dbline 42
; 			}
	xjmp L11
L10:
	.dbline 43
; 		else if (statusMachine == ST_MSG_SIZE_1) {			/*长度*/
	lds R24,_statusMachine
	cpi R24,242
	brne L12
	.dbline 43
	.dbline 44
; 			msgSize = rec_data;
	mov R2,R20
	clr R3
	sts _msgSize+1,R3
	sts _msgSize,R2
	.dbline 45
; 			msgSize <<=8;
	mov R3,R2
	clr R2
	sts _msgSize+1,R3
	sts _msgSize,R2
	.dbline 46
; 			checkSum ^= rec_data;
	lds R2,_checkSum
	eor R2,R20
	sts _checkSum,R2
	.dbline 47
; 			statusMachine = ST_MSG_SIZE_2;
	ldi R24,243
	sts _statusMachine,R24
	.dbline 48
; 			}
	xjmp L13
L12:
	.dbline 49
; 		else if (statusMachine == ST_MSG_SIZE_2) {			/*长度*/
	lds R24,_statusMachine
	cpi R24,243
	brne L14
	.dbline 49
	.dbline 50
; 			msgSize |= rec_data;
	mov R2,R20
	clr R3
	lds R4,_msgSize
	lds R5,_msgSize+1
	or R4,R2
	or R5,R3
	sts _msgSize+1,R5
	sts _msgSize,R4
	.dbline 51
; 			checkSum ^= rec_data;
	lds R2,_checkSum
	eor R2,R20
	sts _checkSum,R2
	.dbline 52
; 			statusMachine = ST_GET_TOKEN;
	ldi R24,244
	sts _statusMachine,R24
	.dbline 53
; 			}
	xjmp L15
L14:
	.dbline 54
; 		else if (statusMachine == ST_GET_TOKEN) {			/*关键字*/
	lds R24,_statusMachine
	cpi R24,244
	brne L16
	.dbline 54
	.dbline 55
; 			if (rec_data==TOKEN) {
	cpi R20,14
	brne L18
	.dbline 55
	.dbline 56
; 				checkSum ^= rec_data;
	lds R2,_checkSum
	eor R2,R20
	sts _checkSum,R2
	.dbline 57
; 				statusMachine = ST_GET_DATA;
	ldi R24,245
	sts _statusMachine,R24
	.dbline 58
; 				msgCounter=0;
	clr R2
	clr R3
	sts L2+1,R3
	sts L2,R2
	.dbline 59
; 				}
	xjmp L17
L18:
	.dbline 60
; 			else {
	.dbline 61
; 				statusMachine = ST_START;
	ldi R24,240
	sts _statusMachine,R24
	.dbline 62
; 				}
	.dbline 63
; 			}
	xjmp L17
L16:
	.dbline 64
; 		else if (statusMachine == ST_GET_DATA) {			/*读取数据*/
	lds R24,_statusMachine
	cpi R24,245
	brne L20
	.dbline 64
	.dbline 65
; 			msg_buffer[msgCounter++]=rec_data;
	lds R2,L2
	lds R3,L2+1
	movw R24,R2
	adiw R24,1
	sts L2+1,R25
	sts L2,R24
	ldi R24,<_msg_buffer
	ldi R25,>_msg_buffer
	movw R30,R2
	add R30,R24
	adc R31,R25
	std z+0,R20
	.dbline 66
; 			checkSum ^= rec_data;
	lds R2,_checkSum
	eor R2,R20
	sts _checkSum,R2
	.dbline 67
; 			if (msgCounter==msgSize) {						/*判断是否完成*/
	lds R2,_msgSize
	lds R3,_msgSize+1
	lds R4,L2
	lds R5,L2+1
	cp R4,R2
	cpc R5,R3
	brne L21
	.dbline 67
	.dbline 68
; 				statusMachine = ST_GET_CHECK;
	ldi R24,246
	sts _statusMachine,R24
	.dbline 69
; 				}
	.dbline 70
; 			}
	xjmp L21
L20:
	.dbline 71
; 		else if (statusMachine == ST_GET_CHECK) {			/*数据校验*/
	lds R24,_statusMachine
	cpi R24,246
	brne L24
	.dbline 71
	.dbline 72
; 			if (rec_data == checkSum) {
	lds R2,_checkSum
	cp R20,R2
	brne L26
	.dbline 72
	.dbline 73
; 				packageProcess(seqNumber);
	lds R16,_seqNumber
	xcall _packageProcess
	.dbline 74
; 				}		
L26:
	.dbline 75
; 			statusMachine = ST_START;
	ldi R24,240
	sts _statusMachine,R24
	.dbline 76
; 			}
L24:
L21:
L17:
L15:
L13:
L11:
L7:
	.dbline 77
L4:
	.dbline 28
	xjmp L3
X0:
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbsym r rec_data 20 c
	.dbend
	.dbfunc e packageProcess _packageProcess fV
;         temp16 -> R10,R11
;  start_address -> y+2
;            cmd -> R14
;            tmp -> y+8
;      num_bytes -> y+6
;              i -> R12,R13
;         seqNum -> y+19
	.even
_packageProcess::
	st -y,r17
	st -y,r16
	xcall push_gset5
	sbiw R28,9
	.dbline -1
	.dbline 81
; 		}
; }
; 
; /*数据包的处理*/
; void packageProcess(unsigned   char seqNum) {
	.dbline 83
; 	unsigned char cmd;
; 	unsigned char tmp = 0;
	clr R0
	std y+8,R0
	.dbline 85
; 	unsigned int i;
; 	unsigned int num_bytes=0;
	clr R1
	std y+7,R1
	std y+6,R0
	.dbline 87
; 	unsigned int temp16;
; 	unsigned long start_address = address;
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
	.dbline 89
; 	
; 	cmd = msg_buffer[0];
	lds R14,_msg_buffer
	.dbline 91
; 	//版本信息
; 	if (cmd==CMD_SIGN_ON) {
	mov R24,R14
	cpi R24,1
	brne L29
	.dbline 91
	.dbline 92
; 		num_bytes = 11;
	ldi R24,11
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 93
; 		msg_buffer[0] = CMD_SIGN_ON;
	ldi R24,1
	sts _msg_buffer,R24
	.dbline 94
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 95
; 		msg_buffer[2] = 8;
	ldi R24,8
	sts _msg_buffer+2,R24
	.dbline 96
; 		memcpy(msg_buffer+3,"STK500_2",8);
	std y+1,R25
	std y+0,R24
	ldi R18,<L34
	ldi R19,>L34
	ldi R16,<_msg_buffer+3
	ldi R17,>_msg_buffer+3
	xcall _memcpy
	.dbline 97
; 		}
	xjmp L30
L29:
	.dbline 99
; 	//参数设置
; 	else if (cmd==CMD_SET_PARAMETER) {
	mov R24,R14
	cpi R24,2
	brne L35
	.dbline 99
	.dbline 100
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 101
; 		msg_buffer[0] = CMD_SET_PARAMETER;
	sts _msg_buffer,R24
	.dbline 102
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 103
; 		}
	xjmp L36
L35:
	.dbline 105
; 	//参数读取
; 	else if (cmd==CMD_GET_PARAMETER) {
	mov R24,R14
	cpi R24,3
	brne L38
	.dbline 105
	.dbline 106
; 		switch(msg_buffer[1]) {
	lds R10,_msg_buffer+1
	clr R11
	movw R24,R10
	cpi R24,146
	ldi R30,0
	cpc R25,R30
	breq L44
	cpi R24,148
	ldi R30,0
	cpc R25,R30
	breq L46
	cpi R24,149
	ldi R30,0
	cpc R25,R30
	breq L47
	cpi R24,146
	ldi R30,0
	cpc R25,R30
	brlt L40
L48:
	movw R24,R10
	cpi R24,158
	ldi R30,0
	cpc R25,R30
	breq L45
	xjmp L40
X2:
	.dbline 106
L44:
	.dbline 120
; 			/*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;
	ldi R24,10
	std y+8,R24
	.dbline 121
; 				break;
	xjmp L41
L45:
	.dbline 123
; 			case PARAM_RESET_POLARITY:
; 				tmp = resetPolarity;
	lds R2,_resetPolarity
	std y+8,R2
	.dbline 124
; 				break;
	xjmp L41
L46:
	.dbline 126
; 			case PARAM_VTARGET:				//目标电压
; 				tmp = 50;
	ldi R24,50
	std y+8,R24
	.dbline 127
; 				break;	
	xjmp L41
L47:
	.dbline 129
; 			case PARAM_VADJUST:
; 				tmp = 50;				//参考电压
	ldi R24,50
	std y+8,R24
	.dbline 130
; 				break;
	xjmp L41
L40:
	.dbline 141
; 			/*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;
	ldi R24,2
	std y+8,R24
	.dbline 142
; 				break;
L41:
	.dbline 144
; 				}
; 		num_bytes = 3;
	ldi R24,3
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 145
; 		msg_buffer[0] = CMD_GET_PARAMETER;
	sts _msg_buffer,R24
	.dbline 146
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 147
; 		msg_buffer[2] = tmp;
	ldd R0,y+8
	sts _msg_buffer+2,R0
	.dbline 148
; 		}
	xjmp L39
L38:
	.dbline 156
; 	//读取时钟修正值
; 	/*else if (cmd==CMD_OSCCAL) {
; 		num_bytes = 2;
; 		msg_buffer[0] = CMD_OSCCAL;
; 		msg_buffer[1] = STATUS_CMD_OK;
; 		}*/
; 	//设置地址
; 	else if (cmd==CMD_LOAD_ADDRESS) {
	mov R24,R14
	cpi R24,6
	breq X5
	xjmp L51
X5:
	.dbline 156
	.dbline 158
; 		//address =  ((unsigned long)msg_buffer[1])<<24;
; 		address = ((unsigned long)msg_buffer[2])<<16;
	lds R2,_msg_buffer+2
	clr R3
	clr R4
	clr R5
	movw R4,R2
	clr R2
	clr R3
	sts _address+1,R3
	sts _address,R2
	sts _address+2+1,R5
	sts _address+2,R4
	.dbline 159
; 		address |= ((unsigned long)msg_buffer[3])<<8;
	ldi R24,8
	ldi R25,0
	lds R2,_msg_buffer+3
	clr R3
	clr R4
	clr R5
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	lds R4,_address+2
	lds R5,_address+2+1
	lds R2,_address
	lds R3,_address+1
	or R2,R16
	or R3,R17
	or R4,R18
	or R5,R19
	sts _address+1,R3
	sts _address,R2
	sts _address+2+1,R5
	sts _address+2,R4
	.dbline 160
; 		address |= ((unsigned long)msg_buffer[4]);
	lds R2,_msg_buffer+4
	clr R3
	clr R4
	clr R5
	lds R8,_address+2
	lds R9,_address+2+1
	lds R6,_address
	lds R7,_address+1
	or R6,R2
	or R7,R3
	or R8,R4
	or R9,R5
	sts _address+1,R7
	sts _address,R6
	sts _address+2+1,R9
	sts _address+2,R8
	.dbline 161
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 162
; 		msg_buffer[0] = CMD_LOAD_ADDRESS;
	ldi R24,6
	sts _msg_buffer,R24
	.dbline 163
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 164
; 		}
	xjmp L52
L51:
	.dbline 166
; 	//芯片擦除
; 	else if (cmd==CMD_CHIP_ERASE_ISP) {
	mov R24,R14
	cpi R24,18
	brne L57
	.dbline 166
	.dbline 167
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24
	.dbline 168
; 		msg_buffer[0] = CMD_CHIP_ERASE_ISP;
	ldi R24,18
	sts _msg_buffer,R24
	.dbline 169
; 		msg_buffer[1] = STATUS_CMD_OK;
	clr R2
	sts _msg_buffer+1,R2
	.dbline 170
; 		}
	xjmp L58
L57:
	.dbline 172
; 	//进入编程模式
; 	else if (cmd == CMD_ENTER_PROGMODE_ISP) {
	mov R24,R14
	cpi R24,16
	brne L60
	.dbline 172
	.dbline 173
; 		num_bytes = 2;
	ldi R24,2
	ldi R25,0
	std y+7,R25
	std y+6,R24

⌨️ 快捷键说明

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