📄 hhh.lst
字号:
__start:
__text_start:
FC46 E001 LDI R16,1
FC47 BF05 OUT 0x35,R16
FC48 E002 LDI R16,2
FC49 BF05 OUT 0x35,R16
FC4A EFCF LDI R28,0xFF
FC4B E1D0 LDI R29,0x10
FC4C BFCD OUT 0x3D,R28
FC4D BFDE OUT 0x3E,R29
FC4E 52C0 SUBI R28,0x20
FC4F 40D0 SBCI R29,0
FC50 EA0A LDI R16,0xAA
FC51 8308 STD Y+0,R16
FC52 2400 CLR R0
FC53 E0E0 LDI R30,0
FC54 E0F1 LDI R31,1
FC55 E012 LDI R17,2
FC56 30E4 CPI R30,4
FC57 07F1 CPC R31,R17
FC58 F011 BEQ 0xFC5B
FC59 9201 ST R0,Z+
FC5A CFFB RJMP 0xFC56
FC5B 8300 STD Z+0,R16
FC5C E8EC LDI R30,0x8C
FC5D EFF8 LDI R31,0xF8
FC5E E0A0 LDI R26,0
FC5F E0B1 LDI R27,1
FC60 EF18 LDI R17,0xF8
FC61 E001 LDI R16,1
FC62 BF0B OUT 0x3B,R16
FC63 38EC CPI R30,0x8C
FC64 07F1 CPC R31,R17
FC65 F021 BEQ 0xFC6A
FC66 95D8 ELPM
FC67 9631 ADIW R30,1
FC68 920D ST R0,X+
FC69 CFF9 RJMP 0xFC63
FC6A D105 RCALL _main
_exit:
FC6B CFFF RJMP _exit
FILE: E:\icc\peterf\BootLoad\main.c
(0001) /******************************************************************************
(0002) Atmega系列单片机 BootLoad程序
(0003) 日 期:2004年的最后一天
(0004) 肖 鹏 www.527dz.com 527dz@527dz.com
(0005)
(0006) /*****************************************************************************/
(0007) #include <macros.h>
(0008) #include "assembly.h"
(0009) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0010) #define fosc 8000000 //晶振频率
(0011) #define baud1 38400 //波特率
(0012) //请根据目标板选择芯片型号
(0013) //#define ChipType Atmega8
(0014) //#define ChipType Atmega16
(0015) //#define ChipType Atmega32
(0016) //#define ChipType Atmega64
(0017) #define ChipType Atmega128
(0018) //#define ChipType Atmega8515
(0019) //#define ChipType Atmega8535
(0020) //*********************************************************
(0021) //选择BOOT区大小
(0022) //#define BootSize 'a' //128
(0023) //#define BootSize 'b' //256
(0024) //#define BootSize 'c' //512
(0025) #define BootSize 'd' //1024
(0026) //#define BootSize 'e' //2048(不知道是否有2048字BOOT空间的芯片)
(0027) //选择BootLoad版本号
(0028) #define BootVer 'f' //1.0版本
(0029) //#define BootVer 'g' //1.1版本
(0030) //#define BootVer 'h' //1.2版本
(0031) //#define BootVer 'i' //1.3版本
(0032) //#define BootVer 'j' //1.4版本
(0033) //#define BootVer 'k' //1.5版本
(0034) //#define BootVer 'l' //1.6版本
(0035) //#define BootVer 'm' //1.7版本
(0036) //#define BootVer 'n' //1.8版本
(0037) //#define BootVer 'o' //1.9版本
(0038) //#define BootVer 'p' //2.0版本(应该是最终版本了)
(0039) //**********************************************************
(0040) #define Atmega8 0x30
(0041) #define Atmega16 0x31
(0042) #define Atmega32 0x32
(0043) #define Atmega64 0x33
(0044) #define Atmega128 0x34
(0045) #define Atmega8515 0x35
(0046) #define Atmega8535 0x36
(0047) //*****************************************************************************
(0048) #define InteClk //是否使用内部时钟
(0049) #define OscAddress 0x1fff //时钟校准值存储地址
(0050) //#define OscAddress 0x3fff //时钟校准值存储地址
(0051) //*****************************************************************************
(0052) //8时钟下的波特率设置
(0053) //#define BAU 103 //4800
(0054) //#define BAU 51 //9600
(0055) //#define BAU 34 //14400
(0056) #define BAU 25 //19200
(0057) //*****************************************************************************
(0058) #if (ChipType == Atmega8)
(0059) #include "iom8v.h"
(0060) #define PageByte 64
(0061) #define AddressShift 6
(0062) #define INTVECREG GICR
(0063) #endif
(0064)
(0065) #if (ChipType == Atmega16)
(0066) #include "iom16v.h"
(0067) #define PageByte 128
(0068) #define AddressShift 7
(0069) #define INTVECREG GICR
(0070) #endif
(0071)
(0072) #if (ChipType == Atmega32)
(0073) #include "iom32v.h"
(0074) #define PageByte 128
(0075) #define AddressShift 7
(0076) #define INTVECREG GICR
(0077) #endif
(0078)
(0079) #if (ChipType == Atmega64)
(0080) #include "iom64v.h"
(0081) #define PageByte 256
(0082) #define AddressShift 8
(0083) #define INTVECREG MCUCR
(0084) #endif
(0085)
(0086) #if (ChipType == Atmega128)
(0087) #include "iom128v.h"
(0088) #define PageByte 256
(0089) #define AddressShift 8
(0090) #define INTVECREG MCUCR
(0091) #define RAMPZ_FLAG
(0092) #endif
(0093)
(0094) #if (ChipType == Atmega8515)
(0095) #include "iom8515v.h"
(0096) #define PageByte 64
(0097) #define AddressShift 6
(0098) #define INTVECREG GICR
(0099) #endif
(0100)
(0101) void FlashLoad (void);
(0102) void GetPageNumber (void);
(0103) void ExecCode (void);
(0104) char GetPage (void);
(0105) void WriteFlash (void);
(0106) char CheckFlash (void);
(0107) unsigned char IsChar (void);
(0108) void SendChar (unsigned char c);
(0109) void delay (void); //1ms延时函数
(0110) unsigned char RecChar (void);
(0111)
(0112) unsigned char PageBuffer[PageByte];
(0113) unsigned int RealPageAddress;
(0114) unsigned int PageAddress;
(0115)
(0116) /*****************************************************************************/
(0117) //Flash编程
(0118) /*****************************************************************************/
(0119) void FlashLoad(void)
(0120) {
(0121) SendChar('!');
_FlashLoad:
FC6C E201 LDI R16,0x21
FC6D D0E9 RCALL _SendChar
FC6E C019 RJMP 0xFC88
(0122) while (1)
(0123) {
(0124) GetPageNumber();
FC6F D01A RCALL _GetPageNumber
(0125)
(0126) if (RealPageAddress == 0xffff)
FC70 91800102 LDS R24,_RealPageAddress
FC72 91900103 LDS R25,_RealPageAddress+1
FC74 3F8F CPI R24,0xFF
FC75 EFEF LDI R30,0xFF
FC76 079E CPC R25,R30
FC77 F409 BNE 0xFC79
(0127) return;
FC78 C010 RJMP 0xFC89
(0128)
(0129) if (GetPage())
FC79 D02C RCALL _GetPage
FC7A 2300 TST R16
FC7B F051 BEQ 0xFC86
(0130) {
(0131) WriteFlash();
FC7C D065 RCALL _WriteFlash
(0132) if (CheckFlash())
FC7D D097 RCALL _CheckFlash
FC7E 2300 TST R16
FC7F F019 BEQ 0xFC83
(0133) SendChar('!');
FC80 E201 LDI R16,0x21
FC81 D0D5 RCALL _SendChar
FC82 C005 RJMP 0xFC88
(0134) else
(0135) SendChar('@');
FC83 E400 LDI R16,0x40
FC84 D0D2 RCALL _SendChar
(0136) }
FC85 C002 RJMP 0xFC88
(0137) else
(0138) SendChar('@');
FC86 E400 LDI R16,0x40
FC87 D0CF RCALL _SendChar
FC88 CFE6 RJMP 0xFC6F
(0139) }
(0140) }
FC89 9508 RET
_GetPageNumber:
PageAddressL --> R22
PageAddressH --> R20
FC8A 940EFDFD CALL push_gset2
(0141)
(0142) /*****************************************************************************/
(0143) void GetPageNumber(void)
(0144) {
(0145) unsigned char PageAddressH;
(0146) unsigned char PageAddressL;
(0147)
(0148) PageAddressH = RecChar();
FC8C D0C3 RCALL _RecChar
FC8D 2F40 MOV R20,R16
(0149)
(0150) PageAddressL = RecChar();
FC8E D0C1 RCALL _RecChar
FC8F 2F60 MOV R22,R16
(0151)
(0152) RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
FC90 2E34 MOV R3,R20
FC91 2E26 MOV R2,R22
FC92 92300103 STS _RealPageAddress+1,R3
FC94 92200102 STS _RealPageAddress,R2
(0153) PageAddress=RealPageAddress<<AddressShift;
FC96 2C32 MOV R3,R2
FC97 2422 CLR R2
FC98 92300101 STS _PageAddress+1,R3
FC9A 92200100 STS _PageAddress,R2
(0154) #ifdef RAMPZ_FLAG
(0155) if (PageAddressH)
FC9C 2344 TST R20
FC9D F019 BEQ 0xFCA1
(0156) RAMPZ = 1;
FC9E E081 LDI R24,1
FC9F BF8B OUT 0x3B,R24
FCA0 C002 RJMP 0xFCA3
(0157) else
(0158) RAMPZ = 0;
FCA1 2422 CLR R2
FCA2 BE2B OUT 0x3B,R2
(0159) #endif
(0160) //SendChar(RealPageAddress>>8);
(0161) //SendChar(RealPageAddress);
(0162) //SendChar(PageAddress>>8);
(0163) //SendChar(PageAddress);
(0164) }
FCA3 940EFDE2 CALL pop_gset2
FCA5 9508 RET
_GetPage:
CheckSum --> R20
LocalCheckSum --> R22
i --> R10
FCA6 940EFE00 CALL push_gset3
(0165)
(0166) /*****************************************************************************/
(0167) char GetPage(void)
(0168) {
(0169) unsigned char i;
(0170) unsigned char LocalCheckSum = 0;
FCA8 2766 CLR R22
(0171) unsigned char CheckSum = 0;
FCA9 2744 CLR R20
(0172)
(0173) for (i=0;i<PageByte/2;i++)
FCAA 24AA CLR R10
FCAB C012 RJMP 0xFCBE
(0174) {
(0175) while(!IsChar());
FCAC D09B RCALL _IsChar
FCAD 2300 TST R16
FCAE F3E9 BEQ 0xFCAC
(0176) PageBuffer[i]=RecChar();
FCAF D0A0 RCALL _RecChar
FCB0 E084 LDI R24,4
FCB1 E091 LDI R25,1
FCB2 2DEA MOV R30,R10
FCB3 27FF CLR R31
FCB4 0FE8 ADD R30,R24
FCB5 1FF9 ADC R31,R25
FCB6 8300 STD Z+0,R16
(0177) LocalCheckSum ^= PageBuffer[i];
FCB7 2DEA MOV R30,R10
FCB8 27FF CLR R31
FCB9 0FE8 ADD R30,R24
FCBA 1FF9 ADC R31,R25
FCBB 8020 LDD R2,Z+0
FCBC 2562 EOR R22,R2
FCBD 94A3 INC R10
FCBE 2D8A MOV R24,R10
FCBF 3880 CPI R24,0x80
FCC0 F358 BCS 0xFCAC
(0178) }
(0179) for (i=0;i<PageByte/2;i++)
FCC1 24AA CLR R10
FCC2 C012 RJMP 0xFCD5
(0180) {
(0181) while(!IsChar());
FCC3 D084 RCALL _IsChar
FCC4 2300 TST R16
FCC5 F3E9 BEQ 0xFCC3
(0182) PageBuffer[i+PageByte/2]=RecChar();
FCC6 D089 RCALL _RecChar
FCC7 E884 LDI R24,0x84
FCC8 E091 LDI R25,1
FCC9 2DEA MOV R30,R10
FCCA 27FF CLR R31
FCCB 0FE8 ADD R30,R24
FCCC 1FF9 ADC R31,R25
FCCD 8300 STD Z+0,R16
(0183) LocalCheckSum ^= PageBuffer[i+PageByte/2];
FCCE 2DEA MOV R30,R10
FCCF 27FF CLR R31
FCD0 0FE8 ADD R30,R24
FCD1 1FF9 ADC R31,R25
FCD2 8020 LDD R2,Z+0
FCD3 2562 EOR R22,R2
FCD4 94A3 INC R10
FCD5 2D8A MOV R24,R10
FCD6 3880 CPI R24,0x80
FCD7 F358 BCS 0xFCC3
(0184) }
(0185) CheckSum = RecChar();
FCD8 D077 RCALL _RecChar
FCD9 2F40 MOV R20,R16
(0186)
(0187) if (LocalCheckSum == CheckSum)
FCDA 1760 CP R22,R16
FCDB F411 BNE 0xFCDE
(0188) return 1;
FCDC E001 LDI R16,1
FCDD C001 RJMP 0xFCDF
(0189) else
(0190) return 0;
FCDE 2700 CLR R16
FCDF 940EFDE4 CALL pop_gset3
FCE1 9508 RET
_WriteFlash:
TempInt --> R20
i --> R22
FCE2 940EFDFD CALL push_gset2
(0191) }
(0192)
(0193) /*****************************************************************************/
(0194) void WriteFlash(void)
(0195) {
(0196) unsigned int i;
(0197) unsigned int TempInt;
(0198) for (i=0;i<PageByte;i+=2)
FCE4 2766 CLR R22
FCE5 2777 CLR R23
FCE6 C017 RJMP 0xFCFE
(0199) {
(0200) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
FCE7 E084 LDI R24,4
FCE8 E091 LDI R25,1
FCE9 01FB MOVW R30,R22
FCEA 9631 ADIW R30,1
FCEB 0FE8 ADD R30,R24
FCEC 1FF9 ADC R31,R25
FCED 8020 LDD R2,Z+0
FCEE 2433 CLR R3
FCEF 2C32 MOV R3,R2
FCF0 2422 CLR R2
FCF1 01FB MOVW R30,R22
FCF2 0FE8 ADD R30,R24
FCF3 1FF9 ADC R31,R25
FCF4 8140 LDD R20,Z+0
FCF5 2755 CLR R21
FCF6 0D42 ADD R20,R2
FCF7 1D53 ADC R21,R3
(0201) fill_temp_buffer(TempInt,i); //call asm routine.
FCF8 019B MOVW R18,R22
FCF9 018A MOVW R16,R20
FCFA 940EFDC3 CALL _fill_temp_buffer
FCFC 5F6E SUBI R22,0xFE
FCFD 4F7F SBCI R23,0xFF
FCFE 3060 CPI R22,0
FCFF E0E1 LDI R30,1
FD00 077E CPC R23,R30
FD01 F328 BCS 0xFCE7
(0202) }
(0203) write_page(PageAddress,0x03); //擦除页
FD02 E023 LDI R18,3
FD03 91000100 LDS R16,_PageAddress
FD05 91100101 LDS R17,_PageAddress+1
FD07 940EFDBD CALL _write_page
(0204) write_page(PageAddress,0x05); //写页数据
FD09 E025 LDI R18,5
FD0A 91000100 LDS R16,_PageAddress
FD0C 91100101 LDS R17,_PageAddress+1
FD0E 940EFDBD CALL _write_page
(0205)
(0206) enableRWW();
FD10 940EFDD7 CALL _enableRWW
(0207) }
FD12 940EFDE2 CALL pop_gset2
FD14 9508 RET
_CheckFlash:
TempInt2 --> R20
TempInt --> R22
i --> R10
FD15 940EFE00 CALL push_gset3
(0208)
(0209) /*****************************************************************************/
(0210)
(0211) char CheckFlash(void)
(0212) {
(0213) unsigned char i;
(0214) unsigned int TempInt;
(0215) unsigned int TempInt2;
(0216)
(0217) for (i=0;i<PageByte;i+=2)
FD17 24AA CLR R10
FD18 C028 RJMP 0xFD41
(0218) {
(0219) TempInt = read_program_memory(PageAddress + i,0x00);
FD19 2722 CLR R18
FD1A 2C2A MOV R2,R10
FD1B 2433 CLR R3
FD1C 91000100 LDS R16,_PageAddress
FD1E 91100101 LDS R17,_PageAddress+1
FD20 0D02 ADD R16,R2
FD21 1D13 ADC R17,R3
FD22 940EFDD0 CALL _read_program_memory
FD24 01B8 MOVW R22,R16
(0220) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
FD25 E085 LDI R24,5
FD26 E091 LDI R25,1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -