📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile C:\DOCUME~1\zhuji\桌面\AVR_BO~1.2\main.c
.dbfunc e FlashLoad _FlashLoad fV
.even
_FlashLoad::
.dbline -1
.dbline 63
; #include <macros.h>
; #include "assembly.h"
;
; #define ChipType Atmega16
;
; //*********************************************************
; //选择BOOT区大小 此必须与ICC options中的选项相对应
; //#define BootSize 'a' //128
; //#define BootSize 'b' //256
; //#define BootSize 'c' //512
; #define BootSize 'd' //1024
; //选择BootLoad版本号
; #define BootVer 'f' //1.0版本
;
; //**********************************************************
;
; #define Atmega16 0x31
;
; //*****************************************************************************
; #define InteClk //是否使用内部时钟
; #define OscAddress 0x1fff //时钟校准值存储地址
;
; //*****************************************************************************
; //7.3728M时钟下的波特率为19200的设置,此设置可根据ICC生成,选对芯片,时钟,波特率既可
; //由此语句调用UBRR = BAU;
; #define BAU 23 // 7.3728M 19200
; //#define BAU 191 // 7.3728M 2400
; //#define BAU 95 // 7.3728M 4800
; //#define BAU 47 // 7.3728M 9600
; //#define BAU 31 // 7.3728M 14400
; //#define BAU 23 // 7.3728M 19200
; //#define BAU 15 // 7.3728M 28800
;
; //#define BAU 38 // 12M 19200
;
; //*****************************************************************************
;
; #include <iom16v.h>
; #define PageByte 128
; #define AddressShift 7
; #define INTVECREG GICR
;
;
; void FlashLoad (void);
; void GetPageNumber (void);
; void ExecCode (void);
; char GetPage (void);
; void WriteFlash (void);
; char CheckFlash (void);
; unsigned char IsChar (void);
; void SendChar (unsigned char c);
; void delay (void); //1ms延时函数
; unsigned char RecChar (void);
;
; unsigned char PageBuffer[PageByte];
; unsigned int RealPageAddress;
; unsigned int PageAddress;
;
; /*****************************************************************************/
; //Flash编程
; /*****************************************************************************/
; void FlashLoad(void)
; {
.dbline 64
; SendChar('!');
ldi R16,33
rcall _SendChar
rjmp L3
L2:
.dbline 66
; while (1)
; {
.dbline 67
; GetPageNumber();
rcall _GetPageNumber
.dbline 69
;
; if (RealPageAddress == 0xffff)
lds R24,_RealPageAddress
lds R25,_RealPageAddress+1
cpi R24,255
ldi R30,255
cpc R25,R30
brne L5
.dbline 70
; return;
rjmp L1
L5:
.dbline 72
;
; if (GetPage())
rcall _GetPage
tst R16
breq L7
.dbline 73
; {
.dbline 74
; WriteFlash();
rcall _WriteFlash
.dbline 75
; if (CheckFlash())
rcall _CheckFlash
tst R16
breq L9
.dbline 76
; SendChar('!');
ldi R16,33
rcall _SendChar
rjmp L8
L9:
.dbline 78
; else
; SendChar('@');
ldi R16,64
rcall _SendChar
.dbline 79
; }
rjmp L8
L7:
.dbline 81
; else
; SendChar('@');
ldi R16,64
rcall _SendChar
L8:
.dbline 82
L3:
.dbline 65
rjmp L2
X0:
.dbline -2
.dbline 83
; }
; }
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e GetPageNumber _GetPageNumber fV
; PageAddressL -> R20
; PageAddressH -> R22
.even
_GetPageNumber::
rcall push_gset2
.dbline -1
.dbline 87
;
; /*****************************************************************************/
; void GetPageNumber(void)
; {
.dbline 91
; unsigned char PageAddressH;
; unsigned char PageAddressL;
;
; PageAddressH = RecChar();
rcall _RecChar
mov R22,R16
.dbline 93
;
; PageAddressL = RecChar();
rcall _RecChar
mov R20,R16
.dbline 95
;
; RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
mov R3,R22
mov R2,R20
sts _RealPageAddress+1,R3
sts _RealPageAddress,R2
.dbline 96
; PageAddress=RealPageAddress<<AddressShift;
ldi R18,7
ldi R19,0
mov R16,R2
mov R17,R3
rcall lsl16
sts _PageAddress+1,R17
sts _PageAddress,R16
.dbline -2
.dbline 103
; #ifdef RAMPZ_FLAG
; if (PageAddressH)
; RAMPZ = 1;
; else
; RAMPZ = 0;
; #endif
; }
L11:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r PageAddressL 20 c
.dbsym r PageAddressH 22 c
.dbend
.dbfunc e GetPage _GetPage fc
; CheckSum -> R20
; LocalCheckSum -> R22
; i -> R10
.even
_GetPage::
rcall push_gset3
.dbline -1
.dbline 107
;
; /*****************************************************************************/
; char GetPage(void)
; {
.dbline 109
; unsigned char i;
; unsigned char LocalCheckSum = 0;
clr R22
.dbline 110
; unsigned char CheckSum = 0;
clr R20
.dbline 112
;
; for (i=0;i<PageByte/2;i++)
clr R10
rjmp L16
X1:
.dbline 113
; {
L17:
.dbline 114
L18:
.dbline 114
rcall _IsChar
tst R16
breq L17
.dbline 115
rcall _RecChar
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 116
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
eor R22,R2
.dbline 117
L14:
.dbline 112
inc R10
L16:
.dbline 112
mov R24,R10
cpi R24,64
brlo L18
.dbline 118
; while(!IsChar());
; PageBuffer[i]=RecChar();
; LocalCheckSum ^= PageBuffer[i];
; }
; for (i=0;i<PageByte/2;i++)
clr R10
rjmp L23
X2:
.dbline 119
; {
L24:
.dbline 120
L25:
.dbline 120
rcall _IsChar
tst R16
breq L24
.dbline 121
rcall _RecChar
ldi R24,<_PageBuffer+64
ldi R25,>_PageBuffer+64
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 122
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
eor R22,R2
.dbline 123
L21:
.dbline 118
inc R10
L23:
.dbline 118
mov R24,R10
cpi R24,64
brlo L25
.dbline 124
; while(!IsChar());
; PageBuffer[i+PageByte/2]=RecChar();
; LocalCheckSum ^= PageBuffer[i+PageByte/2];
; }
; CheckSum = RecChar();
rcall _RecChar
mov R20,R16
.dbline 126
;
; if (LocalCheckSum == CheckSum)
cp R22,R16
brne L29
.dbline 127
; return 1;
ldi R16,1
rjmp L12
L29:
.dbline 129
; else
; return 0;
clr R16
.dbline -2
L12:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r CheckSum 20 c
.dbsym r LocalCheckSum 22 c
.dbsym r i 10 c
.dbend
.dbfunc e WriteFlash _WriteFlash fV
; TempInt -> R20,R21
; i -> R22,R23
.even
_WriteFlash::
rcall push_gset2
.dbline -1
.dbline 134
; }
;
; /*****************************************************************************/
; void WriteFlash(void)
; {
.dbline 137
; unsigned int i;
; unsigned int TempInt;
; for (i=0;i<PageByte;i+=2)
clr R22
clr R23
rjmp L35
L32:
.dbline 138
.dbline 139
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
mov R30,R22
mov R31,R23
adiw R30,1
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
mov R30,R22
mov R31,R23
add R30,R24
adc R31,R25
ldd R20,z+0
clr R21
add R20,R2
adc R21,R3
.dbline 140
mov R18,R22
mov R19,R23
mov R16,R20
mov R17,R21
rcall _fill_temp_buffer
.dbline 141
L33:
.dbline 137
subi R22,254 ; offset = 2
sbci R23,255
L35:
.dbline 137
cpi R22,128
ldi R30,0
cpc R23,R30
brlo L32
.dbline 142
; {
; TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
; fill_temp_buffer(TempInt,i); //call asm routine.
; }
; write_page(PageAddress,0x03); //擦除页
ldi R18,3
lds R16,_PageAddress
lds R17,_PageAddress+1
rcall _write_page
.dbline 143
; write_page(PageAddress,0x05); //写页数据
ldi R18,5
lds R16,_PageAddress
lds R17,_PageAddress+1
rcall _write_page
.dbline 145
;
; enableRWW();
rcall _enableRWW
.dbline -2
.dbline 146
; }
L31:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r TempInt 20 i
.dbsym r i 22 i
.dbend
.dbfunc e CheckFlash _CheckFlash fc
; TempInt2 -> R20,R21
; TempInt -> R22,R23
; i -> R10
.even
_CheckFlash::
rcall push_gset3
.dbline -1
.dbline 151
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -