📄 uart.s90
字号:
//////////////////////////////////////////////////////////////////////////////
// /
// 14/Nov/2007 16:06:20 /
// IAR Atmel AVR C/C++ Compiler V4.12A/W32, Evaluation Version /
// Copyright 1996-2005 IAR Systems. All rights reserved. /
// /
// Source file = D:\Work\Devices\WindSensor\Software\uart.c /
// Command line = D:\Work\Devices\WindSensor\Software\uart.c --cpu=m8 /
// -ms -o D:\Work\Devices\WindSensor\Software\Debug\Obj\ /
// -lB D:\Work\Devices\WindSensor\Software\Debug\List\ /
// --initializers_in_flash --version1_calls -s2 --no_cse /
// --no_inline --no_code_motion --no_cross_call /
// --no_clustering --no_tbaa --debug /
// -DENABLE_BIT_DEFINITIONS -e -I "C:\Program Files\IAR /
// Systems\Embedded Workbench 4.0 Evaluation\avr\INC\" /
// -I "C:\Program Files\IAR Systems\Embedded Workbench /
// 4.0 Evaluation\avr\INC\CLIB\" --eeprom_size 512 /
// List file = D:\Work\Devices\WindSensor\Software\Debug\List\uart.s9 /
// 0 /
// /
// /
//////////////////////////////////////////////////////////////////////////////
NAME uart
RSEG CSTACK:DATA:NOROOT(0)
RSEG RSTACK:DATA:NOROOT(0)
EXTERN ?need_segment_init
PUBWEAK `?<Segment init: NEAR_Z>`
PUBWEAK `??USART_RX_Complete??INTVEC 22`
PUBWEAK `??USART_UDR_Empty??INTVEC 24`
PUBLIC USART_RX_Complete
PUBLIC USART_UDR_Empty
PUBWEAK _A_UBRRL
PUBWEAK _A_UCSRB
PUBWEAK _A_UDR
PUBWEAK __?EEARH
PUBWEAK __?EEARL
PUBWEAK __?EECR
PUBWEAK __?EEDR
PUBLIC g_receiveBuffer
PUBLIC g_transmitBuffer
PUBLIC serGetTransmitBufferEmpty
PUBLIC serGetTransmitBufferFull
PUBLIC serHasBytesBeenReceived
PUBLIC serInit
PUBLIC serReadByte
PUBLIC serWriteByte
PUBLIC serWriteFromSRAM
USART_RX_Complete SYMBOL "USART_RX_Complete"
`??USART_RX_Complete??INTVEC 22` SYMBOL "??INTVEC 22", USART_RX_Complete
USART_UDR_Empty SYMBOL "USART_UDR_Empty"
`??USART_UDR_Empty??INTVEC 24` SYMBOL "??INTVEC 24", USART_UDR_Empty
EXTERN buInitBuffer
EXTERN buWriteByte
EXTERN buIsBufferEmpty
EXTERN buReadByte
EXTERN buIsBufferFull
// D:\Work\Devices\WindSensor\Software\uart.c
// 1 /************************************************
// 2 uart.c - Routines for a buffered UART.
// 3 *************************************************/
// 4 #include <iom8.h>
ASEGN ABSOLUTE:DATA:NOROOT,029H
// union <unnamed> volatile __io _A_UBRRL
_A_UBRRL:
DS 1
ASEGN ABSOLUTE:DATA:NOROOT,02aH
// union <unnamed> volatile __io _A_UCSRB
_A_UCSRB:
DS 1
ASEGN ABSOLUTE:DATA:NOROOT,02cH
// union <unnamed> volatile __io _A_UDR
_A_UDR:
DS 1
// 5 #include "uart.h"
// 6 #include "buffer.h"
// 7
// 8 #define UART_BAUD_RATE 115200
// 9 #define UART_UBRR 3//((F_CPU / 16 / UART_BAUD_RATE)-1)
// 10
RSEG NEAR_Z:DATA:NOROOT(0)
REQUIRE `?<Segment init: NEAR_Z>`
// 11 bsCircBuffer g_receiveBuffer;
g_receiveBuffer:
DS 10
RSEG NEAR_Z:DATA:NOROOT(0)
REQUIRE `?<Segment init: NEAR_Z>`
// 12 bsCircBuffer g_transmitBuffer;
g_transmitBuffer:
DS 10
// 13
// 14 // serInit() - Initialises the serial port routines
RSEG CODE:CODE:NOROOT(1)
// 15 void serInit(void)
serInit:
// 16 { buInitBuffer(&g_receiveBuffer);
LDI R16, LOW(g_receiveBuffer)
LDI R17, (g_receiveBuffer) >> 8
RCALL buInitBuffer
// 17 buInitBuffer(&g_transmitBuffer);
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buInitBuffer
// 18 UCSRB = 0xD8;
LDI R16, 216
OUT 0x0A, R16
// 19 UBRRL = UART_UBRR;
LDI R16, 3
OUT 0x09, R16
// 20 }
RET
// 21 // ISR : RX - When a byte is received, throw it into the receive buffer.
// 22 #pragma vector = USART_RXC_vect
RSEG CODE:CODE:NOROOT(1)
// 23 __interrupt void USART_RX_Complete(void)
USART_RX_Complete:
// 24 { unsigned char nByte;
ST -Y, R25
ST -Y, R24
ST -Y, R31
ST -Y, R30
ST -Y, R3
ST -Y, R2
ST -Y, R1
ST -Y, R0
ST -Y, R23
ST -Y, R22
ST -Y, R21
ST -Y, R20
ST -Y, R19
ST -Y, R18
ST -Y, R17
ST -Y, R16
IN R25, 0x3F
// 25 nByte = UDR;
IN R16, 0x0C
MOV R24, R16
// 26 buWriteByte(&g_receiveBuffer, nByte);
MOV R20, R24
LDI R16, LOW(g_receiveBuffer)
LDI R17, (g_receiveBuffer) >> 8
RCALL buWriteByte
// 27 }
OUT 0x3F, R25
LD R16, Y+
LD R17, Y+
LD R18, Y+
LD R19, Y+
LD R20, Y+
LD R21, Y+
LD R22, Y+
LD R23, Y+
LD R0, Y+
LD R1, Y+
LD R2, Y+
LD R3, Y+
LD R30, Y+
LD R31, Y+
LD R24, Y+
LD R25, Y+
RETI
// 28 // ISR : TX - When the data buffer is empty, transmit a byte if possible, otherwise disable
// 29 // this interrupt.
// 30 #pragma vector = USART_UDRE_vect
RSEG CODE:CODE:NOROOT(1)
// 31 __interrupt void USART_UDR_Empty(void)
USART_UDR_Empty:
// 32 { if(!buIsBufferEmpty(&g_transmitBuffer))
ST -Y, R25
ST -Y, R24
ST -Y, R31
ST -Y, R30
ST -Y, R3
ST -Y, R2
ST -Y, R1
ST -Y, R0
ST -Y, R23
ST -Y, R22
ST -Y, R21
ST -Y, R20
ST -Y, R19
ST -Y, R18
ST -Y, R17
ST -Y, R16
IN R25, 0x3F
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buIsBufferEmpty
TST R16
BRNE ??USART_UDR_Empty_0
// 33 { unsigned char nData;
// 34 nData = buReadByte(&g_transmitBuffer);
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buReadByte
MOV R24, R16
// 35 UDR = nData;
OUT 0x0C, R24
RJMP ??USART_UDR_Empty_1
// 36 }
// 37 else UCSRB_Bit5 = 0;
??USART_UDR_Empty_0:
CBI 0x0A, 0x05
// 38 }
??USART_UDR_Empty_1:
OUT 0x3F, R25
LD R16, Y+
LD R17, Y+
LD R18, Y+
LD R19, Y+
LD R20, Y+
LD R21, Y+
LD R22, Y+
LD R23, Y+
LD R0, Y+
LD R1, Y+
LD R2, Y+
LD R3, Y+
LD R30, Y+
LD R31, Y+
LD R24, Y+
LD R25, Y+
RETI
// 39 // serHasBytesBeenReceived() - Returns whether or not bytes have been received.
// 40 // Returns:
// 41 // 0 - Input buffer empty
// 42 // else - Bytes are available
RSEG CODE:CODE:NOROOT(1)
// 43 unsigned char serHasBytesBeenReceived(void)
serHasBytesBeenReceived:
// 44 { return (buIsBufferEmpty(&g_receiveBuffer) ? 0 : 1);
LDI R16, LOW(g_receiveBuffer)
LDI R17, (g_receiveBuffer) >> 8
RCALL buIsBufferEmpty
TST R16
BREQ ??serHasBytesBeenReceived_0
LDI R16, 0
RET
??serHasBytesBeenReceived_0:
LDI R16, 1
RET
// 45 }
// 46 // serReadByte() - Returns a received byte from the buffer. Ensure that there
// 47 // is data in the buffer first by reading serGetBytesReceived() first.
// 48 // Returns:
// 49 // A byte from the receive buffer
RSEG CODE:CODE:NOROOT(1)
// 50 unsigned char serReadByte(void)
serReadByte:
// 51 { return buReadByte(&g_receiveBuffer);
LDI R16, LOW(g_receiveBuffer)
LDI R17, (g_receiveBuffer) >> 8
RCALL buReadByte
RET
// 52 }
// 53 // serWriteByte() - Puts a byte into the transmit buffer, and enable the transmit
// 54 // interrupt.
// 55 // Returns:
// 56 // The number of bytes written into the buffer.
RSEG CODE:CODE:NOROOT(1)
// 57 unsigned char serWriteByte(unsigned char nData)
serWriteByte:
// 58 { unsigned char nBytesInBuffer;
ST -Y, R25
ST -Y, R24
MOV R25, R16
// 59 if(buWriteByte(&g_transmitBuffer, nData) != 0) nBytesInBuffer = 0;
MOV R20, R25
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buWriteByte
TST R16
BREQ ??serWriteByte_0
LDI R24, 0
RJMP ??serWriteByte_1
// 60 else
// 61 { nBytesInBuffer = 1;
??serWriteByte_0:
LDI R24, 1
// 62 UCSRB_Bit5 = 1;
SBI 0x0A, 0x05
// 63 }
// 64 return nBytesInBuffer;
??serWriteByte_1:
MOV R16, R24
LD R24, Y+
LD R25, Y+
RET
// 65 }
// 66
// 67 // serGetTransmitBufferFull() - Indicates if the output buffer is full or not
// 68 // Returns:
// 69 // 0 - Transmit buffer is not full
// 70 // 1 - Transmit buffer is full
RSEG CODE:CODE:NOROOT(1)
// 71 unsigned char serGetTransmitBufferFull(void)
serGetTransmitBufferFull:
// 72 { return buIsBufferFull(&g_transmitBuffer);
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buIsBufferFull
RET
// 73 }
// 74 // serWriteFromSRAM() - Writes a string to the serial port from SRAM.
// 75 // pString - A pointer to SRAM
// 76 // nLength - The number of characters in the string
// 77 // Returns:
// 78 // The number of bytes written to the transmit buffer
RSEG CODE:CODE:NOROOT(1)
// 79 unsigned char serWriteFromSRAM(const unsigned char *pString, unsigned char nLength)
serWriteFromSRAM:
// 80 { unsigned char nBytesInBuffer;
ST -Y, R27
ST -Y, R26
ST -Y, R25
ST -Y, R24
MOVW R25:R24, R17:R16
MOV R26, R20
// 81 nBytesInBuffer = 0;
LDI R27, 0
// 82 for( ; nLength > 0; nLength--)
??serWriteFromSRAM_0:
CPI R26, 1
BRCS ??serWriteFromSRAM_1
// 83 { if(buWriteByte(&g_transmitBuffer, *pString) != 0) break;
MOVW R31:R30, R25:R24
LD R20, Z
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buWriteByte
TST R16
BRNE ??serWriteFromSRAM_1
// 84 nBytesInBuffer++;
INC R27
// 85 pString++;
ADIW R25:R24, 1
// 86 }
DEC R26
RJMP ??serWriteFromSRAM_0
// 87 UCSRB_Bit5 = 1;
??serWriteFromSRAM_1:
SBI 0x0A, 0x05
// 88 return nBytesInBuffer;
MOV R16, R27
LD R24, Y+
LD R25, Y+
LD R26, Y+
LD R27, Y+
RET
// 89 }
// 90 // serGetTransmitBufferEmpty() - Returns whether or not the transmit buffer
// 91 // is emtpy.
// 92 // Returns:
// 93 // 0 - Transmit buffer not empty
// 94 // else - Transmit buffer empty
RSEG CODE:CODE:NOROOT(1)
// 95 unsigned char serGetTransmitBufferEmpty(void)
serGetTransmitBufferEmpty:
// 96 { return buIsBufferEmpty(&g_transmitBuffer);
LDI R16, LOW(g_transmitBuffer)
LDI R17, (g_transmitBuffer) >> 8
RCALL buIsBufferEmpty
RET
// 97 }
ASEGN ABSOLUTE:DATA:NOROOT,01cH
__?EECR:
ASEGN ABSOLUTE:DATA:NOROOT,01dH
__?EEDR:
ASEGN ABSOLUTE:DATA:NOROOT,01eH
__?EEARL:
ASEGN ABSOLUTE:DATA:NOROOT,01fH
__?EEARH:
COMMON INTVEC:CODE:ROOT(1)
ORG 22
`??USART_RX_Complete??INTVEC 22`:
RJMP USART_RX_Complete
COMMON INTVEC:CODE:ROOT(1)
ORG 24
`??USART_UDR_Empty??INTVEC 24`:
RJMP USART_UDR_Empty
RSEG INITTAB:CODE:NOROOT(0)
`?<Segment init: NEAR_Z>`:
DW SFE(NEAR_Z) - SFB(NEAR_Z)
DW SFB(NEAR_Z)
DW 0
REQUIRE ?need_segment_init
END
//
// 3 bytes in segment ABSOLUTE
// 328 bytes in segment CODE
// 6 bytes in segment INITTAB
// 4 bytes in segment INTVEC
// 20 bytes in segment NEAR_Z
//
// 328 bytes of CODE memory (+ 10 bytes shared)
// 20 bytes of DATA memory (+ 3 bytes shared)
//
//Errors: none
//Warnings: none
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -