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

📄 uart.lst

📁 AVRGCC编写的很好用的串口通讯源程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"uart.c"
   2               		.arch atmega16
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
  81               	.global	__vector_11
  83               	__vector_11:
   1:uart.c        **** 
   2:uart.c        **** #include <stdio.h>
   3:uart.c        **** 
   4:uart.c        **** #include <avr/io.h>
   5:uart.c        **** #include <avr/interrupt.h>
   6:uart.c        **** #include <avr/signal.h>
   7:uart.c        **** #include <avrx/avrx.h>
   8:uart.c        **** 
   9:uart.c        **** #include "hardware.h"
  10:uart.c        **** #include "uart.h"
  11:uart.c        **** 
  12:uart.c        **** // USART Receiver buffer
  13:uart.c        **** uint8_t rx_buffer[RX_BUFFER_SIZE];
  14:uart.c        **** uint8_t volatile rx_wr, rx_count;
  15:uart.c        **** uint8_t rx_rd;
  16:uart.c        **** Mutex rx_rdy;
  17:uart.c        **** // This flag is set on USART Receiver buffer overflow
  18:uart.c        **** uint8_t rx_buffer_overflow;
  19:uart.c        **** 
  20:uart.c        **** // USART Transmitter buffer
  21:uart.c        **** uint8_t tx_buffer[TX_BUFFER_SIZE];
  22:uart.c        **** uint8_t tx_wr;
  23:uart.c        **** uint8_t volatile tx_rd, tx_count;
  24:uart.c        **** Mutex tx_rdy;
  25:uart.c        **** 
  26:uart.c        **** // USART Receiver interrupt service routine
  27:uart.c        **** AVRX_SIGINT(SIG_UART_RECV)
  28:uart.c        **** {
  85               	.LM1:
  86               	/* prologue: frame size=0 */
  87               	/* prologue: naked */
  88               	/* prologue end (size=0) */
  29:uart.c        **** 	uint8_t status, data;
  30:uart.c        **** 	
  31:uart.c        **** 	IntProlog();
  90               	.LM2:
  91 0000 0E94 0000 		call IntProlog
  32:uart.c        **** 	status = UCSRA;
  93               	.LM3:
  94 0004 8BB1      		in r24,43-0x20
  33:uart.c        **** 	data = UDR;
  96               	.LM4:
  97 0006 2CB1      		in r18,44-0x20
  34:uart.c        **** 	if ((status & (_BV(FE) | _BV(PE) | _BV(DOR))) == 0)
  99               	.LM5:
 100 0008 9927      		clr r25
 101 000a 8C71      		andi r24,lo8(28)
 102 000c 9070      		andi r25,hi8(28)
 103 000e 892B      		or r24,r25
 104 0010 29F5      		brne .L2
  35:uart.c        **** 	{
  36:uart.c        **** 		rx_buffer[rx_wr] = data;
 106               	.LM6:
 107 0012 8091 0000 		lds r24,rx_wr
 108 0016 E82F      		mov r30,r24
 109 0018 FF27      		clr r31
 110 001a E050      		subi r30,lo8(-(rx_buffer))
 111 001c F040      		sbci r31,hi8(-(rx_buffer))
 112 001e 2083      		st Z,r18
  37:uart.c        **** 		
  38:uart.c        **** 		if (++rx_wr == RX_BUFFER_SIZE)
 114               	.LM7:
 115 0020 8091 0000 		lds r24,rx_wr
 116 0024 8F5F      		subi r24,lo8(-(1))
 117 0026 8093 0000 		sts rx_wr,r24
 118 002a 8091 0000 		lds r24,rx_wr
 119 002e 8233      		cpi r24,lo8(50)
 120 0030 11F4      		brne .L3
  39:uart.c        **** 		{
  40:uart.c        **** 			rx_wr = 0;
 122               	.LM8:
 123 0032 1092 0000 		sts rx_wr,__zero_reg__
 124               	.L3:
  41:uart.c        **** 		}
  42:uart.c        **** 		if (++rx_count == RX_BUFFER_SIZE)
 126               	.LM9:
 127 0036 8091 0000 		lds r24,rx_count
 128 003a 8F5F      		subi r24,lo8(-(1))
 129 003c 8093 0000 		sts rx_count,r24
 130 0040 8091 0000 		lds r24,rx_count
 131 0044 8233      		cpi r24,lo8(50)
 132 0046 31F4      		brne .L4
  43:uart.c        **** 		{
  44:uart.c        **** 			rx_count = 0;
 134               	.LM10:
 135 0048 1092 0000 		sts rx_count,__zero_reg__
  45:uart.c        **** 			rx_buffer_overflow = 1;
 137               	.LM11:
 138 004c 81E0      		ldi r24,lo8(1)
 139 004e 8093 0000 		sts rx_buffer_overflow,r24
 140 0052 04C0      		rjmp .L2
 141               	.L4:
  46:uart.c        **** 		}
  47:uart.c        **** 		else
  48:uart.c        **** 		{
  49:uart.c        **** 			AvrXIntSetSemaphore(&rx_rdy);
 143               	.LM12:
 144 0054 80E0      		ldi r24,lo8(rx_rdy)
 145 0056 90E0      		ldi r25,hi8(rx_rdy)
 146 0058 0E94 0000 		call AvrXIntSetSemaphore
 147               	.L2:
  50:uart.c        **** 		}
  51:uart.c        **** 	}
  52:uart.c        **** 	Epilog();
 149               	.LM13:
 150 005c 0E94 0000 		call Epilog
 151               	/* epilogue: frame size=0 */
 152               	/* epilogue: naked */
 153               	/* epilogue end (size=0) */
 154               	/* function __vector_11 size 48 (48) */
 160               	.Lscope0:
 162               	.global	__vector_13
 164               	__vector_13:
  53:uart.c        **** }
  54:uart.c        **** 
  55:uart.c        **** // USART Transmitter interrupt service routine
  56:uart.c        **** AVRX_SIGINT(SIG_UART_TRANS)
  57:uart.c        **** {
 166               	.LM14:
 167               	/* prologue: frame size=0 */
 168               	/* prologue: naked */
 169               	/* prologue end (size=0) */
  58:uart.c        **** 	IntProlog();
 171               	.LM15:
 172 0060 0E94 0000 		call IntProlog
  59:uart.c        **** 	if (tx_count)
 174               	.LM16:
 175 0064 8091 0000 		lds r24,tx_count
 176 0068 8823      		tst r24
 177 006a E1F0      		breq .L7
  60:uart.c        **** 	{
  61:uart.c        **** 		UDR = tx_buffer[tx_rd];
 179               	.LM17:
 180 006c 8091 0000 		lds r24,tx_rd
 181 0070 E82F      		mov r30,r24
 182 0072 FF27      		clr r31
 183 0074 E050      		subi r30,lo8(-(tx_buffer))
 184 0076 F040      		sbci r31,hi8(-(tx_buffer))
 185 0078 8081      		ld r24,Z
 186 007a 8CB9      		out 44-0x20,r24
  62:uart.c        **** 		if (++tx_rd == TX_BUFFER_SIZE) tx_rd = 0;
 188               	.LM18:
 189 007c 8091 0000 		lds r24,tx_rd
 190 0080 8F5F      		subi r24,lo8(-(1))
 191 0082 8093 0000 		sts tx_rd,r24
 192 0086 8091 0000 		lds r24,tx_rd
 193 008a 8233      		cpi r24,lo8(50)
 194 008c 11F4      		brne .L8
 195 008e 1092 0000 		sts tx_rd,__zero_reg__
 196               	.L8:
  63:uart.c        **** 		--tx_count;
 198               	.LM19:
 199 0092 8091 0000 		lds r24,tx_count
 200 0096 8150      		subi r24,lo8(-(-1))
 201 0098 8093 0000 		sts tx_count,r24
  64:uart.c        **** 		AvrXIntSetSemaphore(&tx_rdy);
 203               	.LM20:
 204 009c 80E0      		ldi r24,lo8(tx_rdy)
 205 009e 90E0      		ldi r25,hi8(tx_rdy)
 206 00a0 0E94 0000 		call AvrXIntSetSemaphore
 207               	.L7:
  65:uart.c        **** 	}
  66:uart.c        **** 	Epilog();
 209               	.LM21:
 210 00a4 0E94 0000 		call Epilog
 211               	/* epilogue: frame size=0 */
 212               	/* epilogue: naked */
 213               	/* epilogue end (size=0) */
 214               	/* function __vector_13 size 36 (36) */
 216               	.Lscope1:
 218               	.global	UartGetc
 220               	UartGetc:
  67:uart.c        **** }
  68:uart.c        **** 
  69:uart.c        **** int
  70:uart.c        **** UartGetc(void)
  71:uart.c        **** {
 222               	.LM22:
 223               	/* prologue: frame size=0 */
 224 00a8 CF93      		push r28
 225               	/* prologue end (size=1) */
  72:uart.c        **** 	uint8_t data;
  73:uart.c        **** 	
  74:uart.c        **** 	if (0 == rx_count)
 227               	.LM23:
 228 00aa 8091 0000 		lds r24,rx_count
 229 00ae 8823      		tst r24
 230 00b0 21F4      		brne .L10
  75:uart.c        **** 	{
  76:uart.c        **** 		AvrXWaitSemaphore(&rx_rdy);
 232               	.LM24:
 233 00b2 80E0      		ldi r24,lo8(rx_rdy)
 234 00b4 90E0      		ldi r25,hi8(rx_rdy)
 235 00b6 0E94 0000 		call AvrXWaitSemaphore
 236               	.L10:
  77:uart.c        **** 	}
  78:uart.c        **** 	data = rx_buffer[rx_rd];
 238               	.LM25:
 239 00ba 8091 0000 		lds r24,rx_rd
 240 00be E82F      		mov r30,r24
 241 00c0 FF27      		clr r31
 242 00c2 E050      		subi r30,lo8(-(rx_buffer))
 243 00c4 F040      		sbci r31,hi8(-(rx_buffer))
 244 00c6 C081      		ld r28,Z
  79:uart.c        **** 	if (++rx_rd == RX_BUFFER_SIZE)
 246               	.LM26:
 247 00c8 8F5F      		subi r24,lo8(-(1))
 248 00ca 8093 0000 		sts rx_rd,r24
 249 00ce 8233      		cpi r24,lo8(50)
 250 00d0 11F4      		brne .L11
  80:uart.c        **** 	{
  81:uart.c        **** 		rx_rd = 0;
 252               	.LM27:
 253 00d2 1092 0000 		sts rx_rd,__zero_reg__
 254               	.L11:
  82:uart.c        **** 	}
  83:uart.c        **** 	BeginCritical();
 256               	.LM28:
 257               	/* #APP */
 258 00d6 F894      		cli
 259               	
  84:uart.c        **** 	if (0 == --rx_count)
 261               	.LM29:
 262               	/* #NOAPP */
 263 00d8 8091 0000 		lds r24,rx_count
 264 00dc 8150      		subi r24,lo8(-(-1))
 265 00de 8093 0000 		sts rx_count,r24
 266 00e2 8091 0000 		lds r24,rx_count
 267 00e6 8823      		tst r24
 268 00e8 21F4      		brne .L12
  85:uart.c        **** 	{
  86:uart.c        **** 		AvrXResetSemaphore(&rx_rdy);
 270               	.LM30:
 271 00ea 80E0      		ldi r24,lo8(rx_rdy)
 272 00ec 90E0      		ldi r25,hi8(rx_rdy)
 273 00ee 0E94 0000 		call AvrXResetSemaphore
 274               	.L12:
  87:uart.c        **** 	}
  88:uart.c        **** 	EndCritical();
 276               	.LM31:
 277               	/* #APP */
 278 00f2 7894      		sei
 279               	
  89:uart.c        **** 	
  90:uart.c        **** 	return data;
  91:uart.c        **** }
 281               	.LM32:
 282               	/* #NOAPP */
 283 00f4 8C2F      		mov r24,r28
 284 00f6 9927      		clr r25
 285               	/* epilogue: frame size=0 */
 286 00f8 CF91      		pop r28
 287 00fa 0895      		ret
 288               	/* epilogue end (size=2) */
 289               	/* function UartGetc size 48 (45) */
 294               	.Lscope2:
 297               	.global	UartPutc
 299               	UartPutc:
  92:uart.c        **** 
  93:uart.c        **** int
  94:uart.c        **** UartPutc(char c)
  95:uart.c        **** {
 301               	.LM33:
 302               	/* prologue: frame size=0 */
 303 00fc CF93      		push r28
 304               	/* prologue end (size=1) */
 305 00fe C82F      		mov r28,r24
  96:uart.c        **** 	if (tx_count == TX_BUFFER_SIZE)
 307               	.LM34:
 308 0100 8091 0000 		lds r24,tx_count

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -