📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile F:\AVR常用函数\BootLooderMage8\BootLoad_1M\main.c
0000 .dbfunc e FlashLoad _FlashLoad fV
0000 ; AddL -> <dead>
0000 ; AddH -> <dead>
.even
0000 _FlashLoad::
0000 .dbline -1
0000 .dbline 100
0000 ; /******************************************************************************
0000 ; Atmega8、16 BootLoad程序
0000 ; 日 期:2004年的最后一天
0000 ; 肖 鹏 www.527dz.com 527dz@527dz.com
0000 ;
0000 ; /*****************************************************************************/
0000 ;
0000 ; //修改pei2005.6.24
0000 ; //1.针对W0和W1的硬件进行修改,主要是使用晶振、修改Baud、关无线模块
0000 ; //2.增加:用户区无程序时不跳出Boot循环
0000 ; //3.修正Bug:原GetPageNumber()由于移位的原因,PageAddress!=0xffff,即FlashLoad()无法退出
0000 ; //4.增加:Page地址比较重要,也要效验,添加到GetPage()中
0000 ;
0000 ; #include <macros.h>
0000 ; #include "assembly.h"
0000 ;
0000 ; #define W0
0000 ; //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
0000 ; //请根据目标板选择芯片型号
0000 ; #ifdef W0
0000 ; #define ChipType Atmega8
0000 ; #else
0000 ; #define ChipType Atmega16
0000 ; #endif
0000 ; //#define ChipType Atmega32
0000 ; //#define ChipType Atmega64
0000 ; //#define ChipType Atmega128
0000 ; //#define ChipType Atmega8535
0000 ; //*********************************************************
0000 ; //选择BOOT区大小
0000 ; //#define BootSize 'a' //128
0000 ; //#define BootSize 'b' //256
0000 ; #define BootSize 'c' //512
0000 ; //#define BootSize 'd' //1024
0000 ; //#define BootSize 'e' //2048(不知道是否有2048字BOOT空间的芯片)
0000 ; //选择BootLoad版本号
0000 ; //#define BootVer 'f' //1.0版本
0000 ; #define BootVer 'g' //1.1版本 pei
0000 ; //#define BootVer 'h' //1.2版本
0000 ; //#define BootVer 'i' //1.3版本
0000 ; //#define BootVer 'j' //1.4版本
0000 ; //#define BootVer 'k' //1.5版本
0000 ; //#define BootVer 'l' //1.6版本
0000 ; //#define BootVer 'm' //1.7版本
0000 ; //#define BootVer 'n' //1.8版本
0000 ; //#define BootVer 'o' //1.9版本
0000 ; //#define BootVer 'p' //2.0版本(应该是最终版本了)
0000 ; //**********************************************************
0000 ; #define Atmega8 0x30
0000 ; #define Atmega16 0x31
0000 ; #define Atmega32 0x32
0000 ; #define Atmega64 0x33
0000 ; #define Atmega128 0x34
0000 ; #define Atmega8535 0x35
0000 ; //*****************************************************************************
0000 ; //#define InteClk //是否使用内部时钟
0000 ; #define OscAddress 0x1fff //时钟校准值存储地址
0000 ; //#define OscAddress 0x3fff //时钟校准值存储地址
0000 ; //*****************************************************************************
0000 ; //8时钟下的波特率设置
0000 ; //#define BAU 103 //4800
0000 ; #define BAU 51 //9600
0000 ; //#define BAU 34 //14400
0000 ; //#define BAU 25 //19200
0000 ; //*****************************************************************************
0000 ;
0000 ; //11.0592M pei
0000 ; //#define BAU 35 //pei baud19200
0000 ; //#define BAU 17 //pei baud38400
0000 ;
0000 ; #if (ChipType == Atmega8)
0000 ; #include "iom8v.h"
0000 ; #define PageByte 64
0000 ; #define AddressShift 6
0000 ; #endif
0000 ;
0000 ; #if (ChipType == Atmega16)
0000 ; #include "iom16v.h"
0000 ; #define PageByte 128
0000 ; #define AddressShift 7
0000 ; #endif
0000 ;
0000 ; void FlashLoad (void);
0000 ; void GetPageNumber (void);
0000 ; void ExecCode (void);
0000 ; char GetPage (void);
0000 ; void WriteFlash (void);
0000 ; char CheckFlash (void);
0000 ; void SendChar (unsigned char c);
0000 ; void delay (void); //1ms延时函数
0000 ; unsigned char RecChar (void);
0000 ;
0000 ; unsigned char PageBuffer[PageByte];
0000 ; unsigned int PageAddress;
0000 ;
0000 ; /*****************************************************************************/
0000 ; //Flash编程
0000 ; /*****************************************************************************/
0000 ; void FlashLoad(void)
0000 ; {unsigned char AddH,AddL;
0000 .dbline 101
0000 ; SendChar('!');
0000 01E2 ldi R16,33
0002 B5D0 rcall _SendChar
0004 18C0 rjmp L3
0006 L2:
0006 .dbline 103
0006 ; while (1)
0006 ; {
0006 .dbline 107
0006 ; //GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
0006 ; //if (PageAddress == 0xffff) return;//退不出了:)
0006 ;
0006 ; if (GetPage())
0006 19D0 rcall _GetPage
0008 0023 tst R16
000A 99F0 breq L5
000C X0:
000C .dbline 108
000C ; {
000C .dbline 109
000C ; if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
000C 80910000 lds R24,_PageAddress
0010 90910100 lds R25,_PageAddress+1
0014 8F3F cpi R24,255
0016 EFEF ldi R30,255
0018 9E07 cpc R25,R30
001A 09F4 brne L7
001C X1:
001C .dbline 109
001C 0DC0 rjmp L1
001E L7:
001E .dbline 111
001E ;
001E ; WriteFlash();
001E 4BD0 rcall _WriteFlash
0020 .dbline 112
0020 ; if (CheckFlash()) SendChar('!');
0020 76D0 rcall _CheckFlash
0022 0023 tst R16
0024 19F0 breq L9
0026 X2:
0026 .dbline 112
0026 01E2 ldi R16,33
0028 A2D0 rcall _SendChar
002A 05C0 rjmp L6
002C L9:
002C .dbline 113
002C ; else SendChar('@');
002C 00E4 ldi R16,64
002E 9FD0 rcall _SendChar
0030 .dbline 114
0030 ; }
0030 02C0 rjmp L6
0032 L5:
0032 .dbline 115
0032 ; else SendChar('@');
0032 00E4 ldi R16,64
0034 9CD0 rcall _SendChar
0036 L6:
0036 .dbline 116
0036 ; }
0036 L3:
0036 .dbline 102
0036 E7CF rjmp L2
0038 X3:
0038 .dbline -2
0038 L1:
0038 .dbline 0 ; func end
0038 0895 ret
003A .dbsym l AddL 1 c
003A .dbsym l AddH 1 c
003A .dbend
003A .dbfunc e GetPage _GetPage fc
003A ; CheckSum -> R12
003A ; AddL -> R14
003A ; AddH -> R20
003A ; LocalCheckSum -> R10
003A ; i -> R20
.even
003A _GetPage::
003A 00D0 rcall push_xgset30FC
003C .dbline -1
003C .dbline 134
003C ; }
003C ;
003C ; /****************************************************************************
003C ; void GetPageNumber(void)
003C ; {
003C ; unsigned char PageAddressH;
003C ; unsigned char PageAddressL;
003C ;
003C ; PageAddressH = RecChar();
003C ;
003C ; PageAddressL = RecChar();
003C ;
003C ; PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
003C ; }
003C ;
003C ; /*****************************************************************************/
003C ; char GetPage(void)
003C ; {
003C .dbline 136
003C ; unsigned char i,AddH,AddL;
003C ; unsigned char LocalCheckSum = 0;
003C AA24 clr R10
003E .dbline 137
003E ; unsigned char CheckSum = 0;
003E CC24 clr R12
0040 .dbline 139
0040 ;
0040 ; AddH=RecChar();AddL=RecChar();
0040 92D0 rcall _RecChar
0042 402F mov R20,R16
0044 .dbline 139
0044 90D0 rcall _RecChar
0046 E02E mov R14,R16
0048 .dbline 140
0048 ; PageAddress=(AddH<<8)+AddL;
0048 342E mov R3,R20
004A 2E2C mov R2,R14
004C 30920100 sts _PageAddress+1,R3
0050 20920000 sts _PageAddress,R2
0054 .dbline 141
0054 ; if (PageAddress==0xffff) return 1;//exit..
0054 C101 movw R24,R2
0056 8F3F cpi R24,255
0058 EFEF ldi R30,255
005A 9E07 cpc R25,R30
005C 11F4 brne L12
005E X4:
005E .dbline 141
005E 01E0 ldi R16,1
0060 29C0 rjmp L11
0062 L12:
0062 .dbline 142
0062 ; PageAddress=PageAddress<<AddressShift;
0062 26E0 ldi R18,6
0064 30E0 ldi R19,0
0066 00910000 lds R16,_PageAddress
006A 10910100 lds R17,_PageAddress+1
006E 00D0 rcall lsl16
0070 10930100 sts _PageAddress+1,R17
0074 00930000 sts _PageAddress,R16
0078 .dbline 143
0078 ; LocalCheckSum=AddH+AddL;//pei考虑Page的效验
0078 A42E mov R10,R20
007A AE0C add R10,R14
007C .dbline 145
007C ;
007C ; for (i=0;i<PageByte;i++)
007C 4427 clr R20
007E 10C0 rjmp L17
0080 L14:
0080 .dbline 146
0080 ; {
0080 .dbline 147
0080 ; PageBuffer[i]=RecChar();
0080 72D0 rcall _RecChar
0082 E02E mov R14,R16
0084 80E0 ldi R24,<_PageBuffer
0086 90E0 ldi R25,>_PageBuffer
0088 E42F mov R30,R20
008A FF27 clr R31
008C E80F add R30,R24
008E F91F adc R31,R25
0090 E082 std z+0,R14
0092 .dbline 148
0092 ; LocalCheckSum += PageBuffer[i];
0092 E42F mov R30,R20
0094 FF27 clr R31
0096 E80F add R30,R24
0098 F91F adc R31,R25
009A 2080 ldd R2,z+0
009C A20C add R10,R2
009E .dbline 149
009E ; }
009E L15:
009E .dbline 145
009E 4395 inc R20
00A0 L17:
00A0 .dbline 145
00A0 4034 cpi R20,64
00A2 70F3 brlo L14
00A4 X5:
00A4 .dbline 151
00A4 ;
00A4 ; CheckSum = RecChar();
00A4 60D0 rcall _RecChar
00A6 E02E mov R14,R16
00A8 CE2C mov R12,R14
00AA .dbline 152
00AA ; if (LocalCheckSum == CheckSum) return 1;
00AA A016 cp R10,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -