📄 m16_usart.lss
字号:
M16_USART.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000001ca 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .debug_aranges 00000040 00000000 00000000 0000021e 2**0
CONTENTS, READONLY, DEBUGGING
2 .debug_pubnames 000000c6 00000000 00000000 0000025e 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_info 000002ec 00000000 00000000 00000324 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_abbrev 000001d0 00000000 00000000 00000610 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_line 0000037a 00000000 00000000 000007e0 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_frame 000000b0 00000000 00000000 00000b5c 2**2
CONTENTS, READONLY, DEBUGGING
7 .debug_str 0000015a 00000000 00000000 00000c0c 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_loc 00000056 00000000 00000000 00000d66 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_ranges 00000060 00000000 00000000 00000dbc 2**0
CONTENTS, READONLY, DEBUGGING
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 2a 00 jmp 0x54 ; 0x54 <__ctors_end>
4: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
8: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
10: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
14: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
18: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
1c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
20: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
24: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
28: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
2c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
30: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
34: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
38: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
3c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
40: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
44: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
48: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
4c: 0c 94 47 00 jmp 0x8e ; 0x8e <__bad_interrupt>
50: 0c 94 47 00 jmp 0x8e ; 0x8e <__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: d4 e0 ldi r29, 0x04 ; 4
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: f1 e0 ldi r31, 0x01 ; 1
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: a0 36 cpi r26, 0x60 ; 96
72: b1 07 cpc r27, r17
74: d9 f7 brne .-10 ; 0x6c <.do_copy_data_loop>
00000076 <__do_clear_bss>:
76: 10 e0 ldi r17, 0x00 ; 0
78: a0 e6 ldi r26, 0x60 ; 96
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: a0 36 cpi r26, 0x60 ; 96
82: b1 07 cpc r27, r17
84: e1 f7 brne .-8 ; 0x7e <.do_clear_bss_loop>
86: 0e 94 ae 00 call 0x15c ; 0x15c <main>
8a: 0c 94 e3 00 jmp 0x1c6 ; 0x1c6 <_exit>
0000008e <__bad_interrupt>:
8e: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
00000092 <usart_init_baud>:
/*------------------------------------------------------
关于波特率的设置,还是直接赋给寄存器比较好,减少CPU工作量
--------------------------------------------------------*/
// 形参为波特率
void usart_init_baud(uint16 baud)
{
92: 59 98 cbi 0x0b, 1 ; 11
UCSRA |= (1<<U2X);
UBRRL= (F_CPU/baud/8-1)%256;
UBRRH= (F_CPU/baud/8-1)/256;
#else
UCSRA &= ~(1<<U2X);
UBRRL= (F_CPU/baud/16-1)%256; // OK here
94: 9c 01 movw r18, r24
96: 40 e0 ldi r20, 0x00 ; 0
98: 50 e0 ldi r21, 0x00 ; 0
9a: 60 e0 ldi r22, 0x00 ; 0
9c: 78 e0 ldi r23, 0x08 ; 8
9e: 87 e0 ldi r24, 0x07 ; 7
a0: 90 e0 ldi r25, 0x00 ; 0
a2: 0e 94 c1 00 call 0x182 ; 0x182 <__udivmodsi4>
a6: c9 01 movw r24, r18
a8: da 01 movw r26, r20
aa: 21 50 subi r18, 0x01 ; 1
ac: 29 b9 out 0x09, r18 ; 9
UBRRH= (F_CPU/baud/16-1)/256;
ae: 01 97 sbiw r24, 0x01 ; 1
b0: a1 09 sbc r26, r1
b2: b1 09 sbc r27, r1
b4: 89 2f mov r24, r25
b6: 9a 2f mov r25, r26
b8: ab 2f mov r26, r27
ba: bb 27 eor r27, r27
bc: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 7
UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,无校验
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 8
UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,偶校验
be: 8e ea ldi r24, 0xAE ; 174
c0: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
c2: 8c e1 ldi r24, 0x1C ; 28
c4: 8a b9 out 0x0a, r24 ; 10
#endif
}
c6: 08 95 ret
000000c8 <usart_init_std>:
// 用库函数设置
void usart_init_std(void)
{
c8: 10 bc out 0x20, r1 ; 32
// 利用库函数设置
UBRRH= UBRRH_VALUE;
UBRRL= UBRRL_VALUE;
ca: 8b e0 ldi r24, 0x0B ; 11
cc: 89 b9 out 0x09, r24 ; 9
#ifdef U2XX // 倍速
UCSRA |= (1<<U2X);
#else
UCSRA &= ~(1<<U2X);
ce: 59 98 cbi 0x0b, 1 ; 11
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 7
UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,无校验
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 8
UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,偶校验
d0: 8e ea ldi r24, 0xAE ; 174
d2: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
d4: 8c e1 ldi r24, 0x1C ; 28
d6: 8a b9 out 0x0a, r24 ; 10
#endif
}
d8: 08 95 ret
000000da <usart_init>:
// 无形参,波特率直接赋给UBRRH和UBRRL
void usart_init(void)
{
da: 59 98 cbi 0x0b, 1 ; 11
UCSRA |= (1<<U2X);
UBRRL= 0;
UBRRH= 0;
#else
UCSRA &= ~(1<<U2X);
UBRRL= 0;
dc: 19 b8 out 0x09, r1 ; 9
UBRRH= 0;
de: 10 bc out 0x20, r1 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 7
UCSRC = (1<<URSEL) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,无校验
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
#elif METHOD == 8
UCSRC = (1<<URSEL) | (2<<UPM0) | (1<<USBS) |(3<<UCSZ0); //9位数据位,2位停止位,偶校验
e0: 8e ea ldi r24, 0xAE ; 174
e2: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
e4: 8c e1 ldi r24, 0x1C ; 28
e6: 8a b9 out 0x0a, r24 ; 10
#endif
}
e8: 08 95 ret
000000ea <usart_transmit8>:
// 8位发送
void usart_transmit8(uint8 data)
{
ea: 5d 9b sbis 0x0b, 5 ; 11
ec: fe cf rjmp .-4 ; 0xea <usart_transmit8>
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UDR = data;
ee: 8c b9 out 0x0c, r24 ; 12
}
f0: 08 95 ret
000000f2 <usart_transmit9>:
// 9位发送
void usart_transmit9(uint16 data)
{
f2: 5d 9b sbis 0x0b, 5 ; 11
f4: fe cf rjmp .-4 ; 0xf2 <usart_transmit9>
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UCSRB &= ~(1<<TXB8); // 先清零
f6: 50 98 cbi 0x0a, 0 ; 10
if (data & 0x0100) // 第9位为1
f8: 90 fd sbrc r25, 0
UCSRB |= (1<<TXB8);
fa: 50 9a sbi 0x0a, 0 ; 10
UDR = data;
fc: 8c b9 out 0x0c, r24 ; 12
}
fe: 08 95 ret
00000100 <usart_sendstring>:
// 发送字符串
void usart_sendstring(uint8 *string)
{
100: fc 01 movw r30, r24
102: 04 c0 rjmp .+8 ; 0x10c <usart_sendstring+0xc>
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
104: 5d 9b sbis 0x0b, 5 ; 11
106: fe cf rjmp .-4 ; 0x104 <usart_sendstring+0x4>
// 发送字符串
void usart_sendstring(uint8 *string)
{
while (*string)
{
usart_transmit8(*string++);
108: 31 96 adiw r30, 0x01 ; 1
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UDR = data;
10a: 8c b9 out 0x0c, r24 ; 12
}
// 发送字符串
void usart_sendstring(uint8 *string)
{
while (*string)
10c: 80 81 ld r24, Z
10e: 88 23 and r24, r24
110: c9 f7 brne .-14 ; 0x104 <usart_sendstring+0x4>
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
112: 5d 9b sbis 0x0b, 5 ; 11
114: fe cf rjmp .-4 ; 0x112 <usart_sendstring+0x12>
;
UDR = data;
116: 8d e0 ldi r24, 0x0D ; 13
118: 8c b9 out 0x0c, r24 ; 12
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
11a: 5d 9b sbis 0x0b, 5 ; 11
11c: fe cf rjmp .-4 ; 0x11a <usart_sendstring+0x1a>
;
UDR = data;
11e: 8a e0 ldi r24, 0x0A ; 10
120: 8c b9 out 0x0c, r24 ; 12
{
usart_transmit8(*string++);
}
usart_transmit8(0x0d);
usart_transmit8(0x0a); // 最后发送回车换行
}
122: 08 95 ret
00000124 <usart_receive8>:
// 8位接收
uint8 usart_receive8(void)
{
124: 5f 9b sbis 0x0b, 7 ; 11
126: fe cf rjmp .-4 ; 0x124 <usart_receive8>
while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
128: 8c b1 in r24, 0x0c ; 12
}
12a: 08 95 ret
0000012c <usart_receive9>:
// 9位接收
uint16 usart_receive9(void)
{
12c: 5f 9b sbis 0x0b, 7 ; 11
12e: fe cf rjmp .-4 ; 0x12c <usart_receive9>
uint16 status,resulth,resultl;
while ( !(UCSRA & (1<<RXC)) )
;
status = UCSRA;
130: 8b b1 in r24, 0x0b ; 11
resulth = UCSRB;
132: 9a b1 in r25, 0x0a ; 10
resultl = UDR;
134: 4c b1 in r20, 0x0c ; 12
if ((uint8)status & ((1<<FE) | (1<<DOR) | (1<<PE)))
136: 8c 71 andi r24, 0x1C ; 28
138: 19 f0 breq .+6 ; 0x140 <usart_receive9+0x14>
13a: 2f ef ldi r18, 0xFF ; 255
13c: 3f ef ldi r19, 0xFF ; 255
13e: 0c c0 rjmp .+24 ; 0x158 <usart_receive9+0x2c>
return -1;
resulth = (resulth>>1) & 0x01;
140: 89 2f mov r24, r25
142: 90 e0 ldi r25, 0x00 ; 0
144: 96 95 lsr r25
146: 87 95 ror r24
return ((resulth<<8) | resultl);
148: 81 70 andi r24, 0x01 ; 1
14a: 90 70 andi r25, 0x00 ; 0
14c: 38 2f mov r19, r24
14e: 22 27 eor r18, r18
150: 84 2f mov r24, r20
152: 90 e0 ldi r25, 0x00 ; 0
154: 28 2b or r18, r24
156: 39 2b or r19, r25
158: c9 01 movw r24, r18
15a: 08 95 ret
0000015c <main>:
#include "M16_USART.h"
int main(void)
{
15c: 0e 94 64 00 call 0xc8 ; 0xc8 <usart_init_std>
uint16 tmp;
uint8 tmp1;
usart_init_std();
DDRA = 0xff;
160: 8f ef ldi r24, 0xFF ; 255
162: 8a bb out 0x1a, r24 ; 26
DDRB = 0xff;
164: 87 bb out 0x17, r24 ; 23
PORTB = 0x00;
166: 18 ba out 0x18, r1 ; 24
PORTA = 0x00;
168: 1b ba out 0x1b, r1 ; 27
tmp = usart_receive9();
16a: 0e 94 96 00 call 0x12c ; 0x12c <usart_receive9>
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
16e: 20 e0 ldi r18, 0x00 ; 0
170: 38 e4 ldi r19, 0x48 ; 72
tmp1 = tmp >>8;
while (1)
{
PORTA = (uint8)tmp;
172: 8b bb out 0x1b, r24 ; 27
PORTB = tmp1;
174: 98 bb out 0x18, r25 ; 24
176: f9 01 movw r30, r18
178: 31 97 sbiw r30, 0x01 ; 1
17a: f1 f7 brne .-4 ; 0x178 <main+0x1c>
_delay_ms(10);
PORTA = 0x00;
17c: 1b ba out 0x1b, r1 ; 27
PORTB = 0x00;
17e: 18 ba out 0x18, r1 ; 24
180: f8 cf rjmp .-16 ; 0x172 <main+0x16>
00000182 <__udivmodsi4>:
182: a1 e2 ldi r26, 0x21 ; 33
184: 1a 2e mov r1, r26
186: aa 1b sub r26, r26
188: bb 1b sub r27, r27
18a: fd 01 movw r30, r26
18c: 0d c0 rjmp .+26 ; 0x1a8 <__udivmodsi4_ep>
0000018e <__udivmodsi4_loop>:
18e: aa 1f adc r26, r26
190: bb 1f adc r27, r27
192: ee 1f adc r30, r30
194: ff 1f adc r31, r31
196: a2 17 cp r26, r18
198: b3 07 cpc r27, r19
19a: e4 07 cpc r30, r20
19c: f5 07 cpc r31, r21
19e: 20 f0 brcs .+8 ; 0x1a8 <__udivmodsi4_ep>
1a0: a2 1b sub r26, r18
1a2: b3 0b sbc r27, r19
1a4: e4 0b sbc r30, r20
1a6: f5 0b sbc r31, r21
000001a8 <__udivmodsi4_ep>:
1a8: 66 1f adc r22, r22
1aa: 77 1f adc r23, r23
1ac: 88 1f adc r24, r24
1ae: 99 1f adc r25, r25
1b0: 1a 94 dec r1
1b2: 69 f7 brne .-38 ; 0x18e <__udivmodsi4_loop>
1b4: 60 95 com r22
1b6: 70 95 com r23
1b8: 80 95 com r24
1ba: 90 95 com r25
1bc: 9b 01 movw r18, r22
1be: ac 01 movw r20, r24
1c0: bd 01 movw r22, r26
1c2: cf 01 movw r24, r30
1c4: 08 95 ret
000001c6 <_exit>:
1c6: f8 94 cli
000001c8 <__stop_program>:
1c8: ff cf rjmp .-2 ; 0x1c8 <__stop_program>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -