📄 flash.s
字号:
.module flash.c
.area data(ram, con, rel)
_read_string::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.blkb 18
.area idata
.word 0,0,0,0,0
.byte 0,0,0,0,0,0,0,0
.area data(ram, con, rel)
.dbfile E:\ICC\SPI\flash.c
.dbsym e read_string _read_string A[19:19]c
.area text(rom, con, rel)
.dbfile E:\ICC\SPI\flash.c
.dbfunc e Read_abyte _Read_abyte fc
; address0 -> R20
; address1 -> R22
; address2 -> R10
; data -> R12
; address -> y+8
.even
_Read_abyte::
rcall push_arg4
rcall push_gset4
.dbline -1
.dbline 13
; #include <iom8v.h>
; #include "mytype.h"
; #include "uart.h"
; #include "spi.h"
;
; extern uint8 table[];
; uint8 read_string[19]={0};//
;
; /***************************************************************************************
; 读取一个字节
; *****************************************************************************************/
; uint8 Read_abyte(uint32 address)
; {
.dbline 16
; uint8 data;
; uint8 address2,address1,address0;
; address2=(uint8)(address>>16);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R2,R4
clr R4
clr R5
mov R10,R2
.dbline 17
; address1=(uint8)(address>>8);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
rcall lsr32
mov R22,R16
.dbline 18
; address0=(uint8)address;
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
mov R20,R2
L2:
.dbline 19
L3:
.dbline 19
; while((Read_RDSR())&0x01);
rcall _Read_RDSR
sbrc R16,0
rjmp L2
.dbline 20
; CS_0;
cbi 0x18,2
.dbline 21
; Spi_MT(0x03);
ldi R16,3
rcall _Spi_MT
.dbline 22
; Spi_MT(address2);
mov R16,R10
rcall _Spi_MT
.dbline 23
; Spi_MT(address1);
mov R16,R22
rcall _Spi_MT
.dbline 24
; Spi_MT(address0);
mov R16,R20
rcall _Spi_MT
.dbline 25
; data=Spi_MR();
rcall _Spi_MR
mov R12,R16
.dbline 26
; CS_1;
sbi 0x18,2
.dbline 27
; return data;
.dbline -2
L1:
rcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r address0 20 c
.dbsym r address1 22 c
.dbsym r address2 10 c
.dbsym r data 12 c
.dbsym l address 8 l
.dbend
.dbfunc e Write_abyte _Write_abyte fV
; address0 -> R20
; address1 -> R22
; address2 -> R10
; write_data -> R12
; address -> y+8
.even
_Write_abyte::
rcall push_arg4
rcall push_gset4
ldd R12,y+12
.dbline -1
.dbline 34
; }
;
; /***************************************************************************************
; 写入一个字节
; *****************************************************************************************/
; void Write_abyte(uint32 address,uint8 write_data)
; {
.dbline 36
; uint8 address2,address1,address0;
; address2=(uint8)(address>>16);
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
movw R2,R4
clr R4
clr R5
mov R10,R2
.dbline 37
; address1=(uint8)(address>>8);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
st -y,R24
movw R16,R2
movw R18,R4
rcall lsr32
mov R22,R16
.dbline 38
; address0=(uint8)address;
movw R30,R28
ldd R2,z+8
ldd R3,z+9
ldd R4,z+10
ldd R5,z+11
mov R20,R2
L6:
.dbline 39
L7:
.dbline 39
; while((Read_RDSR())&0x01);
rcall _Read_RDSR
sbrc R16,0
rjmp L6
.dbline 40
; WriteEN();
rcall _WriteEN
.dbline 41
; CS_0;
cbi 0x18,2
.dbline 42
; Spi_MT(0x02);
ldi R16,2
rcall _Spi_MT
.dbline 43
; Spi_MT(address2);
mov R16,R10
rcall _Spi_MT
.dbline 44
; Spi_MT(address1);
mov R16,R22
rcall _Spi_MT
.dbline 45
; Spi_MT(address0);
mov R16,R20
rcall _Spi_MT
.dbline 46
; Spi_MT(write_data);
mov R16,R12
rcall _Spi_MT
.dbline 47
; CS_1;
sbi 0x18,2
.dbline -2
L5:
rcall pop_gset4
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r address0 20 c
.dbsym r address1 22 c
.dbsym r address2 10 c
.dbsym r write_data 12 c
.dbsym l address 8 l
.dbend
.dbfunc e WriteEN _WriteEN fV
.even
_WriteEN::
.dbline -1
.dbline 53
; }
; /***************************************************************************************
; 写入写使能命令
; *****************************************************************************************/
; void WriteEN(void)
; {
.dbline 54
; CS_0;
cbi 0x18,2
.dbline 55
; Spi_MT(0x06);
ldi R16,6
rcall _Spi_MT
.dbline 56
; CS_1;
sbi 0x18,2
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbend
.dbfunc e WriteDisable _WriteDisable fV
.even
_WriteDisable::
.dbline -1
.dbline 62
; }
; /***************************************************************************************
; 写入写禁止命令
; *****************************************************************************************/
; void WriteDisable(void)
; {
.dbline 63
; CS_0;
cbi 0x18,2
.dbline 64
; Spi_MT(0x04);
ldi R16,4
rcall _Spi_MT
.dbline 65
; CS_1;
sbi 0x18,2
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Sector_Erase _Sector_Erase fV
; address0 -> R20
; address1 -> R22
; address2 -> R10
; address -> y+6
.even
_Sector_Erase::
rcall push_arg4
rcall push_gset3
.dbline -1
.dbline 71
; }
; /***************************************************************************************
; 写入段擦除使能命令
; *****************************************************************************************/
; void Sector_Erase(uint32 address)
; {
.dbline 73
; uint8 address2,address1,address0;
; address2=(uint8)(address>>16);
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
movw R2,R4
clr R4
clr R5
mov R10,R2
.dbline 74
; address1=(uint8)(address>>8);
ldi R24,8
ldi R25,0
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
st -y,R24
movw R16,R2
movw R18,R4
rcall lsr32
mov R22,R16
.dbline 75
; address0=(uint8)address;
movw R30,R28
ldd R2,z+6
ldd R3,z+7
ldd R4,z+8
ldd R5,z+9
mov R20,R2
L12:
.dbline 76
L13:
.dbline 76
; while((Read_RDSR())&0x01);
rcall _Read_RDSR
sbrc R16,0
rjmp L12
.dbline 77
; WriteEN();
rcall _WriteEN
.dbline 78
; CS_0;
cbi 0x18,2
.dbline 79
; Spi_MT(0xd8);
ldi R16,216
rcall _Spi_MT
.dbline 80
; Spi_MT(address2);
mov R16,R10
rcall _Spi_MT
.dbline 81
; Spi_MT(address1);
mov R16,R22
rcall _Spi_MT
.dbline 82
; Spi_MT(address0);
mov R16,R20
rcall _Spi_MT
.dbline 83
; CS_1;
sbi 0x18,2
.dbline 84
; Prints("Erase sector ",0);
clr R18
clr R19
ldi R16,<L15
ldi R17,>L15
rcall _Prints
.dbline 85
; Send_abyte(table[address2/10]);
ldi R18,10
ldi R19,0
mov R16,R10
clr R17
rcall div16s
movw R30,R16
ldi R24,<_table
ldi R25,>_table
add R30,R24
adc R31,R25
ldd R16,z+0
clr R17
rcall _Send_abyte
.dbline 86
; Send_abyte(table[address2%10]);
ldi R18,10
ldi R19,0
mov R16,R10
clr R17
rcall mod16s
movw R30,R16
ldi R24,<_table
ldi R25,>_table
add R30,R24
adc R31,R25
ldd R16,z+0
clr R17
rcall _Send_abyte
.dbline 87
; Prints(" completed...",1);
ldi R18,1
ldi R19,0
ldi R16,<L16
ldi R17,>L16
rcall _Prints
.dbline -2
L11:
rcall pop_gset3
adiw R28,4
.dbline 0 ; func end
ret
.dbsym r address0 20 c
.dbsym r address1 22 c
.dbsym r address2 10 c
.dbsym l address 6 l
.dbend
.dbfunc e Bulk_Erase _Bulk_Erase fV
.even
_Bulk_Erase::
.dbline -1
.dbline 94
; }
;
; /***************************************************************************************
; 写入片擦除使能命令
; *****************************************************************************************/
; void Bulk_Erase(void)
; {
.dbline 95
; WriteEN();
rcall _WriteEN
L18:
.dbline 96
L19:
.dbline 96
; while((Read_RDSR())&0x01);
rcall _Read_RDSR
sbrc R16,0
rjmp L18
.dbline 97
; CS_0;
cbi 0x18,2
.dbline 98
; Spi_MT(0xc7);
ldi R16,199
rcall _Spi_MT
.dbline 99
; CS_1;
sbi 0x18,2
.dbline 100
; Prints("Bulk Erawe completed...",1);
ldi R18,1
ldi R19,0
ldi R16,<L21
ldi R17,>L21
rcall _Prints
.dbline -2
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e DelayX100ms _DelayX100ms fV
; i -> y+0
; x -> y+12
.even
_DelayX100ms::
rcall push_arg4
rcall push_gset2
sbiw R28,8
.dbline -1
.dbline 107
; }
;
; /***************************************************************************************
; 延时X/100ms
; *****************************************************************************************/
; void DelayX100ms(uint32 x)
; {
rjmp L24
L23:
.dbline 110
; uint32 i;
; while(x--)
; {
.dbline 111
; i=1295;
ldi R20,15
ldi R21,5
ldi R22,0
ldi R23,0
movw R30,R28
std z+0,R20
std z+1,R21
std z+2,R22
std z+3,R23
L26:
.dbline 112
L27:
.dbline 112
movw R30,R28
ldd R2,z+0
ldd R3,z+1
ldd R4,z+2
ldd R5,z+3
movw R30,R28
std z+4,R2
std z+5,R3
std z+6,R4
std z+7,R5
ldi R20,1
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
sub R2,R20
sbc R3,R21
sbc R4,R22
sbc R5,R23
movw R30,R28
std z+0,R2
std z+1,R3
std z+2,R4
std z+3,R5
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+4
ldd R3,z+5
ldd R4,z+6
ldd R5,z+7
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
breq X0
rjmp L26
X0:
.dbline 113
L24:
.dbline 109
movw R30,R28
ldd R2,z+12
ldd R3,z+13
ldd R4,z+14
ldd R5,z+15
movw R30,R28
std z+4,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -