📄 main.lis
字号:
.module main.c
.area data(ram, con, rel)
0000 _bPiont::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile E:\程序\AVR程序\BOOTLoadICC\main.c
0002 .dbsym e bPiont _bPiont i
0002 _address::
0002 .blkb 4
.area idata
0002 00000000 .word 0,0
.area data(ram, con, rel)
0006 .dbfile E:\程序\AVR程序\BOOTLoadICC\main.c
0006 .dbsym e address _address l
.area text(rom, con, rel)
0000 .dbfile E:\程序\AVR程序\BOOTLoadICC\main.c
0000 .dbfunc e boot_page_ew _boot_page_ew fV
0000 ; code -> y+4
0000 ; p_address -> y+0
.even
0000 _boot_page_ew::
0000 0E940000 xcall push_arg4
0004 .dbline -1
0004 .dbline 43
0004 ; #include <iom128v.h>
0004 ; #include "Eeprom128.h"
0004 ; #include "Rtc8025.h"
0004 ; #include "Uart.h"
0004 ; #include "Crc.h"
0004 ;
0004 ; #define BOOT_TEST 0
0004 ;
0004 ; //============================================================
0004 ; //无线错误下载设置错误代码定义
0004 ; #define ERR_CONNECT 0x10//表示握手信号接收不对;
0004 ; #define ERR_COMMANDCRC 0x11//表示接收命令校验错误;
0004 ; #define ERR_DATACRC 0x12//表示接收数据不正确,要求丛发数据;
0004 ; #define ERR_OVERTIME 0x13//表示接收数据超时;
0004 ; #define ERR_NOCOMMAND 0x14//没有该指令;
0004 ; #define ERR_SETTING 0x15//设置参数失败;
0004 ; #define ERR_READTIME 0x16//读取系统时钟失败;
0004 ;
0004 ; //============================================================
0004 ; //定义写Flash一页的长度,同时声明数据Buffer
0004 ; #define SPM_PAGESIZE 256
0004 ; unsigned char SendData[100];
0004 ; unsigned char SendBuf[100];
0004 ; unsigned char ReceiveBuf[150];
0004 ; unsigned char data[SPM_PAGESIZE];
0004 ;
0004 ; //============================================================
0004 ; //定义接收数据的起点和写FLASH的起始地址
0004 ; unsigned int bPiont = 0;
0004 ; unsigned long address= 0x0000;
0004 ;
0004 ; //============================================================
0004 ; //函 数:void boot_page_ew(long p_address,char code)
0004 ; //功 能:读写FLASH数据
0004 ; //入口参数:地址,命令字03擦除,05写入
0004 ; //返 回 值:无
0004 ; //设 计 者:覃道堂
0004 ; //创作时间:2006-03-16
0004 ; //修改时间:
0004 ; //修改目的:
0004 ; //============================================================
0004 ; void boot_page_ew(long p_address,char code)
0004 ; {
0004 .dbline 44
0004 ; asm("mov r30,r16\n"
0004 E02F mov r30,r16
0006 F12F mov r31,r17
0008 2BBF out 0x3b,r18
000A
000A .dbline 47
000A ; "mov r31,r17\n"
000A ; "out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
000A ; SPMCSR = code; //寄存器SPMCSR中为操作码
000A 0C80 ldd R0,y+4
000C 00926800 sts 104,R0
0010 .dbline 48
0010 ; asm("spm\n"); //对指定Flash页进行操作
0010 E895 spm
0012
0012 .dbline -2
0012 L1:
0012 2496 adiw R28,4
0014 .dbline 0 ; func end
0014 0895 ret
0016 .dbsym l code 4 c
0016 .dbsym l p_address 0 L
0016 .dbend
0016 .dbfunc e boot_page_fill _boot_page_fill fV
0016 ; data -> R18,R19
0016 ; address -> R16,R17
.even
0016 _boot_page_fill::
0016 .dbline -1
0016 .dbline 61
0016 ; }
0016 ; //============================================================
0016 ; //函 数:void boot_page_fill(unsigned int address,int data)
0016 ; //功 能:填充Flash缓冲页中的一个字
0016 ; //入口参数:地址和数据
0016 ; //返 回 值:无
0016 ; //设 计 者:覃道堂
0016 ; //创作时间:2006-03-16
0016 ; //修改时间:
0016 ; //修改目的:
0016 ; //============================================================
0016 ; void boot_page_fill(unsigned int address,int data)
0016 ; {
0016 .dbline 62
0016 ; asm("mov r30,r16\n"
0016 E02F mov r30,r16
0018 F12F mov r31,r17
001A 022E mov r0,r18
001C 132E mov r1,r19
001E
001E .dbline 66
001E ; "mov r31,r17\n" //Z寄存器中为填冲页内地址
001E ; "mov r0,r18\n"
001E ; "mov r1,r19\n"); //R0R1中为一个指令字
001E ; SPMCSR = 0x01;
001E 81E0 ldi R24,1
0020 80936800 sts 104,R24
0024 .dbline 67
0024 ; asm("spm\n");
0024 E895 spm
0026
0026 .dbline -2
0026 L2:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r data 18 I
0028 .dbsym r address 16 i
0028 .dbend
0028 .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
0028 _wait_page_rw_ok::
0028 .dbline -1
0028 .dbline 80
0028 ; }
0028 ; //============================================================
0028 ; //函 数:void wait_page_rw_ok(void)
0028 ; //功 能:等待一个Flash页的写完成
0028 ; //入口参数:无
0028 ; //返 回 值:无
0028 ; //设 计 者:覃道堂
0028 ; //创作时间:2006-03-16
0028 ; //修改时间:
0028 ; //修改目的:
0028 ; //============================================================
0028 ; void wait_page_rw_ok(void)
0028 ; {
0028 08C0 xjmp L5
002A X0:
002A .dbline 82
002A ; while(SPMCSR & 0x40)
002A ; {
002A L7:
002A .dbline 83
002A L8:
002A .dbline 83
002A 20906800 lds R2,104
002E 20FC sbrc R2,0
0030 FCCF rjmp L7
0032 .dbline 84
0032 81E1 ldi R24,17
0034 80936800 sts 104,R24
0038 .dbline 85
0038 E895 spm
003A
003A .dbline 86
003A L5:
003A .dbline 81
003A 20906800 lds R2,104
003E 26FC sbrc R2,6
0040 F4CF rjmp L8
0042 .dbline -2
0042 L3:
0042 .dbline 0 ; func end
0042 0895 ret
0044 .dbend
0044 .dbfunc e write_one_page _write_one_page fV
0044 ; i -> R20,R21
.even
0044 _write_one_page::
0044 0E940000 xcall push_gset1
0048 2197 sbiw R28,1
004A .dbline -1
004A .dbline 99
004A ; while(SPMCSR & 0x01);
004A ; SPMCSR = 0x11;
004A ; asm("spm\n");
004A ; }
004A ; }
004A ; //============================================================
004A ; //函 数:void write_one_page(void)
004A ; //功 能:一页处理完成
004A ; //入口参数:无
004A ; //返 回 值:无
004A ; //设 计 者:覃道堂
004A ; //创作时间:2006-03-16
004A ; //修改时间:
004A ; //修改目的:
004A ; //============================================================
004A ; void write_one_page(void)
004A ; {
004A .dbline 101
004A ; int i;
004A ; boot_page_ew(address,0x03); //擦除一个Flash页
004A 83E0 ldi R24,3
004C 8883 std y+0,R24
004E 20910400 lds R18,_address+2
0052 30910500 lds R19,_address+2+1
0056 00910200 lds R16,_address
005A 10910300 lds R17,_address+1
005E D0DF xcall _boot_page_ew
0060 .dbline 102
0060 ; wait_page_rw_ok(); //等待擦除完成
0060 E3DF xcall _wait_page_rw_ok
0062 .dbline 103
0062 ; for(i = 0;i < SPM_PAGESIZE;i += 2) //将数据填入Flash缓冲页中
0062 4427 clr R20
0064 5527 clr R21
0066 L11:
0066 .dbline 104
0066 .dbline 105
0066 80E0 ldi R24,<_data+1
0068 90E0 ldi R25,>_data+1
006A FA01 movw R30,R20
006C E80F add R30,R24
006E F91F adc R31,R25
0070 2080 ldd R2,z+0
0072 3324 clr R3
0074 322C mov R3,R2
0076 2224 clr R2
0078 80E0 ldi R24,<_data
007A 90E0 ldi R25,>_data
007C FA01 movw R30,R20
007E E80F add R30,R24
0080 F91F adc R31,R25
0082 2081 ldd R18,z+0
0084 3327 clr R19
0086 220D add R18,R2
0088 331D adc R19,R3
008A 8A01 movw R16,R20
008C C4DF xcall _boot_page_fill
008E .dbline 106
008E L12:
008E .dbline 103
008E 4E5F subi R20,254 ; offset = 2
0090 5F4F sbci R21,255
0092 .dbline 103
0092 4030 cpi R20,0
0094 E1E0 ldi R30,1
0096 5E07 cpc R21,R30
0098 34F3 brlt L11
009A .dbline 107
009A ; {
009A ; boot_page_fill(i, data[i]+(data[i+1]<<8));
009A ; }
009A ; boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
009A 85E0 ldi R24,5
009C 8883 std y+0,R24
009E 20910400 lds R18,_address+2
00A2 30910500 lds R19,_address+2+1
00A6 00910200 lds R16,_address
00AA 10910300 lds R17,_address+1
00AE A8DF xcall _boot_page_ew
00B0 .dbline 108
00B0 ; wait_page_rw_ok(); //等待写入完成
00B0 BBDF xcall _wait_page_rw_ok
00B2 .dbline -2
00B2 L10:
00B2 2196 adiw R28,1
00B4 0E940000 xcall pop_gset1
00B8 .dbline 0 ; func end
00B8 0895 ret
00BA .dbsym r i 20 I
00BA .dbend
00BA .dbfunc e quit _quit fV
.even
00BA _quit::
00BA .dbline -1
00BA .dbline 122
00BA ; }
00BA ;
00BA ; //============================================================
00BA ; //函 数:void quit(void)
00BA ; //功 能:跳转程序运行
00BA ; //入口参数:无
00BA ; //返 回 值:无
00BA ; //设 计 者:覃道堂
00BA ; //创作时间:2006-03-16
00BA ; //修改时间:
00BA ; //修改目的:
00BA ; //============================================================
00BA ; void quit(void)
00BA ; {
00BA .dbline 123
00BA ; MCUCR = 0x01;
00BA 81E0 ldi R24,1
00BC 85BF out 0x35,R24
00BE .dbline 124
00BE ; MCUCR = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -