📄 avrbootloader.lst
字号:
__text_start:
__start:
C13 E001 LDI R16,1
C14 BF05 OUT 0x35,R16
C15 E002 LDI R16,2
C16 BF05 OUT 0x35,R16
C17 E5CF LDI R28,0x5F
C18 E0D4 LDI R29,4
C19 BFCD OUT 0x3D,R28
C1A BFDE OUT 0x3E,R29
C1B 51C0 SUBI R28,0x10
C1C 40D0 SBCI R29,0
C1D EA0A LDI R16,0xAA
C1E 8308 STD Y+0,R16
C1F 2400 CLR R0
C20 E6E0 LDI R30,0x60
C21 E0F0 LDI R31,0
C22 E010 LDI R17,0
C23 3AE2 CPI R30,0xA2
C24 07F1 CPC R31,R17
C25 F011 BEQ 0x0C28
C26 9201 ST R0,Z+
C27 CFFB RJMP 0x0C23
C28 8300 STD Z+0,R16
C29 E2E6 LDI R30,0x26
C2A E1F8 LDI R31,0x18
C2B E6A0 LDI R26,0x60
C2C E0B0 LDI R27,0
C2D E118 LDI R17,0x18
C2E E000 LDI R16,0
C2F BF0B OUT 0x3B,R16
C30 32E6 CPI R30,0x26
C31 07F1 CPC R31,R17
C32 F021 BEQ 0x0C37
C33 95C8 LPM
C34 9631 ADIW R30,1
C35 920D ST R0,X+
C36 CFF9 RJMP 0x0C30
C37 D0E1 RCALL _main
_exit:
C38 CFFF RJMP _exit
FILE: F:\AVR常用函数\BootLooderMage8\BootLoad_1M\main.c
(0001) /******************************************************************************
(0002) Atmega8、16 BootLoad程序
(0003) 日 期:2004年的最后一天
(0004) 肖 鹏 www.527dz.com 527dz@527dz.com
(0005)
(0006) /*****************************************************************************/
(0007)
(0008) //修改pei2005.6.24
(0009) //1.针对W0和W1的硬件进行修改,主要是使用晶振、修改Baud、关无线模块
(0010) //2.增加:用户区无程序时不跳出Boot循环
(0011) //3.修正Bug:原GetPageNumber()由于移位的原因,PageAddress!=0xffff,即FlashLoad()无法退出
(0012) //4.增加:Page地址比较重要,也要效验,添加到GetPage()中
(0013)
(0014) #include <macros.h>
(0015) #include "assembly.h"
(0016)
(0017) #define W0
(0018) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0019) //请根据目标板选择芯片型号
(0020) #ifdef W0
(0021) #define ChipType Atmega8
(0022) #else
(0023) #define ChipType Atmega16
(0024) #endif
(0025) //#define ChipType Atmega32
(0026) //#define ChipType Atmega64
(0027) //#define ChipType Atmega128
(0028) //#define ChipType Atmega8535
(0029) //*********************************************************
(0030) //选择BOOT区大小
(0031) //#define BootSize 'a' //128
(0032) //#define BootSize 'b' //256
(0033) #define BootSize 'c' //512
(0034) //#define BootSize 'd' //1024
(0035) //#define BootSize 'e' //2048(不知道是否有2048字BOOT空间的芯片)
(0036) //选择BootLoad版本号
(0037) //#define BootVer 'f' //1.0版本
(0038) #define BootVer 'g' //1.1版本 pei
(0039) //#define BootVer 'h' //1.2版本
(0040) //#define BootVer 'i' //1.3版本
(0041) //#define BootVer 'j' //1.4版本
(0042) //#define BootVer 'k' //1.5版本
(0043) //#define BootVer 'l' //1.6版本
(0044) //#define BootVer 'm' //1.7版本
(0045) //#define BootVer 'n' //1.8版本
(0046) //#define BootVer 'o' //1.9版本
(0047) //#define BootVer 'p' //2.0版本(应该是最终版本了)
(0048) //**********************************************************
(0049) #define Atmega8 0x30
(0050) #define Atmega16 0x31
(0051) #define Atmega32 0x32
(0052) #define Atmega64 0x33
(0053) #define Atmega128 0x34
(0054) #define Atmega8535 0x35
(0055) //*****************************************************************************
(0056) //#define InteClk //是否使用内部时钟
(0057) #define OscAddress 0x1fff //时钟校准值存储地址
(0058) //#define OscAddress 0x3fff //时钟校准值存储地址
(0059) //*****************************************************************************
(0060) //8时钟下的波特率设置
(0061) //#define BAU 103 //4800
(0062) #define BAU 51 //9600
(0063) //#define BAU 34 //14400
(0064) //#define BAU 25 //19200
(0065) //*****************************************************************************
(0066)
(0067) //11.0592M pei
(0068) //#define BAU 35 //pei baud19200
(0069) //#define BAU 17 //pei baud38400
(0070)
(0071) #if (ChipType == Atmega8)
(0072) #include "iom8v.h"
(0073) #define PageByte 64
(0074) #define AddressShift 6
(0075) #endif
(0076)
(0077) #if (ChipType == Atmega16)
(0078) #include "iom16v.h"
(0079) #define PageByte 128
(0080) #define AddressShift 7
(0081) #endif
(0082)
(0083) void FlashLoad (void);
(0084) void GetPageNumber (void);
(0085) void ExecCode (void);
(0086) char GetPage (void);
(0087) void WriteFlash (void);
(0088) char CheckFlash (void);
(0089) void SendChar (unsigned char c);
(0090) void delay (void); //1ms延时函数
(0091) unsigned char RecChar (void);
(0092)
(0093) unsigned char PageBuffer[PageByte];
(0094) unsigned int PageAddress;
(0095)
(0096) /*****************************************************************************/
(0097) //Flash编程
(0098) /*****************************************************************************/
(0099) void FlashLoad(void)
(0100) {unsigned char AddH,AddL;
(0101) SendChar('!');
_FlashLoad:
AddL --> Y,+1
AddH --> Y,+1
C39 E201 LDI R16,0x21
C3A D0B5 RCALL _SendChar
C3B C018 RJMP 0x0C54
(0102) while (1)
(0103) {
(0104) //GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) //if (PageAddress == 0xffff) return;//退不出了:)
(0106)
(0107) if (GetPage())
C3C D019 RCALL _GetPage
C3D 2300 TST R16
C3E F099 BEQ 0x0C52
(0108) {
(0109) if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
C3F 9180 0060 LDS R24,PageAddress
C41 9190 0061 LDS R25,PageAddress+1
C43 3F8F CPI R24,0xFF
C44 EFEF LDI R30,0xFF
C45 079E CPC R25,R30
C46 F409 BNE 0x0C48
C47 C00D RJMP 0x0C55
(0110)
(0111) WriteFlash();
C48 D04B RCALL _WriteFlash
(0112) if (CheckFlash()) SendChar('!');
C49 D076 RCALL _CheckFlash
C4A 2300 TST R16
C4B F019 BEQ 0x0C4F
C4C E201 LDI R16,0x21
C4D D0A2 RCALL _SendChar
C4E C005 RJMP 0x0C54
(0113) else SendChar('@');
C4F E400 LDI R16,0x40
C50 D09F RCALL _SendChar
(0114) }
C51 C002 RJMP 0x0C54
(0115) else SendChar('@');
C52 E400 LDI R16,0x40
C53 D09C RCALL _SendChar
C54 CFE7 RJMP 0x0C3C
C55 9508 RET
_GetPage:
CheckSum --> R12
AddL --> R14
AddH --> R20
LocalCheckSum --> R10
i --> R20
C56 D14B RCALL push_xgset30FC
(0116) }
(0117) }
(0118)
(0119) /****************************************************************************
(0120) void GetPageNumber(void)
(0121) {
(0122) unsigned char PageAddressH;
(0123) unsigned char PageAddressL;
(0124)
(0125) PageAddressH = RecChar();
(0126)
(0127) PageAddressL = RecChar();
(0128)
(0129) PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
(0130) }
(0131)
(0132) /*****************************************************************************/
(0133) char GetPage(void)
(0134) {
(0135) unsigned char i,AddH,AddL;
(0136) unsigned char LocalCheckSum = 0;
C57 24AA CLR R10
(0137) unsigned char CheckSum = 0;
C58 24CC CLR R12
(0138)
(0139) AddH=RecChar();AddL=RecChar();
C59 D092 RCALL _RecChar
C5A 2F40 MOV R20,R16
C5B D090 RCALL _RecChar
C5C 2EE0 MOV R14,R16
(0140) PageAddress=(AddH<<8)+AddL;
C5D 2E34 MOV R3,R20
C5E 2C2E MOV R2,R14
C5F 9230 0061 STS PageAddress+1,R3
C61 9220 0060 STS PageAddress,R2
(0141) if (PageAddress==0xffff) return 1;//exit..
C63 01C1 MOVW R24,R2
C64 3F8F CPI R24,0xFF
C65 EFEF LDI R30,0xFF
C66 079E CPC R25,R30
C67 F411 BNE 0x0C6A
C68 E001 LDI R16,1
C69 C029 RJMP 0x0C93
(0142) PageAddress=PageAddress<<AddressShift;
C6A E026 LDI R18,6
C6B E030 LDI R19,0
C6C 9100 0060 LDS R16,PageAddress
C6E 9110 0061 LDS R17,PageAddress+1
C70 D152 RCALL lsl16
C71 9310 0061 STS PageAddress+1,R17
C73 9300 0060 STS PageAddress,R16
(0143) LocalCheckSum=AddH+AddL;//pei考虑Page的效验
C75 2EA4 MOV R10,R20
C76 0CAE ADD R10,R14
(0144)
(0145) for (i=0;i<PageByte;i++)
C77 2744 CLR R20
C78 C010 RJMP 0x0C89
(0146) {
(0147) PageBuffer[i]=RecChar();
C79 D072 RCALL _RecChar
C7A 2EE0 MOV R14,R16
C7B E682 LDI R24,0x62
C7C E090 LDI R25,0
C7D 2FE4 MOV R30,R20
C7E 27FF CLR R31
C7F 0FE8 ADD R30,R24
C80 1FF9 ADC R31,R25
C81 82E0 STD Z+0,R14
(0148) LocalCheckSum += PageBuffer[i];
C82 2FE4 MOV R30,R20
C83 27FF CLR R31
C84 0FE8 ADD R30,R24
C85 1FF9 ADC R31,R25
C86 8020 LDD R2,Z+0
C87 0CA2 ADD R10,R2
C88 9543 INC R20
C89 3440 CPI R20,0x40
C8A F370 BCS 0x0C79
(0149) }
(0150)
(0151) CheckSum = RecChar();
C8B D060 RCALL _RecChar
C8C 2EE0 MOV R14,R16
C8D 2CCE MOV R12,R14
(0152) if (LocalCheckSum == CheckSum) return 1;
C8E 16A0 CP R10,R16
C8F F411 BNE 0x0C92
C90 E001 LDI R16,1
C91 C001 RJMP 0x0C93
(0153) else return 0;
C92 2700 CLR R16
C93 C103 RJMP pop_xgset30FC
_WriteFlash:
TempInt --> R10
i --> R20
C94 D116 RCALL push_xgset300C
(0154) }
(0155)
(0156) /*****************************************************************************/
(0157) void WriteFlash(void)
(0158) {
(0159) unsigned int i;
(0160) unsigned int TempInt;
(0161)
(0162) for (i=0;i<PageByte;i+=2)
C95 2744 CLR R20
C96 2755 CLR R21
C97 C016 RJMP 0x0CAE
(0163) {
(0164) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
C98 E682 LDI R24,0x62
C99 E090 LDI R25,0
C9A 01FA MOVW R30,R20
C9B 9631 ADIW R30,1
C9C 0FE8 ADD R30,R24
C9D 1FF9 ADC R31,R25
C9E 8020 LDD R2,Z+0
C9F 2433 CLR R3
CA0 2C32 MOV R3,R2
CA1 2422 CLR R2
CA2 01FA MOVW R30,R20
CA3 0FE8 ADD R30,R24
CA4 1FF9 ADC R31,R25
CA5 80A0 LDD R10,Z+0
CA6 24BB CLR R11
CA7 0CA2 ADD R10,R2
CA8 1CB3 ADC R11,R3
(0165) fill_temp_buffer(TempInt,i); //call asm routine.
CA9 019A MOVW R18,R20
CAA 0185 MOVW R16,R10
CAB D0CC RCALL _fill_temp_buffer
CAC 5F4E SUBI R20,0xFE
CAD 4F5F SBCI R21,0xFF
CAE 3440 CPI R20,0x40
CAF E0E0 LDI R30,0
CB0 075E CPC R21,R30
CB1 F330 BCS 0x0C98
(0166) }
(0167)
(0168) write_page(PageAddress,0x03); //擦除页
CB2 E023 LDI R18,3
CB3 9100 0060 LDS R16,PageAddress
CB5 9110 0061 LDS R17,PageAddress+1
CB7 D0BA RCALL _write_page
(0169) write_page(PageAddress,0x05); //写页数据
CB8 E025 LDI R18,5
CB9 9100 0060 LDS R16,PageAddress
CBB 9110 0061 LDS R17,PageAddress+1
CBD D0B4 RCALL _write_page
(0170)
(0171) enableRWW();
CBE D0CD RCALL _enableRWW
CBF C0F0 RJMP pop_xgset300C
_CheckFlash:
TempInt2 --> R12
TempInt --> R10
i --> R20
CC0 D0F4 RCALL push_xgset303C
(0172) }
(0173)
(0174) /*****************************************************************************/
(0175)
(0176) char CheckFlash(void)
(0177) {
(0178) unsigned char i;
(0179) unsigned int TempInt;
(0180) unsigned int TempInt2;
(0181)
(0182) for (i=0;i<PageByte;i+=2)
CC1 2744 CLR R20
CC2 C025 RJMP 0x0CE8
(0183) {
(0184) TempInt = read_program_memory(PageAddress + i,0x00);
CC3 2722 CLR R18
CC4 2E24 MOV R2,R20
CC5 2433 CLR R3
CC6 9100 0060 LDS R16,PageAddress
CC8 9110 0061 LDS R17,PageAddress+1
CCA 0D02 ADD R16,R2
CCB 1D13 ADC R17,R3
CCC D0B8 RCALL _read_program_memory
CCD 0158 MOVW R10,R16
(0185) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
CCE E683 LDI R24,0x63
CCF E090 LDI R25,0
CD0 2FE4 MOV R30,R20
CD1 27FF CLR R31
CD2 0FE8 ADD R30,R24
CD3 1FF9 ADC R31,R25
CD4 8020 LDD R2,Z+0
CD5 2433 CLR R3
CD6 2C32 MOV R3,R2
CD7 2422 CLR R2
CD8 E682 LDI R24,0x62
CD9 E090 LDI R25,0
CDA 2FE4 MOV R30,R20
CDB 27FF CLR R31
CDC 0FE8 ADD R30,R24
CDD 1FF9 ADC R31,R25
CDE 80C0 LDD R12,Z+0
CDF 24DD CLR R13
CE0 0CC2 ADD R12,R2
CE1 1CD3 ADC R13,R3
(0186) if (TempInt != TempInt2) return 0;
CE2 150C CP R16,R12
CE3 051D CPC R17,R13
CE4 F011 BEQ 0x0CE7
CE5 2700 CLR R16
CE6 C004 RJMP 0x0CEB
CE7 5F4E SUBI R20,0xFE
CE8 3440 CPI R20,0x40
CE9 F2C8 BCS 0x0CC3
(0187) }
(0188) return 1;
CEA E001 LDI R16,1
CEB C0D0 RJMP pop_xgset303C
(0189) }
(0190)
(0191) /*****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -