📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile D:\桌面\AVR_BO~1.2\bootloader\main.c
.dbfunc e FlashLoad _FlashLoad fV
.even
_FlashLoad::
.dbline -1
.dbline 74
; /******************************************************************************
; Atmega系列单片机 BootLoader程序
; 日 期:2007年4月
; 作 者:likeeavr
; 版权所有:avrvi论坛
;
; 说明:当前版本只针对本论坛M16开发板
;
; 上位机借用了冯建辉的程序。
;
; /*****************************************************************************/
; #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 75
; SendChar('!');
ldi R16,33
xcall _SendChar
xjmp L3
L2:
.dbline 77
; while (1)
; {
.dbline 78
; GetPageNumber();
xcall _GetPageNumber
.dbline 80
;
; if (RealPageAddress == 0xffff)
lds R24,_RealPageAddress
lds R25,_RealPageAddress+1
cpi R24,255
ldi R30,255
cpc R25,R30
brne L5
.dbline 81
; return;
xjmp L1
L5:
.dbline 83
;
; if (GetPage())
xcall _GetPage
tst R16
breq L7
.dbline 84
; {
.dbline 85
; WriteFlash();
xcall _WriteFlash
.dbline 86
; if (CheckFlash())
xcall _CheckFlash
tst R16
breq L9
.dbline 87
; SendChar('!');
ldi R16,33
xcall _SendChar
xjmp L8
L9:
.dbline 89
; else
; SendChar('@');
ldi R16,64
xcall _SendChar
.dbline 90
; }
xjmp L8
L7:
.dbline 92
; else
; SendChar('@');
ldi R16,64
xcall _SendChar
L8:
.dbline 93
L3:
.dbline 76
xjmp L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.dbfunc e GetPageNumber _GetPageNumber fV
; PageAddressL -> R20
; PageAddressH -> R22
.even
_GetPageNumber::
xcall push_gset2
.dbline -1
.dbline 98
; }
; }
;
; /*****************************************************************************/
; void GetPageNumber(void)
; {
.dbline 102
; unsigned char PageAddressH;
; unsigned char PageAddressL;
;
; PageAddressH = RecChar();
xcall _RecChar
mov R22,R16
.dbline 104
;
; PageAddressL = RecChar();
xcall _RecChar
mov R20,R16
.dbline 106
;
; RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
mov R3,R22
mov R2,R20
sts _RealPageAddress+1,R3
sts _RealPageAddress,R2
.dbline 107
; PageAddress=RealPageAddress<<AddressShift;
ldi R18,7
ldi R19,0
movw R16,R2
xcall lsl16
sts _PageAddress+1,R17
sts _PageAddress,R16
.dbline -2
L11:
xcall 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::
xcall push_gset3
.dbline -1
.dbline 118
; #ifdef RAMPZ_FLAG
; if (PageAddressH)
; RAMPZ = 1;
; else
; RAMPZ = 0;
; #endif
; }
;
; /*****************************************************************************/
; char GetPage(void)
; {
.dbline 120
; unsigned char i;
; unsigned char LocalCheckSum = 0;
clr R22
.dbline 121
; unsigned char CheckSum = 0;
clr R20
.dbline 123
;
; for (i=0;i<PageByte/2;i++)
clr R10
xjmp L16
X1:
.dbline 124
; {
L17:
.dbline 125
L18:
.dbline 125
xcall _IsChar
tst R16
breq L17
.dbline 126
xcall _RecChar
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
mov R30,R10
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 127
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
eor R22,R2
.dbline 128
L14:
.dbline 123
inc R10
L16:
.dbline 123
mov R24,R10
cpi R24,64
brlo L18
.dbline 129
; while(!IsChar());
; PageBuffer[i]=RecChar();
; LocalCheckSum ^= PageBuffer[i];
; }
; for (i=0;i<PageByte/2;i++)
clr R10
xjmp L23
X2:
.dbline 130
; {
L24:
.dbline 131
L25:
.dbline 131
xcall _IsChar
tst R16
breq L24
.dbline 132
xcall _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 133
mov R30,R10
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
eor R22,R2
.dbline 134
L21:
.dbline 129
inc R10
L23:
.dbline 129
mov R24,R10
cpi R24,64
brlo L25
.dbline 135
; while(!IsChar());
; PageBuffer[i+PageByte/2]=RecChar();
; LocalCheckSum ^= PageBuffer[i+PageByte/2];
; }
; CheckSum = RecChar();
xcall _RecChar
mov R20,R16
.dbline 137
;
; if (LocalCheckSum == CheckSum)
cp R22,R16
brne L29
.dbline 138
; return 1;
ldi R16,1
xjmp L12
L29:
.dbline 140
; else
; return 0;
clr R16
.dbline -2
L12:
xcall 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::
xcall push_gset2
.dbline -1
.dbline 145
; }
;
; /*****************************************************************************/
; void WriteFlash(void)
; {
.dbline 148
; unsigned int i;
; unsigned int TempInt;
; for (i=0;i<PageByte;i+=2)
clr R22
clr R23
xjmp L35
L32:
.dbline 149
.dbline 150
ldi R24,<_PageBuffer
ldi R25,>_PageBuffer
movw R30,R22
adiw R30,1
add R30,R24
adc R31,R25
ldd R2,z+0
clr R3
mov R3,R2
clr R2
movw R30,R22
add R30,R24
adc R31,R25
ldd R20,z+0
clr R21
add R20,R2
adc R21,R3
.dbline 151
movw R18,R22
movw R16,R20
xcall _fill_temp_buffer
.dbline 152
L33:
.dbline 148
subi R22,254 ; offset = 2
sbci R23,255
L35:
.dbline 148
cpi R22,128
ldi R30,0
cpc R23,R30
brlo L32
.dbline 153
; {
; 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
xcall _write_page
.dbline 154
; write_page(PageAddress,0x05); //写页数据
ldi R18,5
lds R16,_PageAddress
lds R17,_PageAddress+1
xcall _write_page
.dbline 156
;
; enableRWW();
xcall _enableRWW
.dbline -2
L31:
xcall 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::
xcall push_gset3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -