📄 m16_usart.lss
字号:
M16_USART.elf: file format elf32-avr
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 000001c2 00000000 00000000 00000054 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .debug_aranges 00000040 00000000 00000000 00000216 2**0
CONTENTS, READONLY, DEBUGGING
2 .debug_pubnames 000000c6 00000000 00000000 00000256 2**0
CONTENTS, READONLY, DEBUGGING
3 .debug_info 000002cf 00000000 00000000 0000031c 2**0
CONTENTS, READONLY, DEBUGGING
4 .debug_abbrev 000001c1 00000000 00000000 000005eb 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_line 00000335 00000000 00000000 000007ac 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_frame 000000b0 00000000 00000000 00000ae4 2**2
CONTENTS, READONLY, DEBUGGING
7 .debug_str 00000155 00000000 00000000 00000b94 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_loc 00000056 00000000 00000000 00000ce9 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_ranges 00000060 00000000 00000000 00000d3f 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: e2 ec ldi r30, 0xC2 ; 194
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 af 00 call 0x15e ; 0x15e <main>
8a: 0c 94 df 00 jmp 0x1be ; 0x1be <_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 bd 00 call 0x17a ; 0x17a <__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
UBRRH= 0;
UBRRL= 0x0B; // 些处添加 38400
#else
UCSRA &= ~(1<<U2X);
UBRRH= 0;
dc: 10 bc out 0x20, r1 ; 32
UBRRL= 0x0B;
de: 8b e0 ldi r24, 0x0B ; 11
e0: 89 b9 out 0x09, r24 ; 9
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位停止位,偶校验
e2: 8e ea ldi r24, 0xAE ; 174
e4: 80 bd out 0x20, r24 ; 32
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<UCSZ2); // 使能发送接收
e6: 8c e1 ldi r24, 0x1C ; 28
e8: 8a b9 out 0x0a, r24 ; 10
#endif
}
ea: 08 95 ret
000000ec <usart_transmit8>:
// 8位发送
void usart_transmit8(uint8 data)
{
ec: 5d 9b sbis 0x0b, 5 ; 11
ee: fe cf rjmp .-4 ; 0xec <usart_transmit8>
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UDR = data;
f0: 8c b9 out 0x0c, r24 ; 12
}
f2: 08 95 ret
000000f4 <usart_transmit9>:
// 9位发送
void usart_transmit9(uint16 data)
{
f4: 5d 9b sbis 0x0b, 5 ; 11
f6: fe cf rjmp .-4 ; 0xf4 <usart_transmit9>
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UCSRB &= ~(1<<TXB8); // 先清零
f8: 50 98 cbi 0x0a, 0 ; 10
if (data & 0x0100) // 第9位为1
fa: 90 fd sbrc r25, 0
UCSRB |= (1<<TXB8);
fc: 50 9a sbi 0x0a, 0 ; 10
UDR = data;
fe: 8c b9 out 0x0c, r24 ; 12
}
100: 08 95 ret
00000102 <usart_sendstring>:
// 发送字符串
void usart_sendstring(uint8 *string)
{
102: fc 01 movw r30, r24
104: 04 c0 rjmp .+8 ; 0x10e <usart_sendstring+0xc>
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
106: 5d 9b sbis 0x0b, 5 ; 11
108: fe cf rjmp .-4 ; 0x106 <usart_sendstring+0x4>
// 发送字符串
void usart_sendstring(uint8 *string)
{
while (*string)
{
usart_transmit8(*string++);
10a: 31 96 adiw r30, 0x01 ; 1
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
;
UDR = data;
10c: 8c b9 out 0x0c, r24 ; 12
}
// 发送字符串
void usart_sendstring(uint8 *string)
{
while (*string)
10e: 80 81 ld r24, Z
110: 88 23 and r24, r24
112: c9 f7 brne .-14 ; 0x106 <usart_sendstring+0x4>
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
114: 5d 9b sbis 0x0b, 5 ; 11
116: fe cf rjmp .-4 ; 0x114 <usart_sendstring+0x12>
;
UDR = data;
118: 8d e0 ldi r24, 0x0D ; 13
11a: 8c b9 out 0x0c, r24 ; 12
}
// 8位发送
void usart_transmit8(uint8 data)
{
while ( !(UCSRA & (1<<UDRE)) ) // 不为空,等之
11c: 5d 9b sbis 0x0b, 5 ; 11
11e: fe cf rjmp .-4 ; 0x11c <usart_sendstring+0x1a>
;
UDR = data;
120: 8a e0 ldi r24, 0x0A ; 10
122: 8c b9 out 0x0c, r24 ; 12
{
usart_transmit8(*string++);
}
usart_transmit8(0x0d);
usart_transmit8(0x0a); // 最后发送回车换行
}
124: 08 95 ret
00000126 <usart_receive8>:
// 8位接收
uint8 usart_receive8(void)
{
126: 5f 9b sbis 0x0b, 7 ; 11
128: fe cf rjmp .-4 ; 0x126 <usart_receive8>
while ( !(UCSRA & (1<<RXC)) )
;
return UDR;
12a: 8c b1 in r24, 0x0c ; 12
}
12c: 08 95 ret
0000012e <usart_receive9>:
// 9位接收
uint16 usart_receive9(void)
{
12e: 5f 9b sbis 0x0b, 7 ; 11
130: fe cf rjmp .-4 ; 0x12e <usart_receive9>
uint16 status,resulth,resultl;
while ( !(UCSRA & (1<<RXC)) )
;
status = UCSRA;
132: 8b b1 in r24, 0x0b ; 11
resulth = UCSRB;
134: 9a b1 in r25, 0x0a ; 10
resultl = UDR;
136: 4c b1 in r20, 0x0c ; 12
if ((uint8)status & ((1<<FE) | (1<<DOR) | (1<<PE))) // 如果出现某些错误
138: 8c 71 andi r24, 0x1C ; 28
13a: 19 f0 breq .+6 ; 0x142 <usart_receive9+0x14>
13c: 2f ef ldi r18, 0xFF ; 255
13e: 3f ef ldi r19, 0xFF ; 255
140: 0c c0 rjmp .+24 ; 0x15a <usart_receive9+0x2c>
return -1;
resulth = (resulth>>1) & 0x01;
142: 89 2f mov r24, r25
144: 90 e0 ldi r25, 0x00 ; 0
146: 96 95 lsr r25
148: 87 95 ror r24
return ((resulth<<8) | resultl);
14a: 81 70 andi r24, 0x01 ; 1
14c: 90 70 andi r25, 0x00 ; 0
14e: 38 2f mov r19, r24
150: 22 27 eor r18, r18
152: 84 2f mov r24, r20
154: 90 e0 ldi r25, 0x00 ; 0
156: 28 2b or r18, r24
158: 39 2b or r19, r25
15a: c9 01 movw r24, r18
15c: 08 95 ret
0000015e <main>:
#include "M16_USART.h"
int main(void)
{
15e: cf 93 push r28
160: df 93 push r29
usart_init_std();
162: 0e 94 64 00 call 0xc8 ; 0xc8 <usart_init_std>
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
166: c0 e0 ldi r28, 0x00 ; 0
168: d8 e4 ldi r29, 0x48 ; 72
while(1)
{
usart_transmit9(0x3333);
16a: 83 e3 ldi r24, 0x33 ; 51
16c: 93 e3 ldi r25, 0x33 ; 51
16e: 0e 94 7a 00 call 0xf4 ; 0xf4 <usart_transmit9>
172: ce 01 movw r24, r28
174: 01 97 sbiw r24, 0x01 ; 1
176: f1 f7 brne .-4 ; 0x174 <main+0x16>
178: f8 cf rjmp .-16 ; 0x16a <main+0xc>
0000017a <__udivmodsi4>:
17a: a1 e2 ldi r26, 0x21 ; 33
17c: 1a 2e mov r1, r26
17e: aa 1b sub r26, r26
180: bb 1b sub r27, r27
182: fd 01 movw r30, r26
184: 0d c0 rjmp .+26 ; 0x1a0 <__udivmodsi4_ep>
00000186 <__udivmodsi4_loop>:
186: aa 1f adc r26, r26
188: bb 1f adc r27, r27
18a: ee 1f adc r30, r30
18c: ff 1f adc r31, r31
18e: a2 17 cp r26, r18
190: b3 07 cpc r27, r19
192: e4 07 cpc r30, r20
194: f5 07 cpc r31, r21
196: 20 f0 brcs .+8 ; 0x1a0 <__udivmodsi4_ep>
198: a2 1b sub r26, r18
19a: b3 0b sbc r27, r19
19c: e4 0b sbc r30, r20
19e: f5 0b sbc r31, r21
000001a0 <__udivmodsi4_ep>:
1a0: 66 1f adc r22, r22
1a2: 77 1f adc r23, r23
1a4: 88 1f adc r24, r24
1a6: 99 1f adc r25, r25
1a8: 1a 94 dec r1
1aa: 69 f7 brne .-38 ; 0x186 <__udivmodsi4_loop>
1ac: 60 95 com r22
1ae: 70 95 com r23
1b0: 80 95 com r24
1b2: 90 95 com r25
1b4: 9b 01 movw r18, r22
1b6: ac 01 movw r20, r24
1b8: bd 01 movw r22, r26
1ba: cf 01 movw r24, r30
1bc: 08 95 ret
000001be <_exit>:
1be: f8 94 cli
000001c0 <__stop_program>:
1c0: ff cf rjmp .-2 ; 0x1c0 <__stop_program>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -