ch375.lss
来自「atmega32对ch375的读写程序」· LSS 代码 · 共 1,719 行 · 第 1/5 页
LSS
1,719 行
ch375.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000033ca 00000000 00000000 00000094 2**0
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 0000003a 00800060 000033ca 0000345e 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 0000068f 0080009a 0080009a 00003498 2**0
ALLOC
3 .noinit 00000000 00800729 00800729 00003498 2**0
CONTENTS
4 .eeprom 00000000 00810000 00810000 00003498 2**0
CONTENTS
5 .stab 0000036c 00000000 00000000 00003498 2**2
CONTENTS, READONLY, DEBUGGING
6 .stabstr 00000084 00000000 00000000 00003804 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_aranges 00000014 00000000 00000000 00003888 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_pubnames 00000259 00000000 00000000 0000389c 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_info 00000b1e 00000000 00000000 00003af5 2**0
CONTENTS, READONLY, DEBUGGING
10 .debug_abbrev 000001f0 00000000 00000000 00004613 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_line 0000061d 00000000 00000000 00004803 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_str 0000048d 00000000 00000000 00004e20 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 <__ctors_end>
4: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
8: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
10: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
14: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
18: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
1c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
20: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
24: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
28: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
2c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
30: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
34: 0c 94 1b 01 jmp 0x236 <__vector_13>
38: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
3c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
40: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
44: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
48: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
4c: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
50: 0c 94 45 00 jmp 0x8a <__bad_interrupt>
00000054 <__ctors_end>:
54: 11 24 eor r1, r1
56: 1f be out 0x3f, r1 ; 63
58: cf e5 ldi r28, 0x5F ; 95
5a: d8 e0 ldi r29, 0x08 ; 8
5c: de bf out 0x3e, r29 ; 62
5e: cd bf out 0x3d, r28 ; 61
00000060 <__do_copy_data>:
60: 10 e0 ldi r17, 0x00 ; 0
62: a0 e6 ldi r26, 0x60 ; 96
64: b0 e0 ldi r27, 0x00 ; 0
66: ea ec ldi r30, 0xCA ; 202
68: f3 e3 ldi r31, 0x33 ; 51
6a: 02 c0 rjmp .+4 ; 0x70 <.do_copy_data_start>
0000006c <.do_copy_data_loop>:
6c: 05 90 lpm r0, Z+
6e: 0d 92 st X+, r0
00000070 <.do_copy_data_start>:
70: aa 39 cpi r26, 0x9A ; 154
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c <.do_copy_data_loop>
00000076 <__do_clear_bss>:
76: 17 e0 ldi r17, 0x07 ; 7
78: aa e9 ldi r26, 0x9A ; 154
7a: b0 e0 ldi r27, 0x00 ; 0
7c: 01 c0 rjmp .+2 ; 0x80 <.do_clear_bss_start>
0000007e <.do_clear_bss_loop>:
7e: 1d 92 st X+, r1
00000080 <.do_clear_bss_start>:
80: a9 32 cpi r26, 0x29 ; 41
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0c 94 63 01 jmp 0x2c6 <main>
0000008a <__bad_interrupt>:
8a: 0c 94 00 00 jmp 0x0 <__vectors>
0000008e <DelayMs>:
char *pstr;
void DelayMs(uint i)//延时处理
{uint j;
for(;i!=0;i--)
8e: 00 97 sbiw r24, 0x00 ; 0
90: 39 f0 breq .+14 ; 0xa0 <DelayMs+0x12>
{for(j=2000;j!=0;j--) {;}}
92: 20 ed ldi r18, 0xD0 ; 208
94: 37 e0 ldi r19, 0x07 ; 7
96: 22 53 subi r18, 0x32 ; 50
98: 30 40 sbci r19, 0x00 ; 0
9a: e9 f7 brne .-6 ; 0x96 <DelayMs+0x8>
9c: 01 97 sbiw r24, 0x01 ; 1
9e: f7 cf rjmp .-18 ; 0x8e <DelayMs>
a0: 08 95 ret
000000a2 <Usart_init>:
}
void Usart_init(void) //串口初始化
{
UCSRA = 0x00;
a2: 1b b8 out 0x0b, r1 ; 11
UCSRB =0x98; //发送接收使能,使用中断方式
a4: 88 e9 ldi r24, 0x98 ; 152
a6: 8a b9 out 0x0a, r24 ; 10
UCSRC =0X86;/* 设置帧格式: 8 个数据位, 1 个停止位*/
a8: 86 e8 ldi r24, 0x86 ; 134
aa: 80 bd out 0x20, r24 ; 32
UBRRH =0;//8Mhz频率,设置波特率9.6k
ac: 10 bc out 0x20, r1 ; 32
UBRRL =51;
ae: 83 e3 ldi r24, 0x33 ; 51
b0: 89 b9 out 0x09, r24 ; 9
b2: 08 95 ret
000000b4 <Usart_Receive>:
}
void Usart_Receive(void) //串口接受数据
{
for(uchar j=0;j<1;j++)
b4: 90 e0 ldi r25, 0x00 ; 0
{
while(!(UCSRA&0x80));//等待接收完成
b6: 5f 9b sbis 0x0b, 7 ; 11
b8: fe cf rjmp .-4 ; 0xb6 <Usart_Receive+0x2>
Usart_Receive_Data[j]=UDR;//接收数据
ba: e9 2f mov r30, r25
bc: ff 27 eor r31, r31
be: ed 55 subi r30, 0x5D ; 93
c0: ff 4f sbci r31, 0xFF ; 255
c2: 8c b1 in r24, 0x0c ; 12
c4: 80 83 st Z, r24
c6: 9f 5f subi r25, 0xFF ; 255
c8: b1 f3 breq .-20 ; 0xb6 <Usart_Receive+0x2>
ca: 08 95 ret
000000cc <Usart_Send_Str>:
}
}
void Usart_Send_Str(char *p) //串口发送字符串
{
cc: dc 01 movw r26, r24
for(uchar j=0;*(p+j)!='\0';j++)
ce: 90 e0 ldi r25, 0x00 ; 0
d0: 8c 91 ld r24, X
d2: 88 23 and r24, r24
d4: 69 f0 breq .+26 ; 0xf0 <Usart_Send_Str+0x24>
{
UDR=*(p+j);//发送数据
d6: fd 01 movw r30, r26
d8: e9 0f add r30, r25
da: f1 1d adc r31, r1
dc: 80 81 ld r24, Z
de: 8c b9 out 0x0c, r24 ; 12
while(!(UCSRA&0x20));//等待发送完成
e0: 5d 9b sbis 0x0b, 5 ; 11
e2: fe cf rjmp .-4 ; 0xe0 <Usart_Send_Str+0x14>
e4: 9f 5f subi r25, 0xFF ; 255
e6: fd 01 movw r30, r26
e8: e9 0f add r30, r25
ea: f1 1d adc r31, r1
ec: 80 81 ld r24, Z
ee: f1 cf rjmp .-30 ; 0xd2 <Usart_Send_Str+0x6>
f0: 08 95 ret
000000f2 <Usart_Send_Data>:
}
}
void Usart_Send_Data(char *p,uchar n) //串口发送数据
{
f2: 9c 01 movw r18, r24
for(uchar j=n;j>0;j--)
f4: 66 23 and r22, r22
f6: 51 f0 breq .+20 ; 0x10c <Usart_Send_Data+0x1a>
{
UDR=*(p+j-1);//发送数据
f8: f9 01 movw r30, r18
fa: e6 0f add r30, r22
fc: f1 1d adc r31, r1
fe: 31 97 sbiw r30, 0x01 ; 1
100: 80 81 ld r24, Z
102: 8c b9 out 0x0c, r24 ; 12
while(!(UCSRA&0x20));//等待发送完成
104: 5d 9b sbis 0x0b, 5 ; 11
106: fe cf rjmp .-4 ; 0x104 <Usart_Send_Data+0x12>
108: 61 50 subi r22, 0x01 ; 1
10a: f4 cf rjmp .-24 ; 0xf4 <Usart_Send_Data+0x2>
10c: 08 95 ret
0000010e <CH375FileRead>:
#ifdef FILE_DATA_BUF_LEN
UINT8 FILE_DATA_BUF[ FILE_DATA_BUF_LEN ]; /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度,起始地址建议为偶地址 */
UINT8 CH375FileRead( void ) /* 从当前文件读取数据 */
{
mCmdParam.ReadX.mDataBuffer = &FILE_DATA_BUF[0]; /* 指向文件数据缓冲区 */
10e: 80 ee ldi r24, 0xE0 ; 224
110: 94 e0 ldi r25, 0x04 ; 4
112: 90 93 cb 04 sts 0x04CB, r25
116: 80 93 ca 04 sts 0x04CA, r24
return( CH375FileReadX( ) );
11a: 0e 94 39 16 call 0x2c72 <CH375FileReadX>
}
11e: 99 27 eor r25, r25
120: 08 95 ret
00000122 <CH375FileWrite>:
#ifdef EN_DISK_WRITE
UINT8 CH375FileWrite( void ) /* 向当前文件写入数据 */
{
mCmdParam.WriteX.mDataBuffer = &FILE_DATA_BUF[0]; /* 指向文件数据缓冲区 */
122: 80 ee ldi r24, 0xE0 ; 224
124: 94 e0 ldi r25, 0x04 ; 4
126: 90 93 cb 04 sts 0x04CB, r25
12a: 80 93 ca 04 sts 0x04CA, r24
return( CH375FileWriteX( ) );
12e: 0e 94 26 17 call 0x2e4c <CH375FileWriteX>
}
132: 99 27 eor r25, r25
134: 08 95 ret
00000136 <xDelay100uS>:
#endif
#endif
/* 以下程序可以根据需要修改 */
#ifndef NO_DEFAULT_CH375_F_ENUM /* 在应用程序中定义NO_DEFAULT_CH375_F_ENUM可以禁止默认的枚举文件程序,然后用自行编写的程序代替它 */
UINT8 CH375FileEnumer( void ) /* 枚举文件 */
{
UINT8 status;
status = CH375FileOpen( );
if ( status == ERR_FOUND_NAME ) status = ERR_SUCCESS; /* 操作成功 */
return( status );
}
#endif
#ifndef NO_DEFAULT_CH375_F_QUERY /* 在应用程序中定义NO_DEFAULT_CH375_F_QUERY可以禁止默认的查询当前文件的信息程序,然后用自行编写的程序代替它 */
UINT8 CH375FileQuery( void ) /* 查询当前文件的信息 */
{
PUINT8 buf;
UINT8 count;
buf = (PUINT8)( & mCmdParam.Modify.mFileSize );
for ( count = sizeof( mCmdParam.Modify ); count != 0; count -- ) {
*buf = 0xFF; /* 输入参数全部无效,仅查询不修改 */
buf ++;
}
return( CH375FileModify( ) );
}
#endif
#ifndef NO_DEFAULT_CH375_INT /* 在应用程序中定义NO_DEFAULT_CH375_INT可以禁止默认的中断处理程序,然后用自行编写的程序代替它 */
#if LIB_CFG_INT_EN == 0 /* CH375的INT#引脚连接方式为"查询方式" */
void xQueryInterrupt( void ) /* 查询CH375中断并更新中断状态 */
{
while ( CH375_INT_WIRE ); /* 如果CH375的中断引脚输出高电平则等待 */
xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取当前中断状态,发出命令后至少延时2uS */
CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */
}
#else /* LIB_CFG_INT_EN != 0, CH375的INT#引脚连接方式为"中断方式" */
void xQueryInterrupt( void ) /* 查询中断状态,等待硬件中断 */
{
while ( CH375IntStatus == 0 ); /* 子程序库调用该子程序之前CH375IntStatus=0,硬件中断后,由中断服务程序置为非0的实际中断状态后返回 */
}
#ifndef CH375_INT_NO
#define CH375_INT_NO 2
#endif
#pragma interrupt_handler CH375Interrupt:CH375_INT_NO
void CH375Interrupt( void ) /* CH375中断服务程序,由CH375的INT#的低电平或者下降沿触发单片机中断 */
{
xWriteCH375Cmd( CMD_GET_STATUS ); /* 获取中断状态并取消中断请求 */
CH375IntStatus = xReadCH375Data( ); /* 获取中断状态 */
if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 检测到USB设备断开事件 */
else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 检测到USB设备连接事件 */
#ifdef CLEAR_INT_MARK
CLEAR_INT_MARK( ); /* 某些单片机需要由软件清除中断标志 */
#endif
}
#endif
#endif
#ifndef NO_DEFAULT_DELAY_100US /* 在应用程序中定义NO_DEFAULT_DELAY_100US可以禁止默认的延时100uS子程序,然后用自行编写的程序代替它 */
void xDelay100uS( void ) /* 延时100uS */
{
UINT16 count;
for ( count = 330; count != 0; count -- ); /* 延时100uS,6x50nS@20MHz */
136: 8a e4 ldi r24, 0x4A ; 74
138: 91 e0 ldi r25, 0x01 ; 1
13a: 4e 97 sbiw r24, 0x1e ; 30
13c: f1 f7 brne .-4 ; 0x13a <xDelay100uS+0x4>
13e: 08 95 ret
00000140 <xDelayAfterWrite>:
}
#endif
#ifdef EN_DISK_WRITE
#ifndef NO_DEFAULT_DELAY_WRITE /* 在应用程序中定义NO_DEFAULT_DELAY_WRITE可以禁止默认的写操作后延时程序,然后用自行编写的程序代替它 */
void xDelayAfterWrite( void ) /* 写操作后延时 */
{
UINT16 count;
for ( count = 650; count != 0; count -- ); /* 延时200uS左右 */
140: 8a e8 ldi r24, 0x8A ; 138
142: 92 e0 ldi r25, 0x02 ; 2
144: c2 97 sbiw r24, 0x32 ; 50
146: f1 f7 brne .-4 ; 0x144 <xDelayAfterWrite+0x4>
148: 08 95 ret
0000014a <xFileNameEnumer>:
}
#endif
#endif
#ifndef NO_DEFAULT_FILE_ENUMER /* 在应用程序中定义NO_DEFAULT_FILE_ENUMER可以禁止默认的文件名枚举回调程序,然后用自行编写的程序代替它 */
void xFileNameEnumer( void ) /* 文件名枚举回调子程序 */
{
14a: 08 95 ret
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?