📄 newmain.lis
字号:
.module newmain.c
.area data(ram, con, rel)
0000 _address::
0000 .blkb 4
.area idata
0000 00000000 .word 0,0
.area data(ram, con, rel)
0004 .dbfile E:\cqt\cqt_boot\newmain.c
0004 .dbsym e address _address L
.area text(rom, con, rel)
0000 .dbfile E:\cqt\cqt_boot\newmain.c
0000 .dbfunc e delay_us _delay_us fV
0000 ; time -> R16,R17
.even
0000 _delay_us::
0000 .dbline -1
0000 .dbline 30
0000 ;
0000 ; #include <macros.h>
0000 ; #include <iom128v.h>
0000 ; #include <eeprom.h>
0000 ; #include <string.h>
0000 ; #define SPM_PAGESIZE 256 //M128的一个Flash页为256字节(128字)
0000 ; #define DATA_BUFFER_SIZE SPM_PAGESIZE
0000 ; //定义at45db161 控制I/O
0000 ; #define CS 4 //PB4 at45db161 片选
0000 ; #define BUSY 5 //PB5 at45db161 忙
0000 ; #define WP 6 //PB6 at45db161 写
0000 ; #define RESET 7 //PB7 at45db161 复位
0000 ;
0000 ;
0000 ; //定义全局变量
0000 ;
0000 ; char data[DATA_BUFFER_SIZE];
0000 ; unsigned char Senddata[30];
0000 ; long Filelength;
0000 ; long address = 0;
0000 ; unsigned int page_counter_rd;
0000 ; unsigned int page_offset_rd;
0000 ;
0000 ; unsigned char lengthbak1,lengthbak2;
0000 ; int timenum;
0000 ; int length;length1;
0000 ; unsigned char ROK_flag,Num;
0000 ; //延时
0000 ; void delay_us(int time)
0000 ; {
0000 L2:
0000 .dbline 32
0000 ; do
0000 ; {
0000 .dbline 33
0000 ; time--;
0000 0150 subi R16,1
0002 1040 sbci R17,0
0004 .dbline 34
0004 ; }
0004 L3:
0004 .dbline 35
0004 ; while (time!=0);
0004 0030 cpi R16,0
0006 0107 cpc R16,R17
0008 D9F7 brne L2
000A X0:
000A .dbline -2
000A L1:
000A .dbline 0 ; func end
000A 0895 ret
000C .dbsym r time 16 I
000C .dbend
000C .dbfunc e boot_page_ew _boot_page_ew fV
000C ; code -> y+4
000C ; p_address -> y+0
.even
000C _boot_page_ew::
000C 0E940000 xcall push_arg4
0010 .dbline -1
0010 .dbline 41
0010 ; }
0010 ;
0010 ;
0010 ; //擦除(code=0x03)和写入(code=0x05)一个Flash页
0010 ; void boot_page_ew(long p_address,char code)
0010 ; {
0010 .dbline 42
0010 ; asm("mov r30,r16\n"
0010 E02F mov r30,r16
0012 F12F mov r31,r17
0014 2BBF out 0x3b,r18
0016
0016 .dbline 45
0016 ; "mov r31,r17\n"
0016 ; "out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
0016 ; SPMCSR = code; //寄存器SPMCSR中为操作码
0016 0C80 ldd R0,y+4
0018 00926800 sts 104,R0
001C .dbline 46
001C ; asm("spm\n"); //对指定Flash页进行操作
001C E895 spm
001E
001E .dbline -2
001E L5:
001E 2496 adiw R28,4
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym l code 4 c
0022 .dbsym l p_address 0 L
0022 .dbend
0022 .dbfunc e boot_page_fill _boot_page_fill fV
0022 ; data -> R18,R19
0022 ; address -> R16,R17
.even
0022 _boot_page_fill::
0022 .dbline -1
0022 .dbline 50
0022 ; }
0022 ; //填充Flash缓冲页中的一个字
0022 ; void boot_page_fill(unsigned int address,int data)
0022 ; {
0022 .dbline 51
0022 ; asm("mov r30,r16\n"
0022 E02F mov r30,r16
0024 F12F mov r31,r17
0026 022E mov r0,r18
0028 132E mov r1,r19
002A
002A .dbline 55
002A ; "mov r31,r17\n" //Z寄存器中为填冲页内地址
002A ; "mov r0,r18\n"
002A ; "mov r1,r19\n"); //R0R1中为一个指令字
002A ; SPMCSR = 0x01;
002A 81E0 ldi R24,1
002C 80936800 sts 104,R24
0030 .dbline 56
0030 ; asm("spm\n");
0030 E895 spm
0032
0032 .dbline -2
0032 L6:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbsym r data 18 I
0034 .dbsym r address 16 i
0034 .dbend
0034 .dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
0034 _wait_page_rw_ok::
0034 .dbline -1
0034 .dbline 60
0034 ; }
0034 ; //等待一个Flash页的写完成
0034 ; void wait_page_rw_ok(void)
0034 ; {
0034 08C0 xjmp L9
0036 X1:
0036 .dbline 62
0036 ; while(SPMCSR & 0x40)
0036 ; {
0036 L11:
0036 .dbline 63
0036 L12:
0036 .dbline 63
0036 20906800 lds R2,104
003A 20FC sbrc R2,0
003C FCCF rjmp L11
003E .dbline 64
003E 81E1 ldi R24,17
0040 80936800 sts 104,R24
0044 .dbline 65
0044 E895 spm
0046
0046 .dbline 66
0046 L9:
0046 .dbline 61
0046 20906800 lds R2,104
004A 26FC sbrc R2,6
004C F4CF rjmp L12
004E .dbline -2
004E L7:
004E .dbline 0 ; func end
004E 0895 ret
0050 .dbend
0050 .dbfunc e write_one_page _write_one_page fV
0050 ; i -> R20,R21
.even
0050 _write_one_page::
0050 0E940000 xcall push_gset1
0054 2197 sbiw R28,1
0056 .dbline -1
0056 .dbline 70
0056 ; while(SPMCSR & 0x01);
0056 ; SPMCSR = 0x11;
0056 ; asm("spm\n");
0056 ; }
0056 ; }
0056 ; //更新一个Flash页的完整处理
0056 ; void write_one_page(void)
0056 ; {
0056 .dbline 72
0056 ; int i;
0056 ; boot_page_ew(address,0x03); //擦除一个Flash页
0056 83E0 ldi R24,3
0058 8883 std y+0,R24
005A 20910200 lds R18,_address+2
005E 30910300 lds R19,_address+2+1
0062 00910000 lds R16,_address
0066 10910100 lds R17,_address+1
006A D0DF xcall _boot_page_ew
006C .dbline 73
006C ; wait_page_rw_ok(); //等待擦除完成
006C E3DF xcall _wait_page_rw_ok
006E .dbline 74
006E ; for(i=0;i<SPM_PAGESIZE;i+=2) //jia
006E 4427 clr R20
0070 5527 clr R21
0072 L15:
0072 .dbline 75
0072 .dbline 76
0072 80E0 ldi R24,<_data+1
0074 90E0 ldi R25,>_data+1
0076 FA01 movw R30,R20
0078 E80F add R30,R24
007A F91F adc R31,R25
007C 2080 ldd R2,z+0
007E 3324 clr R3
0080 322C mov R3,R2
0082 2224 clr R2
0084 80E0 ldi R24,<_data
0086 90E0 ldi R25,>_data
0088 FA01 movw R30,R20
008A E80F add R30,R24
008C F91F adc R31,R25
008E 2081 ldd R18,z+0
0090 3327 clr R19
0092 220D add R18,R2
0094 331D adc R19,R3
0096 8A01 movw R16,R20
0098 C4DF xcall _boot_page_fill
009A .dbline 77
009A L16:
009A .dbline 74
009A 4E5F subi R20,254 ; offset = 2
009C 5F4F sbci R21,255
009E .dbline 74
009E 4030 cpi R20,0
00A0 E1E0 ldi R30,1
00A2 5E07 cpc R21,R30
00A4 34F3 brlt L15
00A6 .dbline 78
00A6 ; {
00A6 ; boot_page_fill(i, data[i]+(data[i+1]<<8));
00A6 ; }
00A6 ; boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
00A6 85E0 ldi R24,5
00A8 8883 std y+0,R24
00AA 20910200 lds R18,_address+2
00AE 30910300 lds R19,_address+2+1
00B2 00910000 lds R16,_address
00B6 10910100 lds R17,_address+1
00BA A8DF xcall _boot_page_ew
00BC .dbline 79
00BC ; wait_page_rw_ok(); //等待写入完成
00BC BBDF xcall _wait_page_rw_ok
00BE .dbline -2
00BE L14:
00BE 2196 adiw R28,1
00C0 0E940000 xcall pop_gset1
00C4 .dbline 0 ; func end
00C4 0895 ret
00C6 .dbsym r i 20 I
00C6 .dbend
00C6 .dbfunc e quit _quit fV
.even
00C6 _quit::
00C6 .dbline -1
00C6 .dbline 84
00C6 ; }
00C6 ;
00C6 ; //退出Bootloader程序,从0x0000处执行应用程序
00C6 ; void quit(void)
00C6 ; {
00C6 .dbline 85
00C6 ; MCUCR = 0x01;
00C6 81E0 ldi R24,1
00C8 85BF out 0x35,R24
00CA .dbline 86
00CA ; MCUCR = 0x00; //将中断向量表迁移到应用程序区头部
00CA 2224 clr R2
00CC 25BE out 0x35,R2
00CE .dbline 87
00CE ; RAMPZ = 0x00; //RAMPZ清零初始化
00CE 2BBE out 0x3b,R2
00D0 .dbline 88
00D0 ; asm("jmp 0x0000\n"); //跳转到Flash的0x0000处,执行用户的应用程序
00D0 0C940000 jmp 0x0000
00D4
00D4 .dbline -2
00D4 L20:
00D4 .dbline 0 ; func end
00D4 0895 ret
00D6 .dbend
00D6 .dbfunc e Init_mag128 _Init_mag128 fV
.even
00D6 _Init_mag128::
00D6 .dbline -1
00D6 .dbline 92
00D6 ; }
00D6 ; //初始化I/O
00D6 ; void Init_mag128(void)
00D6 ; {
00D6 .dbline 93
00D6 ; PORTA = 0x00;
00D6 2224 clr R2
00D8 2BBA out 0x1b,R2
00DA .dbline 94
00DA ; DDRA = 0x00;
00DA 2ABA out 0x1a,R2
00DC .dbline 95
00DC ; PORTB = 0xd7;
00DC 87ED ldi R24,215
00DE 88BB out 0x18,R24
00E0 .dbline 96
00E0 ; DDRB = 0xd7;
00E0 87BB out 0x17,R24
00E2 .dbline 97
00E2 ; PORTC = 0xff; //m103 output only
00E2 8FEF ldi R24,255
00E4 85BB out 0x15,R24
00E6 .dbline 98
00E6 ; DDRC = 0x00;
00E6 24BA out 0x14,R2
00E8 .dbline 99
00E8 ; PORTD = 0x01;
00E8 81E0 ldi R24,1
00EA 82BB out 0x12,R24
00EC .dbline 100
00EC ; DDRD = 0xf1;
00EC 81EF ldi R24,241
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -