📄 cqt_boot.lst
字号:
__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 + -