⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boot128.lst

📁 AVR16源代码 ICC编译器
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    F049 E001      LDI	R16,1
    F04A BF05      OUT	0x35,R16
    F04B E002      LDI	R16,2
    F04C BF05      OUT	0x35,R16
    F04D EFCF      LDI	R28,0xFF
    F04E E1D0      LDI	R29,0x10
    F04F BFCD      OUT	0x3D,R28
    F050 BFDE      OUT	0x3E,R29
    F051 51C0      SUBI	R28,0x10
    F052 40D0      SBCI	R29,0
    F053 EA0A      LDI	R16,0xAA
    F054 8308      STD	Y+0,R16
    F055 2400      CLR	R0
    F056 E0E6      LDI	R30,6
    F057 E0F1      LDI	R31,1
    F058 E013      LDI	R17,3
    F059 36E4      CPI	R30,0x64
    F05A 07F1      CPC	R31,R17
    F05B F011      BEQ	0xF05E
    F05C 9201      ST	R0,Z+
    F05D CFFB      RJMP	0xF059
    F05E 8300      STD	Z+0,R16
    F05F E8EC      LDI	R30,0x8C
    F060 EEF0      LDI	R31,0xE0
    F061 E0A0      LDI	R26,0
    F062 E0B1      LDI	R27,1
    F063 EE10      LDI	R17,0xE0
    F064 E001      LDI	R16,1
    F065 BF0B      OUT	0x3B,R16
    F066 39E2      CPI	R30,0x92
    F067 07F1      CPC	R31,R17
    F068 F021      BEQ	0xF06D
    F069 95D8      ELPM
    F06A 9631      ADIW	R30,1
    F06B 920D      ST	R0,X+
    F06C CFF9      RJMP	0xF066
    F06D 940EF217  CALL	_main
_exit:
    F06F CFFF      RJMP	_exit
_boot_page_ew:
  code                 --> Y+4
  p_address            --> Y+0
    F070 940EF5DA  CALL	push_arg4
FILE: E:\程序\AVR程序\BOOTLoadICC\main.c
(0001) #include	<iom128v.h>
(0002) #include	"Eeprom128.h"
(0003) #include	"Rtc8025.h"
(0004) #include	"Uart.h"
(0005) #include	"Crc.h"
(0006) 
(0007) #define		BOOT_TEST	0
(0008) 
(0009) //============================================================
(0010) //无线错误下载设置错误代码定义
(0011) #define		ERR_CONNECT	0x10//表示握手信号接收不对;
(0012) #define		ERR_COMMANDCRC	0x11//表示接收命令校验错误;
(0013) #define		ERR_DATACRC	0x12//表示接收数据不正确,要求丛发数据;
(0014) #define		ERR_OVERTIME	0x13//表示接收数据超时;
(0015) #define		ERR_NOCOMMAND	0x14//没有该指令;
(0016) #define		ERR_SETTING	0x15//设置参数失败;
(0017) #define		ERR_READTIME	0x16//读取系统时钟失败;
(0018) 
(0019) //============================================================
(0020) //定义写Flash一页的长度,同时声明数据Buffer
(0021) #define   	SPM_PAGESIZE 	256
(0022) unsigned char	SendData[100];       
(0023) unsigned char 	SendBuf[100];
(0024) unsigned char 	ReceiveBuf[150];
(0025) unsigned char 	data[SPM_PAGESIZE];
(0026) 
(0027) //============================================================ 
(0028) //定义接收数据的起点和写FLASH的起始地址
(0029) unsigned int 	bPiont = 0;
(0030) unsigned long 	address= 0x0000;
(0031) 
(0032) //============================================================
(0033) //函	数:void boot_page_ew(long p_address,char code) 
(0034) //功	能:读写FLASH数据
(0035) //入口参数:地址,命令字03擦除,05写入
(0036) //返 回 值:无
(0037) //设 计 者:覃道堂
(0038) //创作时间:2006-03-16
(0039) //修改时间:
(0040) //修改目的:
(0041) //============================================================ 
(0042) void boot_page_ew(long p_address,char code) 
(0043) { 
(0044)     	asm("mov r30,r16\n" 
    F072 2FE0      MOV	R30,R16
    F073 2FF1      MOV	R31,R17
    F074 BF2B      OUT	0x3B,R18
(0045)         "mov r31,r17\n" 
(0046)         "out 0x3b,r18\n");            	//将页地址放入Z寄存器和RAMPZ的Bit0中 
(0047)     	SPMCSR = code;                	//寄存器SPMCSR中为操作码 
    F075 800C      LDD	R0,Y+4
    F076 92000068  STS	0x68,R0
(0048)     	asm("spm\n");                   //对指定Flash页进行操作 
    F078 95E8      SPM
    F079 9624      ADIW	R28,4
    F07A 9508      RET
(0049) } 
(0050) //============================================================
(0051) //函	数:void boot_page_fill(unsigned int address,int data) 
(0052) //功	能:填充Flash缓冲页中的一个字 
(0053) //入口参数:地址和数据
(0054) //返 回 值:无
(0055) //设 计 者:覃道堂 
(0056) //创作时间:2006-03-16
(0057) //修改时间:
(0058) //修改目的:
(0059) //============================================================        
(0060) void boot_page_fill(unsigned int address,int data) 
(0061) { 
(0062)     	asm("mov r30,r16\n" 
_boot_page_fill:
  data                 --> R18
  address              --> R16
    F07B 2FE0      MOV	R30,R16
    F07C 2FF1      MOV	R31,R17
    F07D 2E02      MOV	R0,R18
    F07E 2E13      MOV	R1,R19
(0063)         "mov r31,r17\n"             //Z寄存器中为填冲页内地址 
(0064)         "mov r0,r18\n" 
(0065)         "mov r1,r19\n");            //R0R1中为一个指令字 
(0066)     	SPMCSR = 0x01; 
    F07F E081      LDI	R24,1
    F080 93800068  STS	0x68,R24
(0067)    	asm("spm\n"); 
    F082 95E8      SPM
    F083 9508      RET
(0068) } 
(0069) //============================================================
(0070) //函	数:void wait_page_rw_ok(void)
(0071) //功	能:等待一个Flash页的写完成
(0072) //入口参数:无
(0073) //返 回 值:无
(0074) //设 计 者:覃道堂 
(0075) //创作时间:2006-03-16
(0076) //修改时间:
(0077) //修改目的:
(0078) //============================================================
(0079) void wait_page_rw_ok(void) 
(0080) { 
_wait_page_rw_ok:
    F084 C008      RJMP	0xF08D
(0081)       	while(SPMCSR & 0x40) 
(0082)      	{ 
(0083)          	while(SPMCSR & 0x01); 
    F085 90200068  LDS	R2,0x68
    F087 FC20      SBRC	R2,0
    F088 CFFC      RJMP	0xF085
(0084)          	SPMCSR = 0x11; 
    F089 E181      LDI	R24,0x11
    F08A 93800068  STS	0x68,R24
(0085)          	asm("spm\n"); 
    F08C 95E8      SPM
    F08D 90200068  LDS	R2,0x68
    F08F FC26      SBRC	R2,6
    F090 CFF4      RJMP	0xF085
    F091 9508      RET
_write_one_page:
  i                    --> R20
    F092 940EF5FF  CALL	push_gset1
    F094 9721      SBIW	R28,1
(0086)      	} 
(0087) } 
(0088) //============================================================
(0089) //函	数:void write_one_page(void)
(0090) //功	能:一页处理完成
(0091) //入口参数:无
(0092) //返 回 值:无
(0093) //设 计 者:覃道堂 
(0094) //创作时间:2006-03-16
(0095) //修改时间:
(0096) //修改目的:
(0097) //============================================================
(0098) void write_one_page(void) 
(0099) { 
(0100)     	int 	i; 
(0101)     	boot_page_ew(address,0x03);                 //擦除一个Flash页 
    F095 E083      LDI	R24,3
    F096 8388      STD	Y+0,R24
    F097 91200104  LDS	R18,address+2
    F099 91300105  LDS	R19,address+3
    F09B 91000102  LDS	R16,address
    F09D 91100103  LDS	R17,address+1
    F09F DFD0      RCALL	_boot_page_ew
(0102)     	wait_page_rw_ok();                          //等待擦除完成 
    F0A0 DFE3      RCALL	_wait_page_rw_ok
(0103)     	for(i = 0;i < SPM_PAGESIZE;i += 2)                //将数据填入Flash缓冲页中 
    F0A1 2744      CLR	R20
    F0A2 2755      CLR	R21
(0104)     	{ 
(0105)         	boot_page_fill(i, data[i]+(data[i+1]<<8)); 
    F0A3 E087      LDI	R24,7
    F0A4 E091      LDI	R25,1
    F0A5 01FA      MOVW	R30,R20
    F0A6 0FE8      ADD	R30,R24
    F0A7 1FF9      ADC	R31,R25
    F0A8 8020      LDD	R2,Z+0
    F0A9 2433      CLR	R3
    F0AA 2C32      MOV	R3,R2
    F0AB 2422      CLR	R2
    F0AC E086      LDI	R24,6
    F0AD E091      LDI	R25,1
    F0AE 01FA      MOVW	R30,R20
    F0AF 0FE8      ADD	R30,R24
    F0B0 1FF9      ADC	R31,R25
    F0B1 8120      LDD	R18,Z+0
    F0B2 2733      CLR	R19
    F0B3 0D22      ADD	R18,R2
    F0B4 1D33      ADC	R19,R3
    F0B5 018A      MOVW	R16,R20
    F0B6 DFC4      RCALL	_boot_page_fill
    F0B7 5F4E      SUBI	R20,0xFE
    F0B8 4F5F      SBCI	R21,0xFF
    F0B9 3040      CPI	R20,0
    F0BA E0E1      LDI	R30,1
    F0BB 075E      CPC	R21,R30
    F0BC F334      BLT	0xF0A3
(0106)     	} 
(0107)     	boot_page_ew(address,0x05);                  //将缓冲页数据写入一个Flash页 
    F0BD E085      LDI	R24,5
    F0BE 8388      STD	Y+0,R24
    F0BF 91200104  LDS	R18,address+2
    F0C1 91300105  LDS	R19,address+3
    F0C3 91000102  LDS	R16,address
    F0C5 91100103  LDS	R17,address+1
    F0C7 DFA8      RCALL	_boot_page_ew
(0108)     	wait_page_rw_ok();                           //等待写入完成 
    F0C8 DFBB      RCALL	_wait_page_rw_ok
    F0C9 9621      ADIW	R28,1
    F0CA 940EF602  CALL	pop_gset1
    F0CC 9508      RET
(0109) }  
(0110) 
(0111) //============================================================
(0112) //函	数:void quit(void)
(0113) //功	能:跳转程序运行
(0114) //入口参数:无
(0115) //返 回 值:无
(0116) //设 计 者:覃道堂 
(0117) //创作时间:2006-03-16
(0118) //修改时间:
(0119) //修改目的:
(0120) //============================================================
(0121) void quit(void)
(0122) {
(0123) 	MCUCR = 0x01;
_quit:
    F0CD E081      LDI	R24,1
    F0CE BF85      OUT	0x35,R24
(0124) 	MCUCR = 0x00;
    F0CF 2422      CLR	R2
    F0D0 BE25      OUT	0x35,R2
(0125) 	RAMPZ = 0x00;
    F0D1 BE2B      OUT	0x3B,R2
(0126) 	asm("jmp 0x0000\n");
    F0D2 940C0000  JMP	0x0
    F0D4 9508      RET
_Flow_Control:
  CRC_Value            --> R10
  Wrong_Cnt            --> R12
  Rec_Len              --> R14
  bPiont               --> Y+4
    F0D5 940EF5F7  CALL	push_gset5
    F0D7 9726      SBIW	R28,6
(0127) }
(0128) 
(0129) //============================================================
(0130) //函	数:unsigned char Flow_Control(void)
(0131) //功	能:下载函数控制
(0132) //入口参数:ReceiveBuf接收数据,data写入Flash数据
(0133) //返 回 值:0成功,否则失败
(0134) //设 计 者:覃道堂 
(0135) //创作时间:2006-03-16
(0136) //修改时间:
(0137) //修改目的:
(0138) //============================================================
(0139) unsigned char Flow_Control(void)
(0140) {
(0141) 	int		bPiont = 0;
    F0D8 2400      CLR	R0
    F0D9 2411      CLR	R1
    F0DA 821D      STD	Y+5,R1
    F0DB 820C      STD	Y+4,R0
(0142) 	unsigned char 	Rec_Len;  
(0143) 	unsigned char 	Wrong_Cnt = 0;
    F0DC 24CC      CLR	R12
    F0DD C098      RJMP	0xF176
(0144) 	unsigned short 	CRC_Value;
(0145) 	    	
(0146) 	while(Wrong_Cnt < 3)
(0147) 	{
(0148) 		Rec_Len = Uart_Receive_Frame(ReceiveBuf, 10);
    F0DE E02A      LDI	R18,0xA
    F0DF E030      LDI	R19,0
    F0E0 E006      LDI	R16,6
    F0E1 E012      LDI	R17,2
    F0E2 940EF36B  CALL	_Uart_Receive_Frame
    F0E4 2EE0      MOV	R14,R16
(0149) 		if(Rec_Len)//收到数据吗?没有等待数据	    
    F0E5 2300      TST	R16
    F0E6 F409      BNE	0xF0E8
    F0E7 C08E      RJMP	0xF176
(0150) 	 	{  
(0151) 	 		if((ReceiveBuf[3] == 'E')&&(ReceiveBuf[4] == 'N')&&(ReceiveBuf[5] == 'D'))
    F0E8 91800209  LDS	R24,ReceiveBuf+3
    F0EA 3485      CPI	R24,0x45
    F0EB F449      BNE	0xF0F5
    F0EC 9180020A  LDS	R24,0x20A
    F0EE 348E      CPI	R24,0x4E
    F0EF F429      BNE	0xF0F5
    F0F0 9180020B  LDS	R24,0x20B
    F0F2 3484      CPI	R24,0x44
    F0F3 F409      BNE	0xF0F5
(0152) 	      		{
(0153) 	       			break;		//如果收到END终止
    F0F4 C085      RJMP	0xF17A
(0154) 	       		}
(0155)         		else
(0156) 			{  
(0157) 				CRC_Value = Verify_Command(ReceiveBuf,Rec_Len);
    F0F5 2D2E      MOV	R18,R14
    F0F6 2733      CLR	R19
    F0F7 E006      LDI	R16,6
    F0F8 E012      LDI	R17,2
    F0F9 940EF306  CALL	_Verify_Command
    F0FB 2EA0      MOV	R10,R16
    F0FC 24BB      CLR	R11
(0158) 		          	if(CRC_Value == 0)
    F0FD 20AA      TST	R10
    F0FE F009      BEQ	0xF100
    F0FF C06B      RJMP	0xF16B
    F100 20BB      TST	R11
    F101 F009      BEQ	0xF103
    F102 C068      RJMP	0xF16B
(0159) 		            	{
(0160) 		            		if(bPiont == 0)
    F103 800C      LDD	R0,Y+4
    F104 801D      LDD	R1,Y+5
    F105 2000      TST	R0
    F106 F4F1      BNE	0xF125
    F107 2011      TST	R1
    F108 F4E1      BNE	0xF125
(0161) 		            		{
(0162) 		            			for(bPiont = 0; bPiont < 128; bPiont ++)
    F109 2400      CLR	R0
    F10A 2411      CLR	R1
    F10B 821D      STD	Y+5,R1
    F10C 820C      STD	Y+4,R0
(0163) 				        		data[bPiont] = ReceiveBuf[bPiont+5];
    F10D E08B      LDI	R24,0xB
    F10E E092      LDI	R25,2
    F10F 81EC      LDD	R30,Y+4
    F110 81FD      LDD	R31,Y+5
    F111 0FE8      ADD	R30,R24
    F112 1FF9      ADC	R31,R25
    F113 8020      LDD	R2,Z+0
    F114 E086      LDI	R24,6
    F115 E091      LDI	R25,1
    F116 81EC      LDD	R30,Y+4
    F117 81FD      LDD	R31,Y+5
    F118 0FE8      ADD	R30,R24
    F119 1FF9      ADC	R31,R25
    F11A 8220      STD	Z+0,R2
    F11B 818C      LDD	R24,Y+4
    F11C 819D      LDD	R25,Y+5
    F11D 9601      ADIW	R24,1
    F11E 839D      STD	Y+5,R25
    F11F 838C      STD	Y+4,R24
    F120 3880      CPI	R24,0x80
    F121 E0E0      LDI	R30,0
    F122 079E      CPC	R25,R30
    F123 F34C      BLT	0xF10D
(0164) 		            		}
    F124 C038      RJMP	0xF15D
(0165) 		            		else
(0166) 		            		{
(0167) 		            			for(bPiont = 128; bPiont < 256; bPiont ++)
    F125 E880      LDI	R24,0x80
    F126 E090      LDI	R25,0
    F127 839D      STD	Y+5,R25
    F128 838C      STD	Y+4,R24
(0168) 				        		data[bPiont] = ReceiveBuf[bPiont-128+5];
    F129 E88B      LDI	R24,0x8B
    F12A E091      LDI	R25,1
    F12B 81EC      LDD	R30,Y+4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -