📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\IccAvr\Pei\BootLoad_Pei\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 B9D0 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 .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 .dbline 109
001C 0DC0 rjmp L1
001E L7:
001E .dbline 111
001E ;
001E ; WriteFlash();
001E 4AD0 rcall _WriteFlash
0020 .dbline 112
0020 ; if (CheckFlash()) SendChar('!');
0020 76D0 rcall _CheckFlash
0022 0023 tst R16
0024 19F0 breq L9
0026 .dbline 112
0026 01E2 ldi R16,33
0028 A6D0 rcall _SendChar
002A 05C0 rjmp L6
002C L9:
002C .dbline 113
002C ; else SendChar('@');
002C 00E4 ldi R16,64
002E A3D0 rcall _SendChar
0030 .dbline 114
0030 ; }
0030 02C0 rjmp L6
0032 L5:
0032 .dbline 115
0032 ; else SendChar('@');
0032 00E4 ldi R16,64
0034 A0D0 rcall _SendChar
0036 L6:
0036 .dbline 116
0036 L3:
0036 .dbline 102
0036 E7CF rjmp L2
0038 X0:
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 -> R20
003A ; AddL -> R22
003A ; AddH -> R12
003A ; LocalCheckSum -> R10
003A ; i -> R22
.even
003A _GetPage::
003A 00D0 rcall push_gset4
003C .dbline -1
003C .dbline 134
003C ; }
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 4427 clr R20
0040 .dbline 139
0040 ;
0040 ; AddH=RecChar();AddL=RecChar();
0040 96D0 rcall _RecChar
0042 C02E mov R12,R16
0044 .dbline 139
0044 94D0 rcall _RecChar
0046 602F mov R22,R16
0048 .dbline 140
0048 ; PageAddress=(AddH<<8)+AddL;
0048 3C2C mov R3,R12
004A 262E mov R2,R22
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 .dbline 141
005E 01E0 ldi R16,1
0060 27C0 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 AC2C mov R10,R12
007A A60E add R10,R22
007C .dbline 145
007C ;
007C ; for (i=0;i<PageByte;i++)
007C 6627 clr R22
007E 0FC0 rjmp L17
0080 L14:
0080 .dbline 146
0080 .dbline 147
0080 76D0 rcall _RecChar
0082 80E0 ldi R24,<_PageBuffer
0084 90E0 ldi R25,>_PageBuffer
0086 E62F mov R30,R22
0088 FF27 clr R31
008A E80F add R30,R24
008C F91F adc R31,R25
008E 0083 std z+0,R16
0090 .dbline 148
0090 E62F mov R30,R22
0092 FF27 clr R31
0094 E80F add R30,R24
0096 F91F adc R31,R25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -