📄 uart0_drv.c
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "avr.h"
#include "UART0_drv.h"
/**********************************************************************/
/* These are the global variables */
/**********************************************************************/
//UART related buffers and variables
u08 UART0_RxBuf[UART0_RX_BUFFER_SIZE];
volatile u08 UART0_RxHead;
volatile u08 UART0_RxTail;
u08 UART0_TxBuf[UART0_TX_BUFFER_SIZE];
volatile u08 UART0_TxHead;
volatile u08 UART0_TxTail;
//--------------------------------------------------------------------------------------
void init_UART0( void )
{
// UBRR = BAUDRATE; /* set the baud rate */
UBRRL = LOBYT(F_CPU/16/BAUD-1);
UBRRH = HIBYT(F_CPU/16/BAUD-1);
/* enable UART receiver and transmitter, and
receive interrupt */
UCSRA = 0;
UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );
UCSRC = ( (1<<UCSZ1) | (1<<UCSZ0));
/* flush receive buffer */
UART0_RxTail = 0;
UART0_RxHead = 0;
UART0_TxTail = 0;
UART0_TxHead = 0;
}
//--------------------------------------------------------------------------------------
SIGNAL (SIG_USART_RECV)
{
unsigned char data;
unsigned char tmphead;
data = UDR; /* read the received data */
/* calculate buffer index */
tmphead = ( UART0_RxHead + 1 ) & UART0_RX_BUFFER_MASK;
UART0_RxHead = tmphead; /* store new index */
if ( tmphead == UART0_RxTail )
{
/* ERROR! Receive buffer overflow */
}
UART0_RxBuf[tmphead] = data; /* store received data in buffer */
}
//--------------------------------------------------------------------------------------
SIGNAL (SIG_USART_DATA)
{
unsigned char tmptail;
/* check if all data is transmitted */
if ( UART0_TxHead != UART0_TxTail )
{
/* calculate buffer index */
tmptail = ( UART0_TxTail + 1 ) & UART0_TX_BUFFER_MASK;
UART0_TxTail = tmptail; /* store new index */
UDR = UART0_TxBuf[tmptail]; /* start transmition */
}
else
{
UCSRB &= ~(1<<UDRIE); /* disable UDRE interrupt */
// UCSR0B |= (1<<TXCIE0); /* enable TXCIE interrupt */
}
}
//--------------------------------------------------------------------------------------
unsigned char UART0_ReceiveByte( void )
{
unsigned char tmptail;
while ( UART0_RxHead == UART0_RxTail ) /* wait for incomming data */
;
tmptail = ( UART0_RxTail + 1 ) & UART0_RX_BUFFER_MASK;/* calculate buffer index */
UART0_RxTail = tmptail; /* store new index */
return UART0_RxBuf[tmptail]; /* return data */
}
//--------------------------------------------------------------------------------------
void UART0_TransmitByte( unsigned char data )
{
unsigned char tmphead;
/* calculate buffer index */
tmphead = ( UART0_TxHead + 1 ) & UART0_TX_BUFFER_MASK;
/* wait for free space in buffer */
while ( tmphead == UART0_TxTail ) ;
UART0_TxBuf[tmphead] = data; /* store data in buffer */
UART0_TxHead = tmphead; /* store new index */
UCSRB |= (1<<UDRIE); /* enable UDRE interrupt */
}
unsigned char UART0_DataInReceiveBuffer( void )
{
return ( UART0_RxHead != UART0_RxTail );
/* return 0 (FALSE) if the receive buffer is empty */
}
//end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -