📄 attest.lst
字号:
__start:
__text_start:
0065 EFCF LDI R28,0xFF
0066 E1D0 LDI R29,0x10
0067 BFCD OUT 0x3D,R28
0068 BFDE OUT 0x3E,R29
0069 51C0 SUBI R28,0x10
006A 40D0 SBCI R29,0
006B EA0A LDI R16,0xAA
006C 8308 STD Y+0,R16
006D 2400 CLR R0
006E E3EE LDI R30,0x3E
006F E0F1 LDI R31,1
0070 E015 LDI R17,5
0071 34E6 CPI R30,0x46
0072 07F1 CPC R31,R17
0073 F011 BEQ 0x0076
0074 9201 ST R0,Z+
0075 CFFB RJMP 0x0071
0076 8300 STD Z+0,R16
0077 E8EC LDI R30,0x8C
0078 E0F0 LDI R31,0
0079 E0A0 LDI R26,0
007A E0B1 LDI R27,1
007B E010 LDI R17,0
007C 3CEA CPI R30,0xCA
007D 07F1 CPC R31,R17
007E F021 BEQ 0x0083
007F 95C8 LPM
0080 9631 ADIW R30,1
0081 920D ST R0,X+
0082 CFF9 RJMP 0x007C
0083 940E0320 CALL _main
_exit:
0085 CFFF RJMP _exit
FILE: E:\ICC128\2008控制台\2008console0TEST\flashTest\at45db161d.c
(0001) /************************************************
(0002) flash 读写程序
(0003)
(0004) 2008年6月20日
(0005)
(0006) *************************************************/
(0007) #include "2008.h"
(0008)
(0009) #define DF_PAGE_SIZE 528
(0010) #define DF_READ_BUFFER 0
(0011) #define DF_WRITE_BUFFER 1
(0012)
(0013) #define MM_PAGE_TO_B1_XFER 0x53 //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
(0014) // main memory page to buffer 2 transfer
(0015) #define MM_PAGE_TO_B2_XFER 0x55 //主存储器页到缓存区转移命令(缓冲区1 53H 缓冲区2 55H)
(0016) // buffer 1 to main memory page program with built-in erase
(0017) #define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
(0018) // buffer 2 to main memory page program with built-in erase
(0019) #define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
(0020) // buffer 1 read
(0021) #define BUFFER_1_READ 0xd1 //0xD4
(0022) // buffer 2 read
(0023) #define BUFFER_2_READ 0xd3 //0xD6
(0024) // buffer 1 write
(0025) #define BUFFER_1_WRITE 0x84
(0026) // buffer 2 write
(0027) #define BUFFER_2_WRITE 0x87
(0028)
(0029)
(0030) #define STATUS_REGISTER 0xD7
(0031)
(0032)
(0033) #define UNSELECT_CHIP PORTB |= 0x10;
(0034) #define SELECT_CHIP PORTB &= 0xef;
(0035)
(0036) uint g_CurReadPage;//当前读的页地址
(0037) uint g_CurReadByte;//当前读的字节(页中地址)
(0038) uint g_CurWritePage;//当前写的页地址
(0039) uint g_CurWriteByte;//当前写的字节地址(页中地址)
(0040) //====================================================================
(0041) void df_init(void)
(0042) {
(0043) //MISO设置为输入,上拉电阻关闭,其它默认为1
(0044) //PORTB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(PB2);
(0045) //PORTB |= 1 2 4 0
(0046) PORTB |= 0x17;
_df_init:
0086 B388 IN R24,0x18
0087 6187 ORI R24,0x17
0088 BB88 OUT 0x18,R24
(0047) /*
(0048) 注:使用AVR单片机SPI口,并用作主器件时SS引脚(ATMEGA8中PB2)要拉高或设置成输出!
(0049) */
(0050) //SCK,MOSI和CS端口对应脚设置为输出
(0051) //DDRB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS);
(0052) //DDRB |= 1 2 4
(0053) DDRB |= 0X16; //配置为输出
0089 B387 IN R24,0x17
008A 6186 ORI R24,0x16
008B BB87 OUT 0x17,R24
(0054) // SPI中断禁止, SPI使能, master模式, MSB 前, SPI 模式 3, SCK频率Fcl/4
(0055) //SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPHA)|_BV(CPOL);//|_BV(SPR1)|_BV(SPR0);
(0056) SPCR = 0x5c; //SPI控制寄存器
008C E58C LDI R24,0x5C
008D B98D OUT 0x0D,R24
008E 9508 RET
_df_write_open:
addr --> R20
008F 940E0650 CALL push_gset1
0091 01A8 MOVW R20,R16
(0057)
(0058) }
(0059) //======================================================================
(0060) //写初始化功能函数,addr为打开后读到的初始地址
(0061) void df_write_open(uint addr)
(0062) {
(0063) g_CurWritePage=addr/DF_PAGE_SIZE;
0092 E120 LDI R18,0x10
0093 E032 LDI R19,2
0094 018A MOVW R16,R20
0095 940E05AC CALL div16u
0097 93100141 STS _g_CurWritePage+1,R17
0099 93000140 STS _g_CurWritePage,R16
(0064) g_CurWriteByte=addr%DF_PAGE_SIZE;
009B E120 LDI R18,0x10
009C E032 LDI R19,2
009D 018A MOVW R16,R20
009E 940E05AA CALL mod16u
00A0 9310013F STS _g_CurWriteByte+1,R17
00A2 9300013E STS _g_CurWriteByte,R16
(0065) load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
00A4 E021 LDI R18,1
00A5 E030 LDI R19,0
00A6 91000140 LDS R16,_g_CurWritePage
00A8 91100141 LDS R17,_g_CurWritePage+1
00AA D022 RCALL _load_page_to_buffer
00AB 940E0653 CALL pop_gset1
00AD 9508 RET
_df_read_open:
addr --> R20
00AE 940E0650 CALL push_gset1
00B0 01A8 MOVW R20,R16
(0066) }
(0067) //======================================================================
(0068) //读初始化功能函数,addr为打开后读到的初始地址
(0069) void df_read_open(uint addr)
(0070) {
(0071) g_CurReadPage=addr/DF_PAGE_SIZE;
00B1 E120 LDI R18,0x10
00B2 E032 LDI R19,2
00B3 018A MOVW R16,R20
00B4 940E05AC CALL div16u
00B6 93100145 STS _g_CurReadPage+1,R17
00B8 93000144 STS _g_CurReadPage,R16
(0072) g_CurReadByte=addr%DF_PAGE_SIZE;
00BA E120 LDI R18,0x10
00BB E032 LDI R19,2
00BC 018A MOVW R16,R20
00BD 940E05AA CALL mod16u
00BF 93100143 STS _g_CurReadByte+1,R17
00C1 93000142 STS _g_CurReadByte,R16
(0073) load_page_to_buffer(g_CurReadPage,DF_READ_BUFFER);
00C3 2722 CLR R18
00C4 2733 CLR R19
00C5 91000144 LDS R16,_g_CurReadPage
00C7 91100145 LDS R17,_g_CurReadPage+1
00C9 D003 RCALL _load_page_to_buffer
00CA 940E0653 CALL pop_gset1
00CC 9508 RET
_load_page_to_buffer:
buffer --> R22
page --> R20
00CD 940E0667 CALL push_gset2
00CF 01B9 MOVW R22,R18
00D0 01A8 MOVW R20,R16
(0074) }
(0075) //=======================================================================
(0076) //读主存储器指定页到读缓冲区(BUFFER1)
(0077) void load_page_to_buffer(uint page,uint buffer)
(0078) {
(0079) SELECT_CHIP;
00D1 B388 IN R24,0x18
00D2 7E8F ANDI R24,0xEF
00D3 BB88 OUT 0x18,R24
(0080)
(0081) if(buffer == DF_READ_BUFFER) //=0
00D4 3060 CPI R22,0
00D5 0767 CPC R22,R23
00D6 F421 BNE 0x00DB
(0082) spi_write(MM_PAGE_TO_B1_XFER); //0x53
00D7 E503 LDI R16,0x53
00D8 E010 LDI R17,0
00D9 D018 RCALL _spi_write
00DA C003 RJMP 0x00DE
(0083) else
(0084) spi_write(MM_PAGE_TO_B2_XFER); //0x55
00DB E505 LDI R16,0x55
00DC E010 LDI R17,0
00DD D014 RCALL _spi_write
(0085) spi_write((uint)(page >> 6));
00DE E026 LDI R18,6
00DF E030 LDI R19,0
00E0 018A MOVW R16,R20
00E1 940E0677 CALL lsr16
00E3 D00E RCALL _spi_write
(0086) spi_write((uint)(page << 2));
00E4 018A MOVW R16,R20
00E5 0F00 LSL R16
00E6 1F11 ROL R17
00E7 0F00 LSL R16
00E8 1F11 ROL R17
00E9 D008 RCALL _spi_write
(0087) spi_write(0x00);
00EA 2700 CLR R16
00EB 2711 CLR R17
00EC D005 RCALL _spi_write
(0088)
(0089) UNSELECT_CHIP;
00ED 9AC4 SBI 0x18,4
(0090)
(0091) df_wait_busy();
00EE D009 RCALL _df_wait_busy
00EF 940E0647 CALL pop_gset2
00F1 9508 RET
(0092) }
(0093) //=======================================================================
(0094) //从SPI口输出一字节数据
(0095) uint spi_write(uint data)
(0096) {
(0097) SPDR = data;
_spi_write:
data --> R16
00F2 B90F OUT 0x0F,R16
(0098) while(!(SPSR & 0x80)); //判断 SPIF
00F3 9B77 SBIS 0x0E,7
00F4 CFFE RJMP 0x00F3
(0099) return SPDR;
00F5 B10F IN R16,0x0F
00F6 2711 CLR R17
00F7 9508 RET
(0100) }
(0101) //=======================================================================
(0102) //检测并等待器件忙状态,8引脚封闭器件没有 RDY/BUSY引脚 为些通过读状态寄存器来检测忙状态
(0103) void df_wait_busy(void)
(0104) {
(0105) SELECT_CHIP;
_df_wait_busy:
00F8 B388 IN R24,0x18
00F9 7E8F ANDI R24,0xEF
00FA BB88 OUT 0x18,R24
(0106) spi_write(STATUS_REGISTER);
00FB ED07 LDI R16,0xD7
00FC E010 LDI R17,0
00FD DFF4 RCALL _spi_write
00FE C006 RJMP 0x0105
(0107) while(1)
(0108) {
(0109) if(spi_write(0) & 0x80) //读取的最高位0时器件忙
00FF 2700 CLR R16
0100 2711 CLR R17
0101 DFF0 RCALL _spi_write
0102 FF07 SBRS R16,7
0103 C001 RJMP 0x0105
(0110) break;
0104 C001 RJMP 0x0106
0105 CFF9 RJMP 0x00FF
(0111) }
(0112) UNSELECT_CHIP;
0106 9AC4 SBI 0x18,4
0107 9508 RET
_df_write:
temp --> R10
size --> R20
buf --> R22
0108 940E066B CALL push_gset3
010A 01A9 MOVW R20,R18
010B 01B8 MOVW R22,R16
010C 9722 SBIW R28,2
(0113) }
(0114) //=======================================================================
(0115) void df_write(uint *buf,uint size) //buf 源数据 size 写多少个字节
(0116) {
(0117) uint temp;
(0118)
(0119) if((g_CurWriteByte + size) > DF_PAGE_SIZE) //如果当前页未写空间不够size字节
010D 9020013E LDS R2,_g_CurWriteByte
010F 9030013F LDS R3,_g_CurWriteByte+1
0111 0E24 ADD R2,R20
0112 1E35 ADC R3,R21
0113 E180 LDI R24,0x10
0114 E092 LDI R25,2
0115 1582 CP R24,R2
0116 0593 CPC R25,R3
0117 F008 BCS 0x0119
0118 C035 RJMP 0x014E
(0120) {
(0121) //写当前页剩余空间的数据
(0122) temp=DF_PAGE_SIZE - g_CurWriteByte;
0119 9020013E LDS R2,_g_CurWriteByte
011B 9030013F LDS R3,_g_CurWriteByte+1
011D 015C MOVW R10,R24
011E 18A2 SUB R10,R2
011F 08B3 SBC R11,R3
(0123) write_buffer(g_CurWriteByte,buf,temp); //将数据写入写缓冲区
0120 82B9 STD Y+1,R11
0121 82A8 STD Y+0,R10
0122 019B MOVW R18,R22
0123 0181 MOVW R16,R2
0124 D05E RCALL _write_buffer
(0124) //保存当前页
(0125) write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER);
0125 E021 LDI R18,1
0126 E030 LDI R19,0
0127 91000140 LDS R16,_g_CurWritePage
0129 91100141 LDS R17,_g_CurWritePage+1
012B D083 RCALL _write_page_from_buffer
(0126) g_CurWritePage++;
012C 91800140 LDS R24,_g_CurWritePage
012E 91900141 LDS R25,_g_CurWritePage+1
0130 9601 ADIW R24,1
0131 93900141 STS _g_CurWritePage+1,R25
0133 93800140 STS _g_CurWritePage,R24
(0127) load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
0135 E021 LDI R18,1
0136 E030 LDI R19,0
0137 018C MOVW R16,R24
0138 DF94 RCALL _load_page_to_buffer
(0128)
(0129) //写入到下一页对应缓冲区
(0130) g_CurWriteByte=size-temp;
0139 011A MOVW R2,R20
013A 182A SUB R2,R10
013B 083B SBC R3,R11
013C 9230013F STS _g_CurWriteByte+1,R3
013E 9220013E STS _g_CurWriteByte,R2
(0131) write_buffer(0,buf+temp,g_CurWriteByte);
0140 8239 STD Y+1,R3
0141 8228 STD Y+0,R2
0142 E002 LDI R16,2
0143 E010 LDI R17,0
0144 0195 MOVW R18,R10
0145 940E0637 CALL empy16s
0147 0198 MOVW R18,R16
0148 0F26 ADD R18,R22
0149 1F37 ADC R19,R23
014A 2700 CLR R16
014B 2711 CLR R17
014C D036 RCALL _write_buffer
(0132) }
014D C031 RJMP 0x017F
(0133) else
(0134) {
(0135) write_buffer(g_CurWriteByte,buf,size);
014E 8359 STD Y+1,R21
014F 8348 STD Y+0,R20
0150 019B MOVW R18,R22
0151 9100013E LDS R16,_g_CurWriteByte
0153 9110013F LDS R17,_g_CurWriteByte+1
0155 D02D RCALL _write_buffer
(0136) g_CurWriteByte+=size;
0156 9020013E LDS R2,_g_CurWriteByte
0158 9030013F LDS R3,_g_CurWriteByte+1
015A 0E24 ADD R2,R20
015B 1E35 ADC R3,R21
015C 9230013F STS _g_CurWriteByte+1,R3
015E 9220013E STS _g_CurWriteByte,R2
(0137)
(0138) //缓冲已满,写入到主存储区
(0139) if(g_CurWriteByte==DF_PAGE_SIZE)
0160 01C1 MOVW R24,R2
0161 3180 CPI R24,0x10
0162 E0E2 LDI R30,2
0163 079E CPC R25,R30
0164 F4D1 BNE 0x017F
(0140) {
(0141) g_CurWriteByte=0;
0165 2422 CLR R2
0166 2433 CLR R3
0167 9230013F STS _g_CurWriteByte+1,R3
0169 9220013E STS _g_CurWriteByte,R2
(0142) write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER);
016B E021 LDI R18,1
016C E030 LDI R19,0
016D 91000140 LDS R16,_g_CurWritePage
016F 91100141 LDS R17,_g_CurWritePage+1
0171 D03D RCALL _write_page_from_buffer
(0143) g_CurWritePage++;
0172 91800140 LDS R24,_g_CurWritePage
0174 91900141 LDS R25,_g_CurWritePage+1
0176 9601 ADIW R24,1
0177 93900141 STS _g_CurWritePage+1,R25
0179 93800140 STS _g_CurWritePage,R24
(0144) load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);
017B E021 LDI R18,1
017C E030 LDI R19,0
017D 018C MOVW R16,R24
017E DF4E RCALL _load_page_to_buffer
(0145) }
(0146) }
017F 9622 ADIW R28,2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -