📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile F:\程序\新建文~1\BootLoad_88可用\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 "iom88v.h"
0000 ; #define PageByte 64
0000 ; #define AddressShift 6
0000 ; #endif
0000 ;
0000 ; #if (ChipType == Atmega16)
0000 ; #include "iom168v.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 C2D0 xcall _SendChar
0004 18C0 xjmp 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 xcall _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 xjmp L1
001E L7:
001E .dbline 111
001E ;
001E ; WriteFlash();
001E 4CD0 xcall _WriteFlash
0020 .dbline 112
0020 ; if (CheckFlash()) SendChar('!');
0020 7DD0 xcall _CheckFlash
0022 0023 tst R16
0024 19F0 breq L9
0026 X2:
0026 .dbline 112
0026 01E2 ldi R16,33
0028 AFD0 xcall _SendChar
002A 05C0 xjmp L6
002C L9:
002C .dbline 113
002C ; else SendChar('@');
002C 00E4 ldi R16,64
002E ACD0 xcall _SendChar
0030 .dbline 114
0030 ; }
0030 02C0 xjmp L6
0032 L5:
0032 .dbline 115
0032 ; else SendChar('@');
0032 00E4 ldi R16,64
0034 A9D0 xcall _SendChar
0036 L6:
0036 .dbline 116
0036 ; }
0036 L3:
0036 .dbline 102
0036 E7CF xjmp 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 ; AddL -> R20
003A ; AddH -> R14
003A ; CheckSum -> R12
003A ; LocalCheckSum -> R10
003A ; i -> R20
.even
003A _GetPage::
003A 0E940000 xcall push_xgset30FC
003E .dbline -1
003E .dbline 134
003E ; }
003E ;
003E ; /****************************************************************************
003E ; void GetPageNumber(void)
003E ; {
003E ; unsigned char PageAddressH;
003E ; unsigned char PageAddressL;
003E ;
003E ; PageAddressH = RecChar();
003E ;
003E ; PageAddressL = RecChar();
003E ;
003E ; PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
003E ; }
003E ;
003E ; /*****************************************************************************/
003E ; char GetPage(void)
003E ; {
003E .dbline 136
003E ; unsigned char i,AddH,AddL;
003E ; unsigned char LocalCheckSum = 0;
003E AA24 clr R10
0040 .dbline 137
0040 ; unsigned char CheckSum = 0;
0040 CC24 clr R12
0042 .dbline 139
0042 ;
0042 ; AddH=RecChar();AddL=RecChar();
0042 9BD0 xcall _RecChar
0044 E02E mov R14,R16
0046 .dbline 139
0046 99D0 xcall _RecChar
0048 402F mov R20,R16
004A .dbline 140
004A ; PageAddress=(AddH<<8)+AddL;
004A 3E2C mov R3,R14
004C 242E mov R2,R20
004E 30920100 sts _PageAddress+1,R3
0052 20920000 sts _PageAddress,R2
0056 .dbline 141
0056 ; if (PageAddress==0xffff) return 1;//exit..
0056 C101 movw R24,R2
0058 8F3F cpi R24,255
005A EFEF ldi R30,255
005C 9E07 cpc R25,R30
005E 11F4 brne L12
0060 X4:
0060 .dbline 141
0060 01E0 ldi R16,1
0062 28C0 xjmp L11
0064 L12:
0064 .dbline 142
0064 ; PageAddress=PageAddress<<AddressShift;
0064 27E0 ldi R18,7
0066 30E0 ldi R19,0
0068 00910000 lds R16,_PageAddress
006C 10910100 lds R17,_PageAddress+1
0070 0E940000 xcall lsl16
0074 10930100 sts _PageAddress+1,R17
0078 00930000 sts _PageAddress,R16
007C .dbline 145
007C ; // LocalCheckSum=AddH+AddL;//pei考虑Page的效验
007C ;
007C ; for (i=0;i<PageByte;i++)
007C 4427 clr R20
007E 10C0 xjmp L17
0080 L14:
0080 .dbline 146
0080 ; {
0080 .dbline 147
0080 ; PageBuffer[i]=RecChar();
0080 7CD0 xcall _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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -