📄 main.lis
字号:
.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 + -