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

📄 main.lis

📁 Atmega系列单片机 BootLoader程序
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module main.c
                        .area text(rom, con, rel)
 0000                   .dbfile D:\桌面\AVR_BO~1.2\bootloader\main.c
 0000                   .dbfunc e FlashLoad _FlashLoad fV
                        .even
 0000           _FlashLoad::
 0000                   .dbline -1
 0000                   .dbline 74
 0000           ; /******************************************************************************
 0000           ; Atmega系列单片机 BootLoader程序  
 0000           ; 日  期:2007年4月
 0000           ; 作  者:likeeavr
 0000           ; 版权所有:avrvi论坛
 0000           ; 
 0000           ; 说明:当前版本只针对本论坛M16开发板
 0000           ; 
 0000           ; 上位机借用了冯建辉的程序。
 0000           ; 
 0000           ; /*****************************************************************************/
 0000           ; #include <macros.h>
 0000           ; #include "assembly.h"
 0000           ;  
 0000           ; #define  ChipType     Atmega16       
 0000           ;       
 0000           ; //*********************************************************
 0000           ; //选择BOOT区大小  此必须与ICC options中的选项相对应
 0000           ; //#define  BootSize     'a'    //128   
 0000           ; //#define  BootSize     'b'    //256
 0000           ; //#define  BootSize     'c'    //512
 0000           ; #define    BootSize       'd'    //1024
 0000           ; //选择BootLoad版本号
 0000           ; #define  BootVer        'f'    //1.0版本
 0000           ; 
 0000           ; //**********************************************************
 0000           ; 
 0000           ; #define  Atmega16       0x31
 0000           ; 
 0000           ; //*****************************************************************************
 0000           ; #define  InteClk                 //是否使用内部时钟
 0000           ; #define  OscAddress     0x1fff   //时钟校准值存储地址
 0000           ; 
 0000           ; //*****************************************************************************
 0000           ; //7.3728M时钟下的波特率为19200的设置,此设置可根据ICC生成,选对芯片,时钟,波特率既可
 0000           ; //由此语句调用UBRR = BAU;
 0000           ; #define  BAU  23    // 7.3728M 19200
 0000           ; //#define  BAU  191 // 7.3728M 2400
 0000           ; //#define  BAU  95  // 7.3728M 4800
 0000           ; //#define  BAU  47  // 7.3728M 9600
 0000           ; //#define  BAU  31  // 7.3728M 14400
 0000           ; //#define  BAU  23  // 7.3728M 19200
 0000           ; //#define  BAU  15  // 7.3728M 28800
 0000           ; 
 0000           ; //#define  BAU  38  // 12M 19200
 0000           ; 
 0000           ; //*****************************************************************************
 0000           ; 
 0000           ; #include  <iom16v.h>
 0000           ; #define   PageByte             128    
 0000           ; #define   AddressShift         7
 0000           ; #define       INTVECREG                GICR
 0000           ; 
 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           ; unsigned char IsChar           (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  RealPageAddress;
 0000           ; unsigned int  PageAddress;
 0000           ; 
 0000           ; /*****************************************************************************/
 0000           ; //Flash编程                                                                                
 0000           ; /*****************************************************************************/
 0000           ; void FlashLoad(void)
 0000           ;   {
 0000                   .dbline 75
 0000           ;     SendChar('!');
 0000 01E2              ldi R16,33
 0002 E0D0              xcall _SendChar
 0004 19C0              xjmp L3
 0006           L2:
 0006                   .dbline 77
 0006           ;     while (1)
 0006           ;     {
 0006                   .dbline 78
 0006           ;        GetPageNumber();
 0006 1AD0              xcall _GetPageNumber
 0008                   .dbline 80
 0008           ; 
 0008           ;        if (RealPageAddress == 0xffff) 
 0008 80910200          lds R24,_RealPageAddress
 000C 90910300          lds R25,_RealPageAddress+1
 0010 8F3F              cpi R24,255
 0012 EFEF              ldi R30,255
 0014 9E07              cpc R25,R30
 0016 09F4              brne L5
 0018                   .dbline 81
 0018           ;          return;
 0018 10C0              xjmp L1
 001A           L5:
 001A                   .dbline 83
 001A           ;         
 001A           ;        if (GetPage())
 001A 28D0              xcall _GetPage
 001C 0023              tst R16
 001E 51F0              breq L7
 0020                   .dbline 84
 0020           ;         {
 0020                   .dbline 85
 0020           ;               WriteFlash();
 0020 61D0              xcall _WriteFlash
 0022                   .dbline 86
 0022           ;           if (CheckFlash()) 
 0022 93D0              xcall _CheckFlash
 0024 0023              tst R16
 0026 19F0              breq L9
 0028                   .dbline 87
 0028           ;                 SendChar('!');
 0028 01E2              ldi R16,33
 002A CCD0              xcall _SendChar
 002C 05C0              xjmp L8
 002E           L9:
 002E                   .dbline 89
 002E           ;           else 
 002E           ;                 SendChar('@');
 002E 00E4              ldi R16,64
 0030 C9D0              xcall _SendChar
 0032                   .dbline 90
 0032           ;         }
 0032 02C0              xjmp L8
 0034           L7:
 0034                   .dbline 92
 0034           ;        else 
 0034           ;          SendChar('@');
 0034 00E4              ldi R16,64
 0036 C6D0              xcall _SendChar
 0038           L8:
 0038                   .dbline 93
 0038           L3:
 0038                   .dbline 76
 0038 E6CF              xjmp L2
 003A           X0:
 003A                   .dbline -2
 003A           L1:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbend
 003C                   .dbfunc e GetPageNumber _GetPageNumber fV
 003C           ;   PageAddressL -> R20
 003C           ;   PageAddressH -> R22
                        .even
 003C           _GetPageNumber::
 003C 0E940000          xcall push_gset2
 0040                   .dbline -1
 0040                   .dbline 98
 0040           ;     }
 0040           ;   }
 0040           ; 
 0040           ; /*****************************************************************************/
 0040           ; void GetPageNumber(void)
 0040           ;   {
 0040                   .dbline 102
 0040           ;     unsigned char PageAddressH;
 0040           ;     unsigned char PageAddressL;
 0040           ; 
 0040           ;     PageAddressH = RecChar();
 0040 BDD0              xcall _RecChar
 0042 602F              mov R22,R16
 0044                   .dbline 104
 0044           ; 
 0044           ;     PageAddressL = RecChar();
 0044 BBD0              xcall _RecChar
 0046 402F              mov R20,R16
 0048                   .dbline 106
 0048           ; 
 0048           ;     RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
 0048 362E              mov R3,R22
 004A 242E              mov R2,R20
 004C 30920300          sts _RealPageAddress+1,R3
 0050 20920200          sts _RealPageAddress,R2
 0054                   .dbline 107
 0054           ;       PageAddress=RealPageAddress<<AddressShift;
 0054 27E0              ldi R18,7
 0056 30E0              ldi R19,0
 0058 8101              movw R16,R2
 005A 0E940000          xcall lsl16
 005E 10930100          sts _PageAddress+1,R17
 0062 00930000          sts _PageAddress,R16
 0066                   .dbline -2
 0066           L11:
 0066 0E940000          xcall pop_gset2
 006A                   .dbline 0 ; func end
 006A 0895              ret
 006C                   .dbsym r PageAddressL 20 c
 006C                   .dbsym r PageAddressH 22 c
 006C                   .dbend
 006C                   .dbfunc e GetPage _GetPage fc
 006C           ;       CheckSum -> R20
 006C           ;  LocalCheckSum -> R22
 006C           ;              i -> R10
                        .even
 006C           _GetPage::
 006C 0E940000          xcall push_gset3
 0070                   .dbline -1
 0070                   .dbline 118
 0070           ; #ifdef RAMPZ_FLAG
 0070           ;     if (PageAddressH) 
 0070           ;          RAMPZ = 1; 
 0070           ;     else 
 0070           ;          RAMPZ = 0;
 0070           ; #endif        
 0070           ;   }
 0070           ; 
 0070           ; /*****************************************************************************/
 0070           ; char GetPage(void)
 0070           ;   {
 0070                   .dbline 120
 0070           ;     unsigned char i;
 0070           ;     unsigned char LocalCheckSum = 0;
 0070 6627              clr R22
 0072                   .dbline 121
 0072           ;     unsigned char CheckSum = 0;
 0072 4427              clr R20
 0074                   .dbline 123
 0074           ; 
 0074           ;     for (i=0;i<PageByte/2;i++)
 0074 AA24              clr R10
 0076 12C0              xjmp L16
 0078           X1:
 0078                   .dbline 124
 0078           ;       {
 0078           L17:
 0078                   .dbline 125
 0078           L18:
 0078                   .dbline 125
 0078 9BD0              xcall _IsChar
 007A 0023              tst R16
 007C E9F3              breq L17
 007E                   .dbline 126
 007E 9ED0              xcall _RecChar
 0080 80E0              ldi R24,<_PageBuffer
 0082 90E0              ldi R25,>_PageBuffer
 0084 EA2D              mov R30,R10
 0086 FF27              clr R31
 0088 E80F              add R30,R24
 008A F91F              adc R31,R25
 008C 0083              std z+0,R16
 008E                   .dbline 127
 008E EA2D              mov R30,R10
 0090 FF27              clr R31
 0092 E80F              add R30,R24
 0094 F91F              adc R31,R25
 0096 2080              ldd R2,z+0
 0098 6225              eor R22,R2
 009A                   .dbline 128
 009A           L14:
 009A                   .dbline 123
 009A A394              inc R10
 009C           L16:
 009C                   .dbline 123
 009C 8A2D              mov R24,R10
 009E 8034              cpi R24,64
 00A0 58F3              brlo L18
 00A2                   .dbline 129
 00A2           ;        while(!IsChar());
 00A2           ;        PageBuffer[i]=RecChar();
 00A2           ;        LocalCheckSum ^= PageBuffer[i];
 00A2           ;       }
 00A2           ;       for (i=0;i<PageByte/2;i++)
 00A2 AA24              clr R10
 00A4 12C0              xjmp L23
 00A6           X2:
 00A6                   .dbline 130
 00A6           ;       {
 00A6           L24:
 00A6                   .dbline 131
 00A6           L25:
 00A6                   .dbline 131
 00A6 84D0              xcall _IsChar
 00A8 0023              tst R16
 00AA E9F3              breq L24
 00AC                   .dbline 132
 00AC 87D0              xcall _RecChar

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -