📄 19boot.lst
字号:
(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 + -