📄 avrboot_m8_16.lst
字号:
__start:
__text_start:
1E2A E001 LDI R16,1
1E2B BF05 OUT 0x35,R16
1E2C E002 LDI R16,2
1E2D BF05 OUT 0x35,R16
1E2E E5CF LDI R28,0x5F
1E2F E0D4 LDI R29,4
1E30 BFCD OUT 0x3D,R28
1E31 BFDE OUT 0x3E,R29
1E32 54C0 SUBI R28,0x40
1E33 40D0 SBCI R29,0
1E34 EA0A LDI R16,0xAA
1E35 8308 STD Y+0,R16
1E36 2400 CLR R0
1E37 E6E0 LDI R30,0x60
1E38 E0F0 LDI R31,0
1E39 E010 LDI R17,0
1E3A 3EE2 CPI R30,0xE2
1E3B 07F1 CPC R31,R17
1E3C F011 BEQ 0x1E3F
1E3D 9201 ST R0,Z+
1E3E CFFB RJMP 0x1E3A
1E3F 8300 STD Z+0,R16
1E40 E5E4 LDI R30,0x54
1E41 E3FC LDI R31,0x3C
1E42 E6A0 LDI R26,0x60
1E43 E0B0 LDI R27,0
1E44 E31C LDI R17,0x3C
1E45 35E4 CPI R30,0x54
1E46 07F1 CPC R31,R17
1E47 F021 BEQ 0x1E4C
1E48 95C8 LPM
1E49 9631 ADIW R30,1
1E4A 920D ST R0,X+
1E4B CFF9 RJMP 0x1E45
1E4C D0D3 RCALL _main
_exit:
1E4D CFFF RJMP _exit
FILE: E:\icc\peter\BootLoad\main.c
(0001) /******************************************************************************
(0002) Atmega8、16 BootLoad程序
(0003) 日 期:2004年的最后一天
(0004) 肖 鹏 www.527dz.com 527dz@527dz.com
(0005)
(0006) /*****************************************************************************/
(0007) #include <macros.h>
(0008) #include "assembly.h"
(0009) //×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
(0010) //请根据目标板选择芯片型号
(0011) //#define ChipType Atmega8
(0012) #define ChipType Atmega16
(0013) //#define ChipType Atmega32
(0014) //#define ChipType Atmega64
(0015) //#define ChipType Atmega128
(0016) //#define ChipType Atmega8535
(0017) //*********************************************************
(0018) //选择BOOT区大小
(0019) //#define BootSize 'a' //128
(0020) //#define BootSize 'b' //256
(0021) #define BootSize 'c' //512
(0022) //#define BootSize 'd' //1024
(0023) //#define BootSize 'e' //2048(不知道是否有2048字BOOT空间的芯片)
(0024) //选择BootLoad版本号
(0025) #define BootVer 'f' //1.0版本
(0026) //#define BootVer 'g' //1.1版本
(0027) //#define BootVer 'h' //1.2版本
(0028) //#define BootVer 'i' //1.3版本
(0029) //#define BootVer 'j' //1.4版本
(0030) //#define BootVer 'k' //1.5版本
(0031) //#define BootVer 'l' //1.6版本
(0032) //#define BootVer 'm' //1.7版本
(0033) //#define BootVer 'n' //1.8版本
(0034) //#define BootVer 'o' //1.9版本
(0035) //#define BootVer 'p' //2.0版本(应该是最终版本了)
(0036) //**********************************************************
(0037) #define Atmega8 0x30
(0038) #define Atmega16 0x31
(0039) #define Atmega32 0x32
(0040) #define Atmega64 0x33
(0041) #define Atmega128 0x34
(0042) #define Atmega8535 0x35
(0043) //*****************************************************************************
(0044) #define InteClk //是否使用内部时钟
(0045) #define OscAddress 0x1fff //时钟校准值存储地址
(0046) //#define OscAddress 0x3fff //时钟校准值存储地址
(0047) //*****************************************************************************
(0048) //8时钟下的波特率设置
(0049) //#define BAU 103 //4800
(0050) #define BAU 51 //9600
(0051) //#define BAU 34 //14400
(0052) //#define BAU 25 //19200
(0053) //*****************************************************************************
(0054) #if (ChipType == Atmega8)
(0055) #include "iom8v.h"
(0056) #define PageByte 64
(0057) #define AddressShift 6
(0058) #endif
(0059)
(0060) #if (ChipType == Atmega16)
(0061) #include "iom16v.h"
(0062) #define PageByte 128
(0063) #define AddressShift 7
(0064) #endif
(0065)
(0066) void FlashLoad (void);
(0067) void GetPageNumber (void);
(0068) void ExecCode (void);
(0069) char GetPage (void);
(0070) void WriteFlash (void);
(0071) char CheckFlash (void);
(0072) void SendChar (unsigned char c);
(0073) void delay (void); //1ms延时函数
(0074) unsigned char RecChar (void);
(0075)
(0076) unsigned char PageBuffer[PageByte];
(0077) unsigned int PageAddress;
(0078)
(0079) /*****************************************************************************/
(0080) //Flash编程
(0081) /*****************************************************************************/
(0082) void FlashLoad(void)
(0083) {
(0084) SendChar('!');
_FlashLoad:
1E4E E201 LDI R16,0x21
1E4F D0BB RCALL _SendChar
1E50 C019 RJMP 0x1E6A
(0085) while (1)
(0086) {
(0087) GetPageNumber();
1E51 D01A RCALL _GetPageNumber
(0088)
(0089) if (PageAddress == 0xffff) return;
1E52 91800060 LDS R24,_PageAddress
1E54 91900061 LDS R25,_PageAddress+1
1E56 3F8F CPI R24,0xFF
1E57 EFEF LDI R30,0xFF
1E58 079E CPC R25,R30
1E59 F409 BNE 0x1E5B
1E5A C010 RJMP 0x1E6B
(0090)
(0091) if (GetPage())
1E5B D023 RCALL _GetPage
1E5C 2300 TST R16
1E5D F051 BEQ 0x1E68
(0092) {
(0093) WriteFlash();
1E5E D042 RCALL _WriteFlash
(0094) if (CheckFlash())
1E5F D074 RCALL _CheckFlash
1E60 2300 TST R16
1E61 F019 BEQ 0x1E65
(0095) SendChar('!');
1E62 E201 LDI R16,0x21
1E63 D0A7 RCALL _SendChar
1E64 C005 RJMP 0x1E6A
(0096) else
(0097) SendChar('@');
1E65 E400 LDI R16,0x40
1E66 D0A4 RCALL _SendChar
(0098) }
1E67 C002 RJMP 0x1E6A
(0099) else SendChar('@');
1E68 E400 LDI R16,0x40
1E69 D0A1 RCALL _SendChar
1E6A CFE6 RJMP 0x1E51
(0100) }
(0101) }
1E6B 9508 RET
_GetPageNumber:
PageAddressL --> R20
PageAddressH --> R22
1E6C 940E1FAD CALL push_gset2
(0102)
(0103) /*****************************************************************************/
(0104) void GetPageNumber(void)
(0105) {
(0106) unsigned char PageAddressH;
(0107) unsigned char PageAddressL;
(0108)
(0109) PageAddressH = RecChar();
1E6E D098 RCALL _RecChar
1E6F 2F60 MOV R22,R16
(0110)
(0111) PageAddressL = RecChar();
1E70 D096 RCALL _RecChar
1E71 2F40 MOV R20,R16
(0112)
(0113) PageAddress=((int)((PageAddressH << 8) + PageAddressL))<<AddressShift;
1E72 2F16 MOV R17,R22
1E73 2F04 MOV R16,R20
1E74 E027 LDI R18,7
1E75 E030 LDI R19,0
1E76 940E1FB5 CALL lsl16
1E78 93100061 STS _PageAddress+1,R17
1E7A 93000060 STS _PageAddress,R16
(0114) }
1E7C 940E1F90 CALL pop_gset2
1E7E 9508 RET
_GetPage:
CheckSum --> R20
LocalCheckSum --> R22
i --> R10
1E7F 940E1FB1 CALL push_gset3
(0115)
(0116) /*****************************************************************************/
(0117) char GetPage(void)
(0118) {
(0119) unsigned char i;
(0120) unsigned char LocalCheckSum = 0;
1E81 2766 CLR R22
(0121) unsigned char CheckSum = 0;
1E82 2744 CLR R20
(0122)
(0123) for (i=0;i<PageByte;i++)
1E83 24AA CLR R10
1E84 C00F RJMP 0x1E94
(0124) {
(0125) PageBuffer[i]=RecChar();
1E85 D081 RCALL _RecChar
1E86 E682 LDI R24,0x62
1E87 E090 LDI R25,0
1E88 2DEA MOV R30,R10
1E89 27FF CLR R31
1E8A 0FE8 ADD R30,R24
1E8B 1FF9 ADC R31,R25
1E8C 8300 STD Z+0,R16
(0126) LocalCheckSum += PageBuffer[i];
1E8D 2DEA MOV R30,R10
1E8E 27FF CLR R31
1E8F 0FE8 ADD R30,R24
1E90 1FF9 ADC R31,R25
1E91 8020 LDD R2,Z+0
1E92 0D62 ADD R22,R2
1E93 94A3 INC R10
1E94 2D8A MOV R24,R10
1E95 3880 CPI R24,0x80
1E96 F370 BCS 0x1E85
(0127) }
(0128)
(0129) CheckSum = RecChar();
1E97 D06F RCALL _RecChar
1E98 2F40 MOV R20,R16
(0130) if (LocalCheckSum == CheckSum) return 1;
1E99 1760 CP R22,R16
1E9A F411 BNE 0x1E9D
1E9B E001 LDI R16,1
1E9C C001 RJMP 0x1E9E
(0131) else return 0;
1E9D 2700 CLR R16
1E9E 940E1F93 CALL pop_gset3
1EA0 9508 RET
_WriteFlash:
TempInt --> R20
i --> R22
1EA1 940E1FAD CALL push_gset2
(0132) }
(0133)
(0134) /*****************************************************************************/
(0135) void WriteFlash(void)
(0136) {
(0137) unsigned int i;
(0138) unsigned int TempInt;
(0139)
(0140) for (i=0;i<PageByte;i+=2)
1EA3 2766 CLR R22
1EA4 2777 CLR R23
1EA5 C017 RJMP 0x1EBD
(0141) {
(0142) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
1EA6 E682 LDI R24,0x62
1EA7 E090 LDI R25,0
1EA8 01FB MOVW R30,R22
1EA9 9631 ADIW R30,1
1EAA 0FE8 ADD R30,R24
1EAB 1FF9 ADC R31,R25
1EAC 8020 LDD R2,Z+0
1EAD 2433 CLR R3
1EAE 2C32 MOV R3,R2
1EAF 2422 CLR R2
1EB0 01FB MOVW R30,R22
1EB1 0FE8 ADD R30,R24
1EB2 1FF9 ADC R31,R25
1EB3 8140 LDD R20,Z+0
1EB4 2755 CLR R21
1EB5 0D42 ADD R20,R2
1EB6 1D53 ADC R21,R3
(0143) fill_temp_buffer(TempInt,i); //call asm routine.
1EB7 019B MOVW R18,R22
1EB8 018A MOVW R16,R20
1EB9 940E1F71 CALL _fill_temp_buffer
1EBB 5F6E SUBI R22,0xFE
1EBC 4F7F SBCI R23,0xFF
1EBD 3860 CPI R22,0x80
1EBE E0E0 LDI R30,0
1EBF 077E CPC R23,R30
1EC0 F328 BCS 0x1EA6
(0144) }
(0145)
(0146) write_page(PageAddress,0x03); //擦除页
1EC1 E023 LDI R18,3
1EC2 91000060 LDS R16,_PageAddress
1EC4 91100061 LDS R17,_PageAddress+1
1EC6 940E1F6B CALL _write_page
(0147) write_page(PageAddress,0x05); //写页数据
1EC8 E025 LDI R18,5
1EC9 91000060 LDS R16,_PageAddress
1ECB 91100061 LDS R17,_PageAddress+1
1ECD 940E1F6B CALL _write_page
(0148)
(0149) enableRWW();
1ECF 940E1F85 CALL _enableRWW
(0150) }
1ED1 940E1F90 CALL pop_gset2
1ED3 9508 RET
_CheckFlash:
TempInt2 --> R20
TempInt --> R22
i --> R10
1ED4 940E1FB1 CALL push_gset3
(0151)
(0152) /*****************************************************************************/
(0153)
(0154) char CheckFlash(void)
(0155) {
(0156) unsigned char i;
(0157) unsigned int TempInt;
(0158) unsigned int TempInt2;
(0159)
(0160) for (i=0;i<PageByte;i+=2)
1ED6 24AA CLR R10
1ED7 C028 RJMP 0x1F00
(0161) {
(0162) TempInt = read_program_memory(PageAddress + i,0x00);
1ED8 2722 CLR R18
1ED9 2C2A MOV R2,R10
1EDA 2433 CLR R3
1EDB 91000060 LDS R16,_PageAddress
1EDD 91100061 LDS R17,_PageAddress+1
1EDF 0D02 ADD R16,R2
1EE0 1D13 ADC R17,R3
1EE1 940E1F7E CALL _read_program_memory
1EE3 01B8 MOVW R22,R16
(0163) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
1EE4 E683 LDI R24,0x63
1EE5 E090 LDI R25,0
1EE6 2DEA MOV R30,R10
1EE7 27FF CLR R31
1EE8 0FE8 ADD R30,R24
1EE9 1FF9 ADC R31,R25
1EEA 8020 LDD R2,Z+0
1EEB 2433 CLR R3
1EEC 2C32 MOV R3,R2
1EED 2422 CLR R2
1EEE E682 LDI R24,0x62
1EEF E090 LDI R25,0
1EF0 2DEA MOV R30,R10
1EF1 27FF CLR R31
1EF2 0FE8 ADD R30,R24
1EF3 1FF9 ADC R31,R25
1EF4 8140 LDD R20,Z+0
1EF5 2755 CLR R21
1EF6 0D42 ADD R20,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -