⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.lis

📁 ATmal mega88 芯片的bootload源程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -