📄 avrbootloader.lst
字号:
__start:
__text_start:
E13 E001 LDI R16,1
E14 BF05 OUT 0x35,R16
E15 E002 LDI R16,2
E16 BF05 OUT 0x35,R16
E17 E5CF LDI R28,0x5F
E18 E0D4 LDI R29,4
E19 BFCD OUT 0x3D,R28
E1A BFDE OUT 0x3E,R29
E1B 51C0 SUBI R28,0x10
E1C 40D0 SBCI R29,0
E1D EA0A LDI R16,0xAA
E1E 8308 STD Y+0,R16
E1F 2400 CLR R0
E20 E6E0 LDI R30,0x60
E21 E0F0 LDI R31,0
E22 E010 LDI R17,0
E23 3AE2 CPI R30,0xA2
E24 07F1 CPC R31,R17
E25 F011 BEQ 0x0E28
E26 9201 ST R0,Z+
E27 CFFB RJMP 0x0E23
E28 8300 STD Z+0,R16
E29 E2E6 LDI R30,0x26
E2A E1FC LDI R31,0x1C
E2B E6A0 LDI R26,0x60
E2C E0B0 LDI R27,0
E2D E11C LDI R17,0x1C
E2E E000 LDI R16,0
E2F BF0B OUT 0x3B,R16
E30 32E6 CPI R30,0x26
E31 07F1 CPC R31,R17
E32 F021 BEQ 0x0E37
E33 95C8 LPM
E34 9631 ADIW R30,1
E35 920D ST R0,X+
E36 CFF9 RJMP 0x0E30
E37 D0D5 RCALL _main
_exit:
E38 CFFF RJMP _exit
FILE: F:\AVR常用函数\BootLooderMage8\BootLoad_8M\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
E39 E201 LDI R16,0x21
E3A D0B5 RCALL _SendChar
E3B C018 RJMP 0x0E54
(0102) while (1)
(0103) {
(0104) //GetPageNumber();//bug!由于移位的原因,PageAddress!=0xffff
(0105) //if (PageAddress == 0xffff) return;//退不出了:)
(0106)
(0107) if (GetPage())
E3C D019 RCALL _GetPage
E3D 2300 TST R16
E3E F099 BEQ 0x0E52
(0108) {
(0109) if (PageAddress == 0xffff) return;//pei Page地址读取和判断加到GetPage()中了
E3F 9180 0060 LDS R24,PageAddress
E41 9190 0061 LDS R25,PageAddress+1
E43 3F8F CPI R24,0xFF
E44 EFEF LDI R30,0xFF
E45 079E CPC R25,R30
E46 F409 BNE 0x0E48
E47 C00D RJMP 0x0E55
(0110)
(0111) WriteFlash();
E48 D04B RCALL _WriteFlash
(0112) if (CheckFlash()) SendChar('!');
E49 D076 RCALL _CheckFlash
E4A 2300 TST R16
E4B F019 BEQ 0x0E4F
E4C E201 LDI R16,0x21
E4D D0A2 RCALL _SendChar
E4E C005 RJMP 0x0E54
(0113) else SendChar('@');
E4F E400 LDI R16,0x40
E50 D09F RCALL _SendChar
(0114) }
E51 C002 RJMP 0x0E54
(0115) else SendChar('@');
E52 E400 LDI R16,0x40
E53 D09C RCALL _SendChar
E54 CFE7 RJMP 0x0E3C
E55 9508 RET
_GetPage:
CheckSum --> R12
AddL --> R14
AddH --> R20
LocalCheckSum --> R10
i --> R20
E56 D136 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;
E57 24AA CLR R10
(0137) unsigned char CheckSum = 0;
E58 24CC CLR R12
(0138)
(0139) AddH=RecChar();AddL=RecChar();
E59 D092 RCALL _RecChar
E5A 2F40 MOV R20,R16
E5B D090 RCALL _RecChar
E5C 2EE0 MOV R14,R16
(0140) PageAddress=(AddH<<8)+AddL;
E5D 2E34 MOV R3,R20
E5E 2C2E MOV R2,R14
E5F 9230 0061 STS PageAddress+1,R3
E61 9220 0060 STS PageAddress,R2
(0141) if (PageAddress==0xffff) return 1;//exit..
E63 01C1 MOVW R24,R2
E64 3F8F CPI R24,0xFF
E65 EFEF LDI R30,0xFF
E66 079E CPC R25,R30
E67 F411 BNE 0x0E6A
E68 E001 LDI R16,1
E69 C029 RJMP 0x0E93
(0142) PageAddress=PageAddress<<AddressShift;
E6A E026 LDI R18,6
E6B E030 LDI R19,0
E6C 9100 0060 LDS R16,PageAddress
E6E 9110 0061 LDS R17,PageAddress+1
E70 D13D RCALL lsl16
E71 9310 0061 STS PageAddress+1,R17
E73 9300 0060 STS PageAddress,R16
(0143) LocalCheckSum=AddH+AddL;//pei考虑Page的效验
E75 2EA4 MOV R10,R20
E76 0CAE ADD R10,R14
(0144)
(0145) for (i=0;i<PageByte;i++)
E77 2744 CLR R20
E78 C010 RJMP 0x0E89
(0146) {
(0147) PageBuffer[i]=RecChar();
E79 D072 RCALL _RecChar
E7A 2EE0 MOV R14,R16
E7B E682 LDI R24,0x62
E7C E090 LDI R25,0
E7D 2FE4 MOV R30,R20
E7E 27FF CLR R31
E7F 0FE8 ADD R30,R24
E80 1FF9 ADC R31,R25
E81 82E0 STD Z+0,R14
(0148) LocalCheckSum += PageBuffer[i];
E82 2FE4 MOV R30,R20
E83 27FF CLR R31
E84 0FE8 ADD R30,R24
E85 1FF9 ADC R31,R25
E86 8020 LDD R2,Z+0
E87 0CA2 ADD R10,R2
E88 9543 INC R20
E89 3440 CPI R20,0x40
E8A F370 BCS 0x0E79
(0149) }
(0150)
(0151) CheckSum = RecChar();
E8B D060 RCALL _RecChar
E8C 2EE0 MOV R14,R16
E8D 2CCE MOV R12,R14
(0152) if (LocalCheckSum == CheckSum) return 1;
E8E 16A0 CP R10,R16
E8F F411 BNE 0x0E92
E90 E001 LDI R16,1
E91 C001 RJMP 0x0E93
(0153) else return 0;
E92 2700 CLR R16
E93 C0EE RJMP pop_xgset30FC
_WriteFlash:
TempInt --> R10
i --> R20
E94 D101 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)
E95 2744 CLR R20
E96 2755 CLR R21
E97 C016 RJMP 0x0EAE
(0163) {
(0164) TempInt=PageBuffer[i]+(PageBuffer[i+1]<<8);
E98 E682 LDI R24,0x62
E99 E090 LDI R25,0
E9A 01FA MOVW R30,R20
E9B 9631 ADIW R30,1
E9C 0FE8 ADD R30,R24
E9D 1FF9 ADC R31,R25
E9E 8020 LDD R2,Z+0
E9F 2433 CLR R3
EA0 2C32 MOV R3,R2
EA1 2422 CLR R2
EA2 01FA MOVW R30,R20
EA3 0FE8 ADD R30,R24
EA4 1FF9 ADC R31,R25
EA5 80A0 LDD R10,Z+0
EA6 24BB CLR R11
EA7 0CA2 ADD R10,R2
EA8 1CB3 ADC R11,R3
(0165) fill_temp_buffer(TempInt,i); //call asm routine.
EA9 019A MOVW R18,R20
EAA 0185 MOVW R16,R10
EAB D0B7 RCALL _fill_temp_buffer
EAC 5F4E SUBI R20,0xFE
EAD 4F5F SBCI R21,0xFF
EAE 3440 CPI R20,0x40
EAF E0E0 LDI R30,0
EB0 075E CPC R21,R30
EB1 F330 BCS 0x0E98
(0166) }
(0167)
(0168) write_page(PageAddress,0x03); //擦除页
EB2 E023 LDI R18,3
EB3 9100 0060 LDS R16,PageAddress
EB5 9110 0061 LDS R17,PageAddress+1
EB7 D0A5 RCALL _write_page
(0169) write_page(PageAddress,0x05); //写页数据
EB8 E025 LDI R18,5
EB9 9100 0060 LDS R16,PageAddress
EBB 9110 0061 LDS R17,PageAddress+1
EBD D09F RCALL _write_page
(0170)
(0171) enableRWW();
EBE D0B8 RCALL _enableRWW
EBF C0DB RJMP pop_xgset300C
_CheckFlash:
TempInt2 --> R12
TempInt --> R10
i --> R20
EC0 D0DF 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)
EC1 2744 CLR R20
EC2 C025 RJMP 0x0EE8
(0183) {
(0184) TempInt = read_program_memory(PageAddress + i,0x00);
EC3 2722 CLR R18
EC4 2E24 MOV R2,R20
EC5 2433 CLR R3
EC6 9100 0060 LDS R16,PageAddress
EC8 9110 0061 LDS R17,PageAddress+1
ECA 0D02 ADD R16,R2
ECB 1D13 ADC R17,R3
ECC D0A3 RCALL _read_program_memory
ECD 0158 MOVW R10,R16
(0185) TempInt2 = PageBuffer[i] +(PageBuffer[i+1]<<8);
ECE E683 LDI R24,0x63
ECF E090 LDI R25,0
ED0 2FE4 MOV R30,R20
ED1 27FF CLR R31
ED2 0FE8 ADD R30,R24
ED3 1FF9 ADC R31,R25
ED4 8020 LDD R2,Z+0
ED5 2433 CLR R3
ED6 2C32 MOV R3,R2
ED7 2422 CLR R2
ED8 E682 LDI R24,0x62
ED9 E090 LDI R25,0
EDA 2FE4 MOV R30,R20
EDB 27FF CLR R31
EDC 0FE8 ADD R30,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -