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

📄 main.lis

📁 BootLoad_Pei&Ecirc &Ccedil ICC&micro &Auml &Ocirc &acute &acute ú&Acirc &euml &pound &not MegaLoad
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .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 + -