📄 main.s.bak.bak
字号:
.module main.c
.area data(ram, con, rel)
_bPiont::
.blkb 2
.area idata
.word 0
.area data(ram, con, rel)
.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.c
.dbsym e bPiont _bPiont i
_address::
.blkb 4
.area idata
.word 0,0
.area data(ram, con, rel)
.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.c
.dbsym e address _address l
.area text(rom, con, rel)
.dbfile F:\AVR_Modem\Boot_TEST\BOOTLoadICC\main.c
.dbfunc e boot_page_ew _boot_page_ew fV
; code -> y+4
; p_address -> y+0
.even
_boot_page_ew::
xcall push_arg4
.dbline -1
.dbline 43
; #include <iom128v.h>
; #include "Eeprom128.h"
; #include "Rtc8025.h"
; #include "Uart.h"
; #include "Crc.h"
;
; #define BOOT_TEST 0
;
; //============================================================
; //无线错误下载设置错误代码定义
; #define ERR_CONNECT 0x10//表示握手信号接收不对;
; #define ERR_COMMANDCRC 0x11//表示接收命令校验错误;
; #define ERR_DATACRC 0x12//表示接收数据不正确,要求丛发数据;
; #define ERR_OVERTIME 0x13//表示接收数据超时;
; #define ERR_NOCOMMAND 0x14//没有该指令;
; #define ERR_SETTING 0x15//设置参数失败;
; #define ERR_READTIME 0x16//读取系统时钟失败;
;
; //============================================================
; //定义写Flash一页的长度,同时声明数据Buffer
; #define SPM_PAGESIZE 256
; unsigned char SendData[100];
; unsigned char SendBuf[100];
; unsigned char ReceiveBuf[150];
; unsigned char data[SPM_PAGESIZE];
;
; //============================================================
; //定义接收数据的起点和写FLASH的起始地址
; unsigned int bPiont = 0;
; unsigned long address= 0x0000;
;
; //============================================================
; //函 数:void boot_page_ew(long p_address,char code)
; //功 能:读写FLASH数据
; //入口参数:地址,命令字03擦除,05写入
; //返 回 值:无
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void boot_page_ew(long p_address,char code)
; {
.dbline 44
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
out 0x3b,r18
.dbline 47
; "mov r31,r17\n"
; "out 0x3b,r18\n"); //将页地址放入Z寄存器和RAMPZ的Bit0中
; SPMCSR = code; //寄存器SPMCSR中为操作码
ldd R0,y+4
sts 104,R0
.dbline 48
; asm("spm\n"); //对指定Flash页进行操作
spm
.dbline -2
L1:
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l code 4 c
.dbsym l p_address 0 L
.dbend
.dbfunc e boot_page_fill _boot_page_fill fV
; data -> R18,R19
; address -> R16,R17
.even
_boot_page_fill::
.dbline -1
.dbline 61
; }
; //============================================================
; //函 数:void boot_page_fill(unsigned int address,int data)
; //功 能:填充Flash缓冲页中的一个字
; //入口参数:地址和数据
; //返 回 值:无
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void boot_page_fill(unsigned int address,int data)
; {
.dbline 62
; asm("mov r30,r16\n"
mov r30,r16
mov r31,r17
mov r0,r18
mov r1,r19
.dbline 66
; "mov r31,r17\n" //Z寄存器中为填冲页内地址
; "mov r0,r18\n"
; "mov r1,r19\n"); //R0R1中为一个指令字
; SPMCSR = 0x01;
ldi R24,1
sts 104,R24
.dbline 67
; asm("spm\n");
spm
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r data 18 I
.dbsym r address 16 i
.dbend
.dbfunc e wait_page_rw_ok _wait_page_rw_ok fV
.even
_wait_page_rw_ok::
.dbline -1
.dbline 80
; }
; //============================================================
; //函 数:void wait_page_rw_ok(void)
; //功 能:等待一个Flash页的写完成
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void wait_page_rw_ok(void)
; {
xjmp L5
X0:
.dbline 82
; while(SPMCSR & 0x40)
; {
L7:
.dbline 83
L8:
.dbline 83
lds R2,104
sbrc R2,0
rjmp L7
.dbline 84
ldi R24,17
sts 104,R24
.dbline 85
spm
.dbline 86
L5:
.dbline 81
lds R2,104
sbrc R2,6
rjmp L8
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e write_one_page _write_one_page fV
; i -> R20,R21
.even
_write_one_page::
xcall push_gset1
sbiw R28,1
.dbline -1
.dbline 99
; while(SPMCSR & 0x01);
; SPMCSR = 0x11;
; asm("spm\n");
; }
; }
; //============================================================
; //函 数:void write_one_page(void)
; //功 能:一页处理完成
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void write_one_page(void)
; {
.dbline 101
; int i;
; boot_page_ew(address,0x03); //擦除一个Flash页
ldi R24,3
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 102
; wait_page_rw_ok(); //等待擦除完成
xcall _wait_page_rw_ok
.dbline 103
; for(i = 0;i < SPM_PAGESIZE;i += 2) //将数据填入Flash缓冲页中
clr R20
clr R21
L11:
.dbline 104
.dbline 105
ldi R24,<_data+1
ldi R25,>_data+1
movw R30,R20
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
ldi R24,<_data
ldi R25,>_data
movw R30,R20
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
add R18,R2
adc R19,R3
movw R16,R20
xcall _boot_page_fill
.dbline 106
L12:
.dbline 103
subi R20,254 ; offset = 2
sbci R21,255
.dbline 103
cpi R20,0
ldi R30,1
cpc R21,R30
brlt L11
.dbline 107
; {
; boot_page_fill(i, data[i]+(data[i+1]<<8));
; }
; boot_page_ew(address,0x05); //将缓冲页数据写入一个Flash页
ldi R24,5
std y+0,R24
lds R18,_address+2
lds R19,_address+2+1
lds R16,_address
lds R17,_address+1
xcall _boot_page_ew
.dbline 108
; wait_page_rw_ok(); //等待写入完成
xcall _wait_page_rw_ok
.dbline -2
L10:
adiw R28,1
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 I
.dbend
.dbfunc e quit _quit fV
.even
_quit::
.dbline -1
.dbline 122
; }
;
; //============================================================
; //函 数:void quit(void)
; //功 能:跳转程序运行
; //入口参数:无
; //返 回 值:无
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; void quit(void)
; {
.dbline 123
; MCUCR = 0x01;
ldi R24,1
out 0x35,R24
.dbline 124
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 125
; RAMPZ = 0x00;
out 0x3b,R2
.dbline 126
; asm("jmp 0x0000\n");
jmp 0x0000
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Flow_Control _Flow_Control fc
; CRC_Value -> R10,R11
; Wrong_Cnt -> R12
; Rec_Len -> R14
; bPiont -> y+4
.even
_Flow_Control::
xcall push_gset5
sbiw R28,6
.dbline -1
.dbline 140
; }
;
; //============================================================
; //函 数:unsigned char Flow_Control(void)
; //功 能:下载函数控制
; //入口参数:ReceiveBuf接收数据,data写入Flash数据
; //返 回 值:0成功,否则失败
; //设 计 者:陈祖安
; //创作时间:2006-03-16
; //修改时间:
; //修改目的:
; //============================================================
; unsigned char Flow_Control(void)
; {
.dbline 141
; int bPiont = 0;
clr R0
clr R1
std y+5,R1
std y+4,R0
.dbline 143
; unsigned char Rec_Len;
; unsigned char Wrong_Cnt = 0;
clr R12
xjmp L19
L18:
.dbline 147
; unsigned short CRC_Value;
;
; while(Wrong_Cnt < 3)
; {
.dbline 148
; Rec_Len = Uart_Receive_Frame(ReceiveBuf, 10);
ldi R18,10
ldi R19,0
ldi R16,<_ReceiveBuf
ldi R17,>_ReceiveBuf
xcall _Uart_Receive_Frame
mov R14,R16
.dbline 149
; if(Rec_Len)//收到数据吗?没有等待数据
tst R16
brne X4
xjmp L21
X4:
.dbline 150
; {
.dbline 151
; if((ReceiveBuf[3] == 'E')&&(ReceiveBuf[4] == 'N')&&(ReceiveBuf[5] == 'D'))
lds R24,_ReceiveBuf+3
cpi R24,69
brne L23
lds R24,_ReceiveBuf+4
cpi R24,78
brne L23
lds R24,_ReceiveBuf+5
cpi R24,68
brne L23
.dbline 152
; {
.dbline 153
; break; //如果收到END终止
xjmp L20
L23:
.dbline 156
; }
; else
; {
.dbline 157
; CRC_Value = Verify_Command(ReceiveBuf,Rec_Len);
mov R18,R14
clr R19
ldi R16,<_ReceiveBuf
ldi R17,>_ReceiveBuf
xcall _Verify_Command
mov R10,R16
clr R11
.dbline 158
; if(CRC_Value == 0)
tst R10
breq X5
xjmp L28
X5:
tst R11
breq X6
xjmp L28
X6:
X1:
.dbline 159
; {
.dbline 160
; if(bPiont == 0)
ldd R0,y+4
ldd R1,y+5
tst R0
brne L30
tst R1
brne L30
X2:
.dbline 161
; {
.dbline 162
; for(bPiont = 0; bPiont < 128; bPiont ++)
clr R0
clr R1
std y+5,R1
std y+4,R0
L32:
.dbline 163
ldi R24,<_ReceiveBuf+5
ldi R25,>_ReceiveBuf+5
ldd R30,y+4
ldd R31,y+5
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_data
ldi R25,>_data
ldd R30,y+4
ldd R31,y+5
add R30,R24
adc R31,R25
std z+0,R2
L33:
.dbline 162
ldd R24,y+4
ldd R25,y+5
adiw R24,1
std y+5,R25
std y+4,R24
.dbline 162
cpi R24,128
ldi R30,0
cpc R25,R30
brlt L32
.dbline 164
; data[bPiont] = ReceiveBuf[bPiont+5];
; }
xjmp L31
L30:
.dbline 166
; else
; {
.dbline 167
; for(bPiont = 128; bPiont < 256; bPiont ++)
ldi R24,128
ldi R25,0
std y+5,R25
std y+4,R24
L37:
.dbline 168
ldi R24,<_ReceiveBuf+5-128
ldi R25,>_ReceiveBuf+5-128
ldd R30,y+4
ldd R31,y+5
add R30,R24
adc R31,R25
ldd R2,z+0
ldi R24,<_data
ldi R25,>_data
ldd R30,y+4
ldd R31,y+5
add R30,R24
adc R31,R25
std z+0,R2
L38:
.dbline 167
ldd R24,y+4
ldd R25,y+5
adiw R24,1
std y+5,R25
std y+4,R24
.dbline 167
cpi R24,0
ldi R30,1
cpc R25,R30
brlt L37
.dbline 169
; data[bPiont] = ReceiveBuf[bPiont-128+5];
; write_one_page();
xcall _write_one_page
.dbline 170
; address += SPM_PAGESIZE;
ldi R20,0
ldi R21,1
ldi R22,0
ldi R23,0
lds R4,_address+2
lds R5,_address+2+1
lds R2,_address
lds R3,_address+1
add R2,R20
adc R3,R21
adc R4,R22
adc R5,R23
sts _address+1,R3
sts _address,R2
sts _address+2+1,R5
sts _address+2,R4
.dbline 171
; bPiont = 0;
clr R0
clr R1
std y+5,R1
std y+4,R0
.dbline 172
; }
L31:
.dbline 173
; PC_Send_Ok(SendData,0x00,SendBuf,0); //请求下一包命令
clr R2
clr R3
std y+3,R3
std y+2,R2
ldi R24,<_SendBuf
ldi R25,>_SendBuf
std y+1,R25
std y+0,R24
clr R18
ldi R16,<_SendData
ldi R17,>_SendData
xcall _PC_Send_Ok
.dbline 174
; }
xjmp L29
L28:
.dbline 176
; else
; {
.dbline 177
; Wrong_Cnt++;
inc R12
.dbline 178
; if(Wrong_Cnt == 3)
mov R24,R12
cpi R24,3
brne L43
.dbline 179
; return ERR_OVERTIME;
ldi R16,19
xjmp L17
L43:
.dbline 180
; PC_Send_Err(ERR_DATACRC,SendBuf); //接收数据错误,需重发
ldi R18,<_SendBuf
ldi R19,>_SendBuf
ldi R16,18
xcall _PC_Send_Err
.dbline 181
; }
L29:
.dbline 182
; }
.dbline 183
; }
L21:
.dbline 184
L19:
.dbline 146
mov R24,R12
cpi R24,3
brsh X7
xjmp L18
X7:
L20:
.dbline 185
; }
; if(bPiont)
ldd R0,y+4
ldd R1,y+5
tst R0
brne X3
tst R1
breq L45
X3:
.dbline 186
; write_one_page();
xcall _write_one_page
L45:
.dbline 187
; PC_Send_Ok(SendData,0x00,SendBuf,0); //向上位机发送下载成功命令
clr R2
clr R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -