📄 boot128.lst
字号:
__start:
__text_start:
F049 E001 LDI R16,1
F04A BF05 OUT 0x35,R16
F04B E002 LDI R16,2
F04C BF05 OUT 0x35,R16
F04D EFCF LDI R28,0xFF
F04E E1D0 LDI R29,0x10
F04F BFCD OUT 0x3D,R28
F050 BFDE OUT 0x3E,R29
F051 51C0 SUBI R28,0x10
F052 40D0 SBCI R29,0
F053 EA0A LDI R16,0xAA
F054 8308 STD Y+0,R16
F055 2400 CLR R0
F056 E0E6 LDI R30,6
F057 E0F1 LDI R31,1
F058 E013 LDI R17,3
F059 36E4 CPI R30,0x64
F05A 07F1 CPC R31,R17
F05B F011 BEQ 0xF05E
F05C 9201 ST R0,Z+
F05D CFFB RJMP 0xF059
F05E 8300 STD Z+0,R16
F05F E8EC LDI R30,0x8C
F060 EEF0 LDI R31,0xE0
F061 E0A0 LDI R26,0
F062 E0B1 LDI R27,1
F063 EE10 LDI R17,0xE0
F064 E001 LDI R16,1
F065 BF0B OUT 0x3B,R16
F066 39E2 CPI R30,0x92
F067 07F1 CPC R31,R17
F068 F021 BEQ 0xF06D
F069 95D8 ELPM
F06A 9631 ADIW R30,1
F06B 920D ST R0,X+
F06C CFF9 RJMP 0xF066
F06D 940EF217 CALL _main
_exit:
F06F CFFF RJMP _exit
_boot_page_ew:
code --> Y+4
p_address --> Y+0
F070 940EF5DA CALL push_arg4
FILE: E:\程序\AVR程序\BOOTLoadICC\main.c
(0001) #include <iom128v.h>
(0002) #include "Eeprom128.h"
(0003) #include "Rtc8025.h"
(0004) #include "Uart.h"
(0005) #include "Crc.h"
(0006)
(0007) #define BOOT_TEST 0
(0008)
(0009) //============================================================
(0010) //无线错误下载设置错误代码定义
(0011) #define ERR_CONNECT 0x10//表示握手信号接收不对;
(0012) #define ERR_COMMANDCRC 0x11//表示接收命令校验错误;
(0013) #define ERR_DATACRC 0x12//表示接收数据不正确,要求丛发数据;
(0014) #define ERR_OVERTIME 0x13//表示接收数据超时;
(0015) #define ERR_NOCOMMAND 0x14//没有该指令;
(0016) #define ERR_SETTING 0x15//设置参数失败;
(0017) #define ERR_READTIME 0x16//读取系统时钟失败;
(0018)
(0019) //============================================================
(0020) //定义写Flash一页的长度,同时声明数据Buffer
(0021) #define SPM_PAGESIZE 256
(0022) unsigned char SendData[100];
(0023) unsigned char SendBuf[100];
(0024) unsigned char ReceiveBuf[150];
(0025) unsigned char data[SPM_PAGESIZE];
(0026)
(0027) //============================================================
(0028) //定义接收数据的起点和写FLASH的起始地址
(0029) unsigned int bPiont = 0;
(0030) unsigned long address= 0x0000;
(0031)
(0032) //============================================================
(0033) //函 数:void boot_page_ew(long p_address,char code)
(0034) //功 能:读写FLASH数据
(0035) //入口参数:地址,命令字03擦除,05写入
(0036) //返 回 值:无
(0037) //设 计 者:覃道堂
(0038) //创作时间:2006-03-16
(0039) //修改时间:
(0040) //修改目的:
(0041) //============================================================
(0042) void boot_page_ew(long p_address,char code)
(0043) {
(0044) asm("mov r30,r16\n"
F072 2FE0 MOV R30,R16
F073 2FF1 MOV R31,R17
F074 BF2B OUT 0x3B,R18
(0045) "mov r31,r17\n"
(0046) "out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
(0047) SPMCSR = code; //寄存器SPMCSR中为操作码
F075 800C LDD R0,Y+4
F076 92000068 STS 0x68,R0
(0048) asm("spm\n"); //对指定Flash页进行操作
F078 95E8 SPM
F079 9624 ADIW R28,4
F07A 9508 RET
(0049) }
(0050) //============================================================
(0051) //函 数:void boot_page_fill(unsigned int address,int data)
(0052) //功 能:填充Flash缓冲页中的一个字
(0053) //入口参数:地址和数据
(0054) //返 回 值:无
(0055) //设 计 者:覃道堂
(0056) //创作时间:2006-03-16
(0057) //修改时间:
(0058) //修改目的:
(0059) //============================================================
(0060) void boot_page_fill(unsigned int address,int data)
(0061) {
(0062) asm("mov r30,r16\n"
_boot_page_fill:
data --> R18
address --> R16
F07B 2FE0 MOV R30,R16
F07C 2FF1 MOV R31,R17
F07D 2E02 MOV R0,R18
F07E 2E13 MOV R1,R19
(0063) "mov r31,r17\n" //Z寄存器中为填冲页内地址
(0064) "mov r0,r18\n"
(0065) "mov r1,r19\n"); //R0R1中为一个指令字
(0066) SPMCSR = 0x01;
F07F E081 LDI R24,1
F080 93800068 STS 0x68,R24
(0067) asm("spm\n");
F082 95E8 SPM
F083 9508 RET
(0068) }
(0069) //============================================================
(0070) //函 数:void wait_page_rw_ok(void)
(0071) //功 能:等待一个Flash页的写完成
(0072) //入口参数:无
(0073) //返 回 值:无
(0074) //设 计 者:覃道堂
(0075) //创作时间:2006-03-16
(0076) //修改时间:
(0077) //修改目的:
(0078) //============================================================
(0079) void wait_page_rw_ok(void)
(0080) {
_wait_page_rw_ok:
F084 C008 RJMP 0xF08D
(0081) while(SPMCSR & 0x40)
(0082) {
(0083) while(SPMCSR & 0x01);
F085 90200068 LDS R2,0x68
F087 FC20 SBRC R2,0
F088 CFFC RJMP 0xF085
(0084) SPMCSR = 0x11;
F089 E181 LDI R24,0x11
F08A 93800068 STS 0x68,R24
(0085) asm("spm\n");
F08C 95E8 SPM
F08D 90200068 LDS R2,0x68
F08F FC26 SBRC R2,6
F090 CFF4 RJMP 0xF085
F091 9508 RET
_write_one_page:
i --> R20
F092 940EF5FF CALL push_gset1
F094 9721 SBIW R28,1
(0086) }
(0087) }
(0088) //============================================================
(0089) //函 数:void write_one_page(void)
(0090) //功 能:一页处理完成
(0091) //入口参数:无
(0092) //返 回 值:无
(0093) //设 计 者:覃道堂
(0094) //创作时间:2006-03-16
(0095) //修改时间:
(0096) //修改目的:
(0097) //============================================================
(0098) void write_one_page(void)
(0099) {
(0100) int i;
(0101) boot_page_ew(address,0x03); //擦除一个Flash页
F095 E083 LDI R24,3
F096 8388 STD Y+0,R24
F097 91200104 LDS R18,address+2
F099 91300105 LDS R19,address+3
F09B 91000102 LDS R16,address
F09D 91100103 LDS R17,address+1
F09F DFD0 RCALL _boot_page_ew
(0102) wait_page_rw_ok(); //等待擦除完成
F0A0 DFE3 RCALL _wait_page_rw_ok
(0103) for(i = 0;i < SPM_PAGESIZE;i += 2) //将数据填入Flash缓冲页中
F0A1 2744 CLR R20
F0A2 2755 CLR R21
(0104) {
(0105) boot_page_fill(i, data[i]+(data[i+1]<<8));
F0A3 E087 LDI R24,7
F0A4 E091 LDI R25,1
F0A5 01FA MOVW R30,R20
F0A6 0FE8 ADD R30,R24
F0A7 1FF9 ADC R31,R25
F0A8 8020 LDD R2,Z+0
F0A9 2433 CLR R3
F0AA 2C32 MOV R3,R2
F0AB 2422 CLR R2
F0AC E086 LDI R24,6
F0AD E091 LDI R25,1
F0AE 01FA MOVW R30,R20
F0AF 0FE8 ADD R30,R24
F0B0 1FF9 ADC R31,R25
F0B1 8120 LDD R18,Z+0
F0B2 2733 CLR R19
F0B3 0D22 ADD R18,R2
F0B4 1D33 ADC R19,R3
F0B5 018A MOVW R16,R20
F0B6 DFC4 RCALL _boot_page_fill
F0B7 5F4E SUBI R20,0xFE
F0B8 4F5F SBCI R21,0xFF
F0B9 3040 CPI R20,0
F0BA E0E1 LDI R30,1
F0BB 075E CPC R21,R30
F0BC F334 BLT 0xF0A3
(0106) }
(0107) boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
F0BD E085 LDI R24,5
F0BE 8388 STD Y+0,R24
F0BF 91200104 LDS R18,address+2
F0C1 91300105 LDS R19,address+3
F0C3 91000102 LDS R16,address
F0C5 91100103 LDS R17,address+1
F0C7 DFA8 RCALL _boot_page_ew
(0108) wait_page_rw_ok(); //等待写入完成
F0C8 DFBB RCALL _wait_page_rw_ok
F0C9 9621 ADIW R28,1
F0CA 940EF602 CALL pop_gset1
F0CC 9508 RET
(0109) }
(0110)
(0111) //============================================================
(0112) //函 数:void quit(void)
(0113) //功 能:跳转程序运行
(0114) //入口参数:无
(0115) //返 回 值:无
(0116) //设 计 者:覃道堂
(0117) //创作时间:2006-03-16
(0118) //修改时间:
(0119) //修改目的:
(0120) //============================================================
(0121) void quit(void)
(0122) {
(0123) MCUCR = 0x01;
_quit:
F0CD E081 LDI R24,1
F0CE BF85 OUT 0x35,R24
(0124) MCUCR = 0x00;
F0CF 2422 CLR R2
F0D0 BE25 OUT 0x35,R2
(0125) RAMPZ = 0x00;
F0D1 BE2B OUT 0x3B,R2
(0126) asm("jmp 0x0000\n");
F0D2 940C0000 JMP 0x0
F0D4 9508 RET
_Flow_Control:
CRC_Value --> R10
Wrong_Cnt --> R12
Rec_Len --> R14
bPiont --> Y+4
F0D5 940EF5F7 CALL push_gset5
F0D7 9726 SBIW R28,6
(0127) }
(0128)
(0129) //============================================================
(0130) //函 数:unsigned char Flow_Control(void)
(0131) //功 能:下载函数控制
(0132) //入口参数:ReceiveBuf接收数据,data写入Flash数据
(0133) //返 回 值:0成功,否则失败
(0134) //设 计 者:覃道堂
(0135) //创作时间:2006-03-16
(0136) //修改时间:
(0137) //修改目的:
(0138) //============================================================
(0139) unsigned char Flow_Control(void)
(0140) {
(0141) int bPiont = 0;
F0D8 2400 CLR R0
F0D9 2411 CLR R1
F0DA 821D STD Y+5,R1
F0DB 820C STD Y+4,R0
(0142) unsigned char Rec_Len;
(0143) unsigned char Wrong_Cnt = 0;
F0DC 24CC CLR R12
F0DD C098 RJMP 0xF176
(0144) unsigned short CRC_Value;
(0145)
(0146) while(Wrong_Cnt < 3)
(0147) {
(0148) Rec_Len = Uart_Receive_Frame(ReceiveBuf, 10);
F0DE E02A LDI R18,0xA
F0DF E030 LDI R19,0
F0E0 E006 LDI R16,6
F0E1 E012 LDI R17,2
F0E2 940EF36B CALL _Uart_Receive_Frame
F0E4 2EE0 MOV R14,R16
(0149) if(Rec_Len)//收到数据吗?没有等待数据
F0E5 2300 TST R16
F0E6 F409 BNE 0xF0E8
F0E7 C08E RJMP 0xF176
(0150) {
(0151) if((ReceiveBuf[3] == 'E')&&(ReceiveBuf[4] == 'N')&&(ReceiveBuf[5] == 'D'))
F0E8 91800209 LDS R24,ReceiveBuf+3
F0EA 3485 CPI R24,0x45
F0EB F449 BNE 0xF0F5
F0EC 9180020A LDS R24,0x20A
F0EE 348E CPI R24,0x4E
F0EF F429 BNE 0xF0F5
F0F0 9180020B LDS R24,0x20B
F0F2 3484 CPI R24,0x44
F0F3 F409 BNE 0xF0F5
(0152) {
(0153) break; //如果收到END终止
F0F4 C085 RJMP 0xF17A
(0154) }
(0155) else
(0156) {
(0157) CRC_Value = Verify_Command(ReceiveBuf,Rec_Len);
F0F5 2D2E MOV R18,R14
F0F6 2733 CLR R19
F0F7 E006 LDI R16,6
F0F8 E012 LDI R17,2
F0F9 940EF306 CALL _Verify_Command
F0FB 2EA0 MOV R10,R16
F0FC 24BB CLR R11
(0158) if(CRC_Value == 0)
F0FD 20AA TST R10
F0FE F009 BEQ 0xF100
F0FF C06B RJMP 0xF16B
F100 20BB TST R11
F101 F009 BEQ 0xF103
F102 C068 RJMP 0xF16B
(0159) {
(0160) if(bPiont == 0)
F103 800C LDD R0,Y+4
F104 801D LDD R1,Y+5
F105 2000 TST R0
F106 F4F1 BNE 0xF125
F107 2011 TST R1
F108 F4E1 BNE 0xF125
(0161) {
(0162) for(bPiont = 0; bPiont < 128; bPiont ++)
F109 2400 CLR R0
F10A 2411 CLR R1
F10B 821D STD Y+5,R1
F10C 820C STD Y+4,R0
(0163) data[bPiont] = ReceiveBuf[bPiont+5];
F10D E08B LDI R24,0xB
F10E E092 LDI R25,2
F10F 81EC LDD R30,Y+4
F110 81FD LDD R31,Y+5
F111 0FE8 ADD R30,R24
F112 1FF9 ADC R31,R25
F113 8020 LDD R2,Z+0
F114 E086 LDI R24,6
F115 E091 LDI R25,1
F116 81EC LDD R30,Y+4
F117 81FD LDD R31,Y+5
F118 0FE8 ADD R30,R24
F119 1FF9 ADC R31,R25
F11A 8220 STD Z+0,R2
F11B 818C LDD R24,Y+4
F11C 819D LDD R25,Y+5
F11D 9601 ADIW R24,1
F11E 839D STD Y+5,R25
F11F 838C STD Y+4,R24
F120 3880 CPI R24,0x80
F121 E0E0 LDI R30,0
F122 079E CPC R25,R30
F123 F34C BLT 0xF10D
(0164) }
F124 C038 RJMP 0xF15D
(0165) else
(0166) {
(0167) for(bPiont = 128; bPiont < 256; bPiont ++)
F125 E880 LDI R24,0x80
F126 E090 LDI R25,0
F127 839D STD Y+5,R25
F128 838C STD Y+4,R24
(0168) data[bPiont] = ReceiveBuf[bPiont-128+5];
F129 E88B LDI R24,0x8B
F12A E091 LDI R25,1
F12B 81EC LDD R30,Y+4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -