⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m16_usart.lss

📁 AVR单片机ATmega16的串口测试程序
💻 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 + -