📄 main.lst
字号:
__text_start:
__start:
0000 CFFF RJMP __text_start
0001 E0D2 LDI R29,2
0002 BFCD OUT 0x3D,R28
0003 BFDE OUT 0x3E,R29
0004 51C0 SUBI R28,0x10
0005 40D0 SBCI R29,0
0006 EA0A LDI R16,0xAA
0007 8308 STD Y+0,R16
0008 2400 CLR R0
0009 E6E0 LDI R30,0x60
000A E0F0 LDI R31,0
000B E010 LDI R17,0
000C 3EE4 CPI R30,0xE4
000D 07F1 CPC R31,R17
000E F011 BEQ 0x0011
000F 9201 ST R0,Z+
0010 CFFB RJMP 0x000C
0011 8300 STD Z+0,R16
0012 E0E0 LDI R30,0
0013 E0F0 LDI R31,0
0014 E6A0 LDI R26,0x60
0015 E0B0 LDI R27,0
0016 E010 LDI R17,0
0017 30E0 CPI R30,0
0018 07F1 CPC R31,R17
0019 F021 BEQ 0x001E
001A 95C8 LPM
001B 9631 ADIW R30,1
001C 920D ST R0,X+
001D CFF9 RJMP 0x0017
001E D115 RCALL _main
_exit:
001F CFFF RJMP _exit
FILE: C:\DOCUME~1\zhuji\桌面\AVR_BO~1.2\assembly.s
(0001) .text
(0002)
(0003) ;*********************************************************
(0004) ;*********************************************************
(0005) ;*********************************************************
(0006) ;*********************************************************
(0007) ; DO NOT CHANGE ANYTHING BELOW THIS LINE !!!!!!!
(0008) ;*********************************************************
(0009) ;*********************************************************
(0010) ;*********************************************************
(0011) ;*********************************************************
(0012)
(0013)
(0014) SPMCR = 0x57
(0015)
(0016)
(0017) ;-----------------------------------------
(0018)
(0019) ; void write_page (unsigned int adr, unsigned char function);
(0020) ; bits 8:15 adr addresses the page...(must setup RAMPZ beforehand!!!)
(0021) _write_page::
(0022) XCALL __WAIT_SPMEN__
_write_page:
0020 D01F RCALL 0x0040
(0023) movw r30, r16 ;move address to z pointer (R31 = ZH, R30 = ZL)
0021 01F8 MOVW R30,R16
(0024) STS SPMCR, R18 ;argument 2 decides function
0022 93200057 STS 0x57,R18
(0025) SPM ;perform pagewrite
0024 95E8 SPM
(0026) RET
0025 9508 RET
(0027)
(0028) ;-----------------------------------------
(0029)
(0030) ; void fill_temp_buffer (unsigned int data, unsigned int adr);
(0031) ; bits 7:1 in adr addresses the word in the page... (2=first word, 4=second word etc..)
(0032) _fill_temp_buffer::
(0033) XCALL __WAIT_SPMEN__
_fill_temp_buffer:
0026 D019 RCALL 0x0040
(0034) movw r30, r18 ;move adress to z pointer (R31=ZH R30=ZL)
0027 01F9 MOVW R30,R18
(0035) movw r0, r16 ;move data to reg 0 and 1
0028 0108 MOVW R0,R16
(0036) LDI R19, 0x01
0029 E031 LDI R19,1
(0037) STS SPMCR, R19
002A 93300057 STS 0x57,R19
(0038) SPM ;Store program memory
002C 95E8 SPM
(0039) RET
002D 9508 RET
(0040)
(0041) ;-----------------------------------------
(0042)
(0043) ;unsigned char read_flash(unsigned int add);
(0044) _read_flash::
(0045) mov r31,r17
_read_flash:
002E 2FF1 MOV R31,R17
(0046) mov r30,r16
002F 2FE0 MOV R30,R16
(0047) lpm r16,z
0030 9104 LPM R16,0(Z)
(0048) clr r17
0031 2711 CLR R17
(0049) ret
0032 9508 RET
(0050)
(0051) ;unsigned int read_program_memory (unsigned int adr ,unsigned char cmd);
(0052) _read_program_memory::
(0053) movw r30, r16 ;move adress to z pointer
_read_program_memory:
0033 01F8 MOVW R30,R16
(0054) SBRC R18, 0 ;read lockbits? (second argument = 0x09)
0034 FD20 SBRC R18,0
(0055) STS SPMCR, R18 ;if so, place second argument in SPMEN register
0035 93200057 STS 0x57,R18
(0056) LPM r16, Z+
0037 9105 LPM R16,Z+
(0057) LPM r17, Z
0038 9114 LPM R17,0(Z)
(0058) RET
0039 9508 RET
(0059)
(0060) ;-----------------------------------------
(0061)
(0062) _enableRWW::
(0063) XCALL __WAIT_SPMEN__
_enableRWW:
003A D005 RCALL 0x0040
(0064) LDI R27,0x11
003B E1B1 LDI R27,0x11
(0065) STS SPMCR,R27
003C 93B00057 STS 0x57,R27
(0066) SPM
003E 95E8 SPM
(0067) RET
003F 9508 RET
(0068)
(0069) ;-----------------------------------------
(0070)
(0071) __WAIT_SPMEN__:
(0072) LDS R27,SPMCR ; load SPMCR to R27
0040 91B00057 LDS R27,0x57
(0073) SBRC R27,0 ; check SPMEN flag
0042 FDB0 SBRC R27,0
(0074) RJMP __WAIT_SPMEN__ ; wait for SPMEN flag cleared
0043 CFFC RJMP 0x0040
(0075) RET
0044 9508 RET
FILE: C:\DOCUME~1\zhuji\桌面\AVR_BO~1.2\main.c
(0001) #include <macros.h>
(0002) #include "assembly.h"
(0003)
(0004) #define ChipType Atmega16
(0005)
(0006) //*********************************************************
(0007) //选择BOOT区大小 此必须与ICC options中的选项相对应
(0008) //#define BootSize 'a' //128
(0009) //#define BootSize 'b' //256
(0010) //#define BootSize 'c' //512
(0011) #define BootSize 'd' //1024
(0012) //选择BootLoad版本号
(0013) #define BootVer 'f' //1.0版本
(0014)
(0015) //**********************************************************
(0016)
(0017) #define Atmega16 0x31
(0018)
(0019) //*****************************************************************************
(0020) #define InteClk //是否使用内部时钟
(0021) #define OscAddress 0x1fff //时钟校准值存储地址
(0022)
(0023) //*****************************************************************************
(0024) //7.3728M时钟下的波特率为19200的设置,此设置可根据ICC生成,选对芯片,时钟,波特率既可
(0025) //由此语句调用UBRR = BAU;
(0026) #define BAU 23 // 7.3728M 19200
(0027) //#define BAU 191 // 7.3728M 2400
(0028) //#define BAU 95 // 7.3728M 4800
(0029) //#define BAU 47 // 7.3728M 9600
(0030) //#define BAU 31 // 7.3728M 14400
(0031) //#define BAU 23 // 7.3728M 19200
(0032) //#define BAU 15 // 7.3728M 28800
(0033)
(0034) //#define BAU 38 // 12M 19200
(0035)
(0036) //*****************************************************************************
(0037)
(0038) #include <iom16v.h>
(0039) #define PageByte 128
(0040) #define AddressShift 7
(0041) #define INTVECREG GICR
(0042)
(0043)
(0044) void FlashLoad (void);
(0045) void GetPageNumber (void);
(0046) void ExecCode (void);
(0047) char GetPage (void);
(0048) void WriteFlash (void);
(0049) char CheckFlash (void);
(0050) unsigned char IsChar (void);
(0051) void SendChar (unsigned char c);
(0052) void delay (void); //1ms延时函数
(0053) unsigned char RecChar (void);
(0054)
(0055) unsigned char PageBuffer[PageByte];
(0056) unsigned int RealPageAddress;
(0057) unsigned int PageAddress;
(0058)
(0059) /*****************************************************************************/
(0060) //Flash编程
(0061) /*****************************************************************************/
(0062) void FlashLoad(void)
(0063) {
(0064) SendChar('!');
_FlashLoad:
0045 E201 LDI R16,0x21
0046 D0D8 RCALL _SendChar
0047 C019 RJMP 0x0061
(0065) while (1)
(0066) {
(0067) GetPageNumber();
0048 D01A RCALL _GetPageNumber
(0068)
(0069) if (RealPageAddress == 0xffff)
0049 91800062 LDS R24,_RealPageAddress
004B 91900063 LDS R25,_RealPageAddress+1
004D 3F8F CPI R24,0xFF
004E EFEF LDI R30,0xFF
004F 079E CPC R25,R30
0050 F409 BNE 0x0052
(0070) return;
0051 C010 RJMP 0x0062
(0071)
(0072) if (GetPage())
0052 D026 RCALL _GetPage
0053 2300 TST R16
0054 F051 BEQ 0x005F
(0073) {
(0074) WriteFlash();
0055 D05D RCALL _WriteFlash
(0075) if (CheckFlash())
0056 D08D RCALL _CheckFlash
0057 2300 TST R16
0058 F019 BEQ 0x005C
(0076) SendChar('!');
0059 E201 LDI R16,0x21
005A D0C4 RCALL _SendChar
005B C005 RJMP 0x0061
(0077) else
(0078) SendChar('@');
005C E400 LDI R16,0x40
005D D0C1 RCALL _SendChar
(0079) }
005E C002 RJMP 0x0061
(0080) else
(0081) SendChar('@');
005F E400 LDI R16,0x40
0060 D0BE RCALL _SendChar
0061 CFE6 RJMP 0x0048
(0082) }
(0083) }
0062 9508 RET
_GetPageNumber:
PageAddressL --> R20
PageAddressH --> R22
0063 D12F RCALL push_gset2
(0084)
(0085) /*****************************************************************************/
(0086) void GetPageNumber(void)
(0087) {
(0088) unsigned char PageAddressH;
(0089) unsigned char PageAddressL;
(0090)
(0091) PageAddressH = RecChar();
0064 D0B6 RCALL _RecChar
0065 2F60 MOV R22,R16
(0092)
(0093) PageAddressL = RecChar();
0066 D0B4 RCALL _RecChar
0067 2F40 MOV R20,R16
(0094)
(0095) RealPageAddress=(int)((PageAddressH << 8) + PageAddressL);
0068 2E36 MOV R3,R22
0069 2E24 MOV R2,R20
006A 92300063 STS _RealPageAddress+1,R3
006C 92200062 STS _RealPageAddress,R2
(0096) PageAddress=RealPageAddress<<AddressShift;
006E E027 LDI R18,7
006F E030 LDI R19,0
0070 2D02 MOV R16,R2
0071 2D13 MOV R17,R3
0072 D126 RCALL lsl16
0073 93100061 STS _PageAddress+1,R17
0075 93000060 STS _PageAddress,R16
(0097) #ifdef RAMPZ_FLAG
(0098) if (PageAddressH)
(0099) RAMPZ = 1;
(0100) else
(0101) RAMPZ = 0;
(0102) #endif
(0103) }
0077 D100 RCALL pop_gset2
0078 9508 RET
_GetPage:
CheckSum --> R20
LocalCheckSum --> R22
i --> R10
0079 D11C RCALL push_gset3
(0104)
(0105) /*****************************************************************************/
(0106) char GetPage(void)
(0107) {
(0108) unsigned char i;
(0109) unsigned char LocalCheckSum = 0;
007A 2766 CLR R22
(0110) unsigned char CheckSum = 0;
007B 2744 CLR R20
(0111)
(0112) for (i=0;i<PageByte/2;i++)
007C 24AA CLR R10
007D C012 RJMP 0x0090
(0113) {
(0114) while(!IsChar());
007E D096 RCALL _IsChar
007F 2300 TST R16
0080 F3E9 BEQ 0x007E
(0115) PageBuffer[i]=RecChar();
0081 D099 RCALL _RecChar
0082 E684 LDI R24,0x64
0083 E090 LDI R25,0
0084 2DEA MOV R30,R10
0085 27FF CLR R31
0086 0FE8 ADD R30,R24
0087 1FF9 ADC R31,R25
0088 8300 STD Z+0,R16
(0116) LocalCheckSum ^= PageBuffer[i];
0089 2DEA MOV R30,R10
008A 27FF CLR R31
008B 0FE8 ADD R30,R24
008C 1FF9 ADC R31,R25
008D 8020 LDD R2,Z+0
008E 2562 EOR R22,R2
008F 94A3 INC R10
0090 2D8A MOV R24,R10
0091 3480 CPI R24,0x40
0092 F358 BCS 0x007E
(0117) }
(0118) for (i=0;i<PageByte/2;i++)
0093 24AA CLR R10
0094 C012 RJMP 0x00A7
(0119) {
(0120) while(!IsChar());
0095 D07F RCALL _IsChar
0096 2300 TST R16
0097 F3E9 BEQ 0x0095
(0121) PageBuffer[i+PageByte/2]=RecChar();
0098 D082 RCALL _RecChar
0099 EA84 LDI R24,0xA4
009A E090 LDI R25,0
009B 2DEA MOV R30,R10
009C 27FF CLR R31
009D 0FE8 ADD R30,R24
009E 1FF9 ADC R31,R25
009F 8300 STD Z+0,R16
(0122) LocalCheckSum ^= PageBuffer[i+PageByte/2];
00A0 2DEA MOV R30,R10
00A1 27FF CLR R31
00A2 0FE8 ADD R30,R24
00A3 1FF9 ADC R31,R25
00A4 8020 LDD R2,Z+0
00A5 2562 EOR R22,R2
00A6 94A3 INC R10
00A7 2D8A MOV R24,R10
00A8 3480 CPI R24,0x40
00A9 F358 BCS 0x0095
(0123) }
(0124) CheckSum = RecChar();
00AA D070 RCALL _RecChar
00AB 2F40 MOV R20,R16
(0125)
(0126) if (LocalCheckSum == CheckSum)
00AC 1760 CP R22,R16
00AD F411 BNE 0x00B0
(0127) return 1;
00AE E001 LDI R16,1
00AF C001 RJMP 0x00B1
(0128) else
(0129) return 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -