📄 avrbootloader.lst
字号:
__start:
__text_start:
1E34 E001 LDI R16,1
1E35 BF05 OUT 0x35,R16
1E36 E002 LDI R16,2
1E37 BF05 OUT 0x35,R16
1E38 EFCF LDI R28,0xFF
1E39 E0D4 LDI R29,4
1E3A BFCD OUT 0x3D,R28
1E3B BFDE OUT 0x3E,R29
1E3C 51C0 SUBI R28,0x10
1E3D 40D0 SBCI R29,0
1E3E EA0A LDI R16,0xAA
1E3F 8308 STD Y+0,R16
1E40 2400 CLR R0
1E41 E0E0 LDI R30,0
1E42 E0F1 LDI R31,1
1E43 E011 LDI R17,1
1E44 38E2 CPI R30,0x82
1E45 07F1 CPC R31,R17
1E46 F011 BEQ 0x1E49
1E47 9201 ST R0,Z+
1E48 CFFB RJMP 0x1E44
1E49 8300 STD Z+0,R16
1E4A E6E8 LDI R30,0x68
1E4B E3FC LDI R31,0x3C
1E4C E0A0 LDI R26,0
1E4D E0B1 LDI R27,1
1E4E E31C LDI R17,0x3C
1E4F E000 LDI R16,0
1E50 BF0B OUT 0x3B,R16
1E51 36E8 CPI R30,0x68
1E52 07F1 CPC R31,R17
1E53 F021 BEQ 0x1E58
1E54 95C8 LPM
1E55 9631 ADIW R30,1
1E56 920D ST R0,X+
1E57 CFF9 RJMP 0x1E51
1E58 940E 1F3F CALL _main
_exit:
1E5A CFFF RJMP _exit
FILE: F:\程序\新建文~1\BootLoad_88可用\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 "iom88v.h"
(0073) #define PageByte 64
(0074) #define AddressShift 6
(0075) #endif
(0076)
(0077) #if (ChipType == Atmega16)
(0078) #include "iom168v.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
1E5B E201 LDI R16,0x21
1E5C D0C2 RCALL _SendChar
1E5D C018 RJMP 0x1E76
(0102) while (1)
(0103) {
(0104) //GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) //if (PageAddress == 0xffff) return;//退不出了:)
(0106)
(0107) if (GetPage())
1E5E D019 RCALL _GetPage
1E5F 2300 TST R16
1E60 F099 BEQ 0x1E74
(0108) {
(0109) if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
1E61 9180 0100 LDS R24,PageAddress
1E63 9190 0101 LDS R25,PageAddress+1
1E65 3F8F CPI R24,0xFF
1E66 EFEF LDI R30,0xFF
1E67 079E CPC R25,R30
1E68 F409 BNE 0x1E6A
1E69 C00D RJMP 0x1E77
(0110)
(0111) WriteFlash();
1E6A D04C RCALL _WriteFlash
(0112) if (CheckFlash()) SendChar('!');
1E6B D07D RCALL _CheckFlash
1E6C 2300 TST R16
1E6D F019 BEQ 0x1E71
1E6E E201 LDI R16,0x21
1E6F D0AF RCALL _SendChar
1E70 C005 RJMP 0x1E76
(0113) else SendChar('@');
1E71 E400 LDI R16,0x40
1E72 D0AC RCALL _SendChar
(0114) }
1E73 C002 RJMP 0x1E76
(0115) else SendChar('@');
1E74 E400 LDI R16,0x40
1E75 D0A9 RCALL _SendChar
1E76 CFE7 RJMP 0x1E5E
1E77 9508 RET
_GetPage:
AddL --> R20
AddH --> R14
CheckSum --> R12
LocalCheckSum --> R10
i --> R20
1E78 940E 1FB4 CALL 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;
1E7A 24AA CLR R10
(0137) unsigned char CheckSum = 0;
1E7B 24CC CLR R12
(0138)
(0139) AddH=RecChar();AddL=RecChar();
1E7C D09B RCALL _RecChar
1E7D 2EE0 MOV R14,R16
1E7E D099 RCALL _RecChar
1E7F 2F40 MOV R20,R16
(0140) PageAddress=(AddH<<8)+AddL;
1E80 2C3E MOV R3,R14
1E81 2E24 MOV R2,R20
1E82 9230 0101 STS PageAddress+1,R3
1E84 9220 0100 STS PageAddress,R2
(0141) if (PageAddress==0xffff) return 1;//exit..
1E86 01C1 MOVW R24,R2
1E87 3F8F CPI R24,0xFF
1E88 EFEF LDI R30,0xFF
1E89 079E CPC R25,R30
1E8A F411 BNE 0x1E8D
1E8B E001 LDI R16,1
1E8C C028 RJMP 0x1EB5
(0142) PageAddress=PageAddress<<AddressShift;
1E8D E027 LDI R18,7
1E8E E030 LDI R19,0
1E8F 9100 0100 LDS R16,PageAddress
1E91 9110 0101 LDS R17,PageAddress+1
1E93 940E 1FD5 CALL lsl16
1E95 9310 0101 STS PageAddress+1,R17
1E97 9300 0100 STS PageAddress,R16
(0143) // LocalCheckSum=AddH+AddL;//pei考虑Page的效验
(0144)
(0145) for (i=0;i<PageByte;i++)
1E99 2744 CLR R20
1E9A C010 RJMP 0x1EAB
(0146) {
(0147) PageBuffer[i]=RecChar();
1E9B D07C RCALL _RecChar
1E9C 2EE0 MOV R14,R16
1E9D E082 LDI R24,2
1E9E E091 LDI R25,1
1E9F 2FE4 MOV R30,R20
1EA0 27FF CLR R31
1EA1 0FE8 ADD R30,R24
1EA2 1FF9 ADC R31,R25
1EA3 82E0 STD Z+0,R14
(0148) LocalCheckSum += PageBuffer[i];
1EA4 2FE4 MOV R30,R20
1EA5 27FF CLR R31
1EA6 0FE8 ADD R30,R24
1EA7 1FF9 ADC R31,R25
1EA8 8020 LDD R2,Z+0
1EA9 0CA2 ADD R10,R2
1EAA 9543 INC R20
1EAB 3840 CPI R20,0x80
1EAC F370 BCS 0x1E9B
(0149) }
(0150)
(0151) CheckSum = RecChar();
1EAD D06A RCALL _RecChar
1EAE 2EE0 MOV R14,R16
1EAF 2CCE MOV R12,R14
(0152) if (LocalCheckSum == CheckSum) return 1;
1EB0 16A0 CP R10,R16
1EB1 F411 BNE 0x1EB4
1EB2 E001 LDI R16,1
1EB3 C001 RJMP 0x1EB5
(0153) else return 0;
1EB4 2700 CLR R16
1EB5 940C 1FA9 JMP pop_xgset30FC
_WriteFlash:
TempInt --> R10
i --> R20
1EB7 940E 1FBD CALL 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)
1EB9 2744 CLR R20
1EBA 2755 CLR R21
1EBB C017 RJMP 0x1ED3
(0163) {
(0164) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
1EBC E082 LDI R24,2
1EBD E091 LDI R25,1
1EBE 01FA MOVW R30,R20
1EBF 9631 ADIW R30,1
1EC0 0FE8 ADD R30,R24
1EC1 1FF9 ADC R31,R25
1EC2 8020 LDD R2,Z+0
1EC3 2433 CLR R3
1EC4 2C32 MOV R3,R2
1EC5 2422 CLR R2
1EC6 01FA MOVW R30,R20
1EC7 0FE8 ADD R30,R24
1EC8 1FF9 ADC R31,R25
1EC9 80A0 LDD R10,Z+0
1ECA 24BB CLR R11
1ECB 0CA2 ADD R10,R2
1ECC 1CB3 ADC R11,R3
(0165) fill_temp_buffer(TempInt,i); //call asm routine.
1ECD 019A MOVW R18,R20
1ECE 0185 MOVW R16,R10
1ECF 940E 1F8A CALL _fill_temp_buffer
1ED1 5F4E SUBI R20,0xFE
1ED2 4F5F SBCI R21,0xFF
1ED3 3840 CPI R20,0x80
1ED4 E0E0 LDI R30,0
1ED5 075E CPC R21,R30
1ED6 F328 BCS 0x1EBC
(0166) }
(0167)
(0168) write_page(PageAddress,0x03); //擦除页
1ED7 E023 LDI R18,3
1ED8 9100 0100 LDS R16,PageAddress
1EDA 9110 0101 LDS R17,PageAddress+1
1EDC 940E 1F84 CALL _write_page
(0169) write_page(PageAddress,0x05); //写页数据
1EDE E025 LDI R18,5
1EDF 9100 0100 LDS R16,PageAddress
1EE1 9110 0101 LDS R17,PageAddress+1
1EE3 940E 1F84 CALL _write_page
(0170)
(0171) enableRWW();
1EE5 940E 1F9E CALL _enableRWW
1EE7 940C 1FC2 JMP pop_xgset300C
_CheckFlash:
TempInt2 --> R12
TempInt --> R10
i --> R20
1EE9 940E 1FC7 CALL 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)
1EEB 2744 CLR R20
1EEC C026 RJMP 0x1F13
(0183) {
(0184) TempInt = read_program_memory(PageAddress + i,0x00);
1EED 2722 CLR R18
1EEE 2E24 MOV R2,R20
1EEF 2433 CLR R3
1EF0 9100 0100 LDS R16,PageAddress
1EF2 9110 0101 LDS R17,PageAddress+1
1EF4 0D02 ADD R16,R2
1EF5 1D13 ADC R17,R3
1EF6 940E 1F97 CALL _read_program_memory
1EF8 0158 MOVW R10,R16
(0185) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
1EF9 E083 LDI R24,3
1EFA E091 LDI R25,1
1EFB 2FE4 MOV R30,R20
1EFC 27FF CLR R31
1EFD 0FE8 ADD R30,R24
1EFE 1FF9 ADC R31,R25
1EFF 8020 LDD R2,Z+0
1F00 2433 CLR R3
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -