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

📄 cqt_boot.lst

📁 单片机MEGA128的BOOTLOADER程序。
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    F848 E001      LDI	R16,1
    F849 BF05      OUT	0x35,R16
    F84A E002      LDI	R16,2
    F84B BF05      OUT	0x35,R16
    F84C EFCF      LDI	R28,0xFF
    F84D E1D0      LDI	R29,0x10
    F84E BFCD      OUT	0x3D,R28
    F84F BFDE      OUT	0x3E,R29
    F850 51C0      SUBI	R28,0x10
    F851 40D0      SBCI	R29,0
    F852 EA0A      LDI	R16,0xAA
    F853 8308      STD	Y+0,R16
    F854 2400      CLR	R0
    F855 E0E4      LDI	R30,4
    F856 E0F1      LDI	R31,1
    F857 E012      LDI	R17,2
    F858 33E4      CPI	R30,0x34
    F859 07F1      CPC	R31,R17
    F85A F011      BEQ	0xF85D
    F85B 9201      ST	R0,Z+
    F85C CFFB      RJMP	0xF858
    F85D 8300      STD	Z+0,R16
    F85E E8EC      LDI	R30,0x8C
    F85F EFF0      LDI	R31,0xF0
    F860 E0A0      LDI	R26,0
    F861 E0B1      LDI	R27,1
    F862 EF10      LDI	R17,0xF0
    F863 E001      LDI	R16,1
    F864 BF0B      OUT	0x3B,R16
    F865 39E0      CPI	R30,0x90
    F866 07F1      CPC	R31,R17
    F867 F021      BEQ	0xF86C
    F868 95D8      ELPM
    F869 9631      ADIW	R30,1
    F86A 920D      ST	R0,X+
    F86B CFF9      RJMP	0xF865
    F86C 940EFA65  CALL	_main
_exit:
    F86E CFFF      RJMP	_exit
FILE: E:\cqt\cqt_boot\newmain.c
(0001) 
(0002) #include <macros.h>
(0003) #include <iom128v.h>
(0004) #include <eeprom.h>
(0005) #include <string.h>
(0006) #define SPM_PAGESIZE 256              //M128的一个Flash页为256字节(128字) 
(0007) #define DATA_BUFFER_SIZE SPM_PAGESIZE
(0008) //定义at45db161 控制I/O 
(0009) #define CS     4      //PB4   at45db161 片选
(0010) #define BUSY   5      //PB5   at45db161 忙
(0011) #define WP     6      //PB6   at45db161 写
(0012) #define RESET  7      //PB7   at45db161 复位
(0013) 
(0014) 
(0015) //定义全局变量 
(0016) 
(0017) char data[DATA_BUFFER_SIZE]; 
(0018) unsigned char Senddata[30];
(0019) long  Filelength;
(0020) long address = 0; 
(0021) unsigned int page_counter_rd;
(0022) unsigned int page_offset_rd;
(0023) 
(0024) unsigned char lengthbak1,lengthbak2;
(0025) int timenum;
(0026) int length;length1;
(0027) unsigned char ROK_flag,Num;
(0028) //延时
(0029) void delay_us(int time)
(0030) 	 {     
(0031)   	  do
(0032) 	  	{
(0033) 		 time--;
_delay_us:
  time                 --> R16
    F86F 5001      SUBI	R16,1
    F870 4010      SBCI	R17,0
(0034) 		}	
(0035)   	  while (time!=0);
    F871 3000      CPI	R16,0
    F872 0701      CPC	R16,R17
    F873 F7D9      BNE	0xF86F
    F874 9508      RET
_boot_page_ew:
  code                 --> Y+4
  p_address            --> Y+0
    F875 940EFC03  CALL	push_arg4
(0036) 	 }	  
(0037) 
(0038) 
(0039) //擦除(code=0x03)和写入(code=0x05)一个Flash页 
(0040) void boot_page_ew(long p_address,char code) 
(0041) { 
(0042)     asm("mov r30,r16\n" 
    F877 2FE0      MOV	R30,R16
    F878 2FF1      MOV	R31,R17
    F879 BF2B      OUT	0x3B,R18
(0043)         "mov r31,r17\n" 
(0044)         "out 0x3b,r18\n");            //将页地址放入Z寄存器和RAMPZ的Bit0中 
(0045)     SPMCSR = code;                //寄存器SPMCSR中为操作码 
    F87A 800C      LDD	R0,Y+4
    F87B 92000068  STS	0x68,R0
(0046)     asm("spm\n");                    //对指定Flash页进行操作 
    F87D 95E8      SPM
    F87E 9624      ADIW	R28,4
    F87F 9508      RET
(0047) }         
(0048) //填充Flash缓冲页中的一个字 
(0049) void boot_page_fill(unsigned int address,int data) 
(0050) { 
(0051)     asm("mov r30,r16\n" 
_boot_page_fill:
  data                 --> R18
  address              --> R16
    F880 2FE0      MOV	R30,R16
    F881 2FF1      MOV	R31,R17
    F882 2E02      MOV	R0,R18
    F883 2E13      MOV	R1,R19
(0052)         "mov r31,r17\n"             //Z寄存器中为填冲页内地址 
(0053)         "mov r0,r18\n" 
(0054)         "mov r1,r19\n");            //R0R1中为一个指令字 
(0055)     SPMCSR = 0x01; 
    F884 E081      LDI	R24,1
    F885 93800068  STS	0x68,R24
(0056)     asm("spm\n"); 
    F887 95E8      SPM
    F888 9508      RET
(0057) } 
(0058) //等待一个Flash页的写完成 
(0059) void wait_page_rw_ok(void) 
(0060) { 
_wait_page_rw_ok:
    F889 C008      RJMP	0xF892
(0061)       while(SPMCSR & 0x40) 
(0062)      { 
(0063)          while(SPMCSR & 0x01); 
    F88A 90200068  LDS	R2,0x68
    F88C FC20      SBRC	R2,0
    F88D CFFC      RJMP	0xF88A
(0064)          SPMCSR = 0x11; 
    F88E E181      LDI	R24,0x11
    F88F 93800068  STS	0x68,R24
(0065)          asm("spm\n"); 
    F891 95E8      SPM
    F892 90200068  LDS	R2,0x68
    F894 FC26      SBRC	R2,6
    F895 CFF4      RJMP	0xF88A
    F896 9508      RET
_write_one_page:
  i                    --> R20
    F897 940EFC42  CALL	push_gset1
    F899 9721      SBIW	R28,1
(0066)      } 
(0067) } 
(0068) //更新一个Flash页的完整处理 
(0069) void write_one_page(void) 
(0070) { 
(0071)     int i; 
(0072)     boot_page_ew(address,0x03);                    //擦除一个Flash页 
    F89A E083      LDI	R24,3
    F89B 8388      STD	Y+0,R24
    F89C 91200102  LDS	R18,address+2
    F89E 91300103  LDS	R19,address+3
    F8A0 91000100  LDS	R16,address
    F8A2 91100101  LDS	R17,address+1
    F8A4 DFD0      RCALL	_boot_page_ew
(0073)     wait_page_rw_ok();                            //等待擦除完成 
    F8A5 DFE3      RCALL	_wait_page_rw_ok
(0074)     for(i=0;i<SPM_PAGESIZE;i+=2)  //jia
    F8A6 2744      CLR	R20
    F8A7 2755      CLR	R21
(0075) 	  { 
(0076)         boot_page_fill(i, data[i]+(data[i+1]<<8)); 
    F8A8 E385      LDI	R24,0x35
    F8A9 E091      LDI	R25,1
    F8AA 01FA      MOVW	R30,R20
    F8AB 0FE8      ADD	R30,R24
    F8AC 1FF9      ADC	R31,R25
    F8AD 8020      LDD	R2,Z+0
    F8AE 2433      CLR	R3
    F8AF 2C32      MOV	R3,R2
    F8B0 2422      CLR	R2
    F8B1 E384      LDI	R24,0x34
    F8B2 E091      LDI	R25,1
    F8B3 01FA      MOVW	R30,R20
    F8B4 0FE8      ADD	R30,R24
    F8B5 1FF9      ADC	R31,R25
    F8B6 8120      LDD	R18,Z+0
    F8B7 2733      CLR	R19
    F8B8 0D22      ADD	R18,R2
    F8B9 1D33      ADC	R19,R3
    F8BA 018A      MOVW	R16,R20
    F8BB DFC4      RCALL	_boot_page_fill
    F8BC 5F4E      SUBI	R20,0xFE
    F8BD 4F5F      SBCI	R21,0xFF
    F8BE 3040      CPI	R20,0
    F8BF E0E1      LDI	R30,1
    F8C0 075E      CPC	R21,R30
    F8C1 F334      BLT	0xF8A8
(0077)     } 
(0078)     boot_page_ew(address,0x05);                    //将缓冲页数据写入一个Flash页 
    F8C2 E085      LDI	R24,5
    F8C3 8388      STD	Y+0,R24
    F8C4 91200102  LDS	R18,address+2
    F8C6 91300103  LDS	R19,address+3
    F8C8 91000100  LDS	R16,address
    F8CA 91100101  LDS	R17,address+1
    F8CC DFA8      RCALL	_boot_page_ew
(0079)     wait_page_rw_ok();                            //等待写入完成 
    F8CD DFBB      RCALL	_wait_page_rw_ok
    F8CE 9621      ADIW	R28,1
    F8CF 940EFC45  CALL	pop_gset1
    F8D1 9508      RET
(0080) }         
(0081) 
(0082) //退出Bootloader程序,从0x0000处执行应用程序 
(0083) void quit(void) 
(0084) {     
(0085)  	 MCUCR = 0x01; 
_quit:
    F8D2 E081      LDI	R24,1
    F8D3 BF85      OUT	0x35,R24
(0086)      MCUCR = 0x00;                    //将中断向量表迁移到应用程序区头部 
    F8D4 2422      CLR	R2
    F8D5 BE25      OUT	0x35,R2
(0087)      RAMPZ = 0x00;                    //RAMPZ清零初始化 
    F8D6 BE2B      OUT	0x3B,R2
(0088)      asm("jmp 0x0000\n");                //跳转到Flash的0x0000处,执行用户的应用程序 
    F8D7 940C0000  JMP	0x0
    F8D9 9508      RET
(0089) } 
(0090) //初始化I/O
(0091) void Init_mag128(void)
(0092) {
(0093)  PORTA = 0x00;
_Init_mag128:
    F8DA 2422      CLR	R2
    F8DB BA2B      OUT	0x1B,R2
(0094)  DDRA  = 0x00;
    F8DC BA2A      OUT	0x1A,R2
(0095)  PORTB = 0xd7;
    F8DD ED87      LDI	R24,0xD7
    F8DE BB88      OUT	0x18,R24
(0096)  DDRB  = 0xd7;
    F8DF BB87      OUT	0x17,R24
(0097)  PORTC = 0xff; //m103 output only
    F8E0 EF8F      LDI	R24,0xFF
    F8E1 BB85      OUT	0x15,R24
(0098)  DDRC  = 0x00;
    F8E2 BA24      OUT	0x14,R2
(0099)  PORTD = 0x01;
    F8E3 E081      LDI	R24,1
    F8E4 BB82      OUT	0x12,R24
(0100)  DDRD  = 0xf1;
    F8E5 EF81      LDI	R24,0xF1
    F8E6 BB81      OUT	0x11,R24
(0101)  PORTE = 0x02;
    F8E7 E082      LDI	R24,2
    F8E8 B983      OUT	0x03,R24
(0102)  DDRE  = 0x02;
    F8E9 B982      OUT	0x02,R24
(0103)  PORTF = 0x00;
    F8EA 92200062  STS	0x62,R2
(0104)  DDRF  = 0x00;
    F8EC 92200061  STS	0x61,R2
(0105)  PORTG = 0x0;
    F8EE 92200065  STS	0x65,R2
(0106)  DDRG  = 0x0;
    F8F0 92200064  STS	0x64,R2
    F8F2 9508      RET
(0107) }
(0108) //初始化 SPI
(0109) void Init_SPI(void)
(0110) {
(0111)  SPCR = 0x5e; //setup SPI
_Init_SPI:
    F8F3 E58E      LDI	R24,0x5E
    F8F4 B98D      OUT	0x0D,R24
(0112)  SPSR = 0x00; //setup SPI
    F8F5 2422      CLR	R2
    F8F6 B82E      OUT	0x0E,R2
    F8F7 9508      RET
_delay_ms:
  time                 --> R20
    F8F8 940EFC42  CALL	push_gset1
    F8FA 01A8      MOVW	R20,R16
(0113) }
(0114) 
(0115) /*	  		    毫秒级延时程序			*/	 
(0116) void delay_ms(unsigned int time)
(0117) 	 {
    F8FB C00C      RJMP	0xF908
(0118) 	  while(time!=0)
(0119) 	  	  {		
(0120) 		   delay_us(1850);
    F8FC E30A      LDI	R16,0x3A
    F8FD E017      LDI	R17,7
    F8FE DF70      RCALL	_delay_us
(0121) 		   time--;
    F8FF 5041      SUBI	R20,1
    F900 4050      SBCI	R21,0
(0122) 		    if(PORTD&0x01==1)PORTD=PORTD&0xfe;
    F901 9B90      SBIS	0x12,0
    F902 C004      RJMP	0xF907
    F903 B382      IN	R24,0x12
    F904 7F8E      ANDI	R24,0xFE
    F905 BB82      OUT	0x12,R24
    F906 C001      RJMP	0xF908
(0123)   			else PORTD=PORTD|0x1;
    F907 9A90      SBI	0x12,0
    F908 3040      CPI	R20,0
    F909 0745      CPC	R20,R21
    F90A F789      BNE	0xF8FC
    F90B 940EFC45  CALL	pop_gset1
    F90D 9508      RET
(0124) 		  }
(0125) 	 }	
(0126) void clr_dog(void)
(0127) {
(0128) if(PORTD&0x01==1)PORTD=PORTD&0xfe;
_clr_dog:
    F90E 9B90      SBIS	0x12,0
    F90F C004      RJMP	0xF914
    F910 B382      IN	R24,0x12
    F911 7F8E      ANDI	R24,0xFE
    F912 BB82      OUT	0x12,R24
    F913 C001      RJMP	0xF915
(0129) else PORTD=PORTD|0x1;
    F914 9A90      SBI	0x12,0
    F915 9508      RET
(0130) }
(0131) //spi模式3
(0132) //flash复位
(0133) void df_reset(void)
(0134) {
(0135) PORTB&=~(1<<RESET);  
_df_reset:
    F916 98C7      CBI	0x18,7
(0136) delay_us(500);
    F917 EF04      LDI	R16,0xF4
    F918 E011      LDI	R17,1
    F919 DF55      RCALL	_delay_us
(0137) PORTB|=1<<RESET;
    F91A 9AC7      SBI	0x18,7
    F91B 9508      RET
(0138) }
(0139) //主模式下发送一个字节或接收一个字节
(0140) unsigned char SPI_TranByte(unsigned char cData)
(0141) {
(0142) SPDR=cData;
_SPI_TranByte:
  cData                --> R16
    F91C B90F      OUT	0x0F,R16
(0143) while(!(SPSR&0x80));
    F91D 9B77      SBIS	0x0E,7
    F91E CFFE      RJMP	0xF91D
(0144) return SPDR;
    F91F B10F      IN	R16,0x0F
    F920 9508      RET
_Read_Testfile:
  j                    --> Y+1
  i                    --> Y+1
  len                  --> R22
  File                 --> R20
    F921 940EFC40  CALL	push_gset2
    F923 01B9      MOVW	R22,R18
    F924 01A8      MOVW	R20,R16
(0145) }
(0146) 
(0147) void Read_Testfile(char *File ,int len )
(0148) {
(0149) unsigned char i,j;
(0150) while(!(PINB&0x20));
    F925 9BB5      SBIS	0x16,5
    F926 CFFE      RJMP	0xF925
(0151) PORTB&=~(1<<CS);//使能 at45
    F927 98C4      CBI	0x18,4
(0152) SPI_TranByte(0x3);
    F928 E003      LDI	R16,3
    F929 DFF2      RCALL	_SPI_TranByte
(0153) SPI_TranByte((char)(page_counter_rd>>6));//页地址PA11-PA6
    F92A E026      LDI	R18,6
    F92B E030      LDI	R19,0
    F92C 91000110  LDS	R16,page_counter_rd
    F92E 91100111  LDS	R17,page_counter_rd+1
    F930 940EFC7E  CALL	lsr16
    F932 DFE9      RCALL	_SPI_TranByte
(0154) SPI_TranByte((char)((page_counter_rd<<2)|(page_offset_rd>>8)));////页地址PA5-PA0
    F933 9020010E  LDS	R2,page_offset_rd
    F935 9030010F  LDS	R3,page_offset_rd+1
    F937 2C23      MOV	R2,R3
    F938 2433      CLR	R3
    F939 91000110  LDS	R16,page_counter_rd
    F93B 0F00      LSL	R16
    F93C 1F11      ROL	R17
    F93D 0F00      LSL	R16
    F93E 1F11      ROL	R17
    F93F 2902      OR	R16,R2
    F940 2913      OR	R17,R3
    F941 DFDA      RCALL	_SPI_TranByte
(0155) SPI_TranByte((char)page_offset_rd);
    F942 9100010E  LDS	R16,page_offset_rd
    F944 DFD7      RCALL	_SPI_TranByte
    F945 C032      RJMP	0xF978
(0156)  while(len)
(0157)   {
(0158)   SPDR=0;
    F946 2422      CLR	R2
    F947 B82F      OUT	0x0F,R2
(0159)   while(!(SPSR&0x80));
    F948 9B77      SBIS	0x0E,7
    F949 CFFE      RJMP	0xF948
(0160)   *File=SPDR;
    F94A B02F      IN	R2,0x0F
    F94B 01FA      MOVW	R30,R20
    F94C 8220      STD	Z+0,R2
(0161)   File++; 
    F94D 5F4F      SUBI	R20,0xFF
    F94E 4F5F      SBCI	R21,0xFF
(0162)   len--;
    F94F 5061      SUBI	R22,1
    F950 4070      SBCI	R23,0
(0163)   page_offset_rd++;
    F951 9180010E  LDS	R24,page_offset_rd
    F953 9190010F  LDS	R25,page_offset_rd+1
    F955 9601      ADIW	R24,1
    F956 9390010F  STS	page_offset_rd+1,R25
    F958 9380010E  STS	page_offset_rd,R24
(0164)   if(page_offset_rd>=528)
    F95A 3180      CPI	R24,0x10
    F95B E0E2      LDI	R30,2
    F95C 079E      CPC	R25,R30
    F95D F0D0      BCS	0xF978
(0165)        {
(0166) 	   page_offset_rd=0;
    F95E 2422      CLR	R2
    F95F 2433      CLR	R3
    F960 9230010F  STS	page_offset_rd+1,R3
    F962 9220010E  STS	page_offset_rd,R2
(0167) 	   page_counter_rd++;
    F964 91800110  LDS	R24,page_counter_rd
    F966 91900111  LDS	R25,page_counter_rd+1
    F968 9601      ADIW	R24,1
    F969 93900111  STS	page_counter_rd+1,R25
    F96B 93800110  STS	page_counter_rd,R24
(0168) 	   if(page_counter_rd>=4096){quit();page_counter_rd=3849;}
    F96D 3080      CPI	R24,0
    F96E E1E0      LDI	R30,0x10
    F96F 079E      CPC	R25,R30
    F970 F038      BCS	0xF978
    F971 DF60      RCALL	_quit
    F972 E089      LDI	R24,0x9
    F973 E09F      LDI	R25,0xF
    F974 93900111  STS	page_counter_rd+1,R25
    F976 93800110  STS	page_counter_rd,R24
    F978 3060      CPI	R22,0
    F979 0767      CPC	R22,R23
    F97A F659      BNE	0xF946
(0169) 	   }
(0170) 	   
(0171)   }
(0172) PORTB|=1<<CS; 
    F97B 9AC4      SBI	0x18,4
    F97C 940EFC34  CALL	pop_gset2
    F97E 9508      RET
(0173) }
(0174) //UART1 initialize
(0175) // desired baud rate:57600
(0176) // actual baud rate:57599 (0.0%)
(0177) // char size: 8 bit
(0178) // parity: Disabled
(0179) void uart1_init(void)
(0180) {
(0181)  UCSR1B = 0x00; //disable while setting baud rate
_uart1_init:
    F97F 2422      CLR	R2
    F980 9220009A  STS	0x9A,R2
(0182)  UCSR1A = 0x00;
    F982 9220009B  STS	0x9B,R2
(0183)  UCSR1C = 0x06;

⌨️ 快捷键说明

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