📄 usart.c
字号:
/****************************************Copyright (c)**************************************************
**
** JiangXing Auto
**
**
**--------------File Info-------------------------------------------------------------------------------
** File name: usart.c
** Last modified Date:
** Last Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Created by:
** Created date:
** Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include <includes.h>
/* UART Buffer Defines */
#define USART_RX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */
#define USART_TX_BUFFER_SIZE 128 /* 2,4,8,16,32,64,128 or 256 bytes */
#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
#define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
#if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
#error RX buffer size is not a power of 2
#endif
#if ( USART_TX_BUFFER_SIZE & USART_TX_BUFFER_MASK )
#error TX buffer size is not a power of 2
#endif
/* Static Variables */
static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
static unsigned char USART_RxHead;
static unsigned char USART_RxTail;
static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];
static unsigned char USART_TxHead;
static unsigned char USART_TxTail;
static INT8U tmr_count;
/********************************************************************************
* 函数名称: putchar
* 功 能:
* 入口参数:
* 出口参数:
* 调用模块:
*
* 全局变量:
*
*--------------------------------------------------------------------------------
* 设计者:
* 日 期:
* 说 明:
********************************************************************************/
int putchar(int c)
{
USART0_Transmit(c);
return c;
}
/* Initialize USART */
void USART0_Init( unsigned int baudrate )
{
unsigned char x;
/* Set the baud rate */
UBRR0H = (unsigned char) (baudrate>>8);
UBRR0L = (unsigned char) baudrate;
/* Enable UART receiver and transmitter */
UCSR0B = ( ( 1 << RXCIE0 ) | ( 1 << RXEN0 ) | ( 1 << TXEN0 ) );
/* Set frame format: 8 data 1 stop */
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); //For devices with Extended IO
//UCSR0C = (1<<URSEL)|(1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00); //For devices without Extended IO
/* Flush receive buffer */
x = 0;
USART_RxTail = x;
USART_RxHead = x;
USART_TxTail = x;
USART_TxHead = x;
/* Timer2 Initialization */
TCCR2 = 0x0D; /* CTC mode, CPU_CLK / 1024 */
TCNT2 = 0;
OCR2 = 216; /* (freq = 110592 / 1024 / 216) */
TIFR |= (1 << 7); /* Clear Interrupt flag */
tmr_count = 0;
_SEI();
}
/* Interrupt handlers */
#pragma vector=USART0_RXC_vect
__interrupt void USART0_RX_interrupt( void )
{
unsigned char data;
unsigned char tmphead;
/* Read the received data */
data = UDR0;
/* Calculate buffer index */
tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;
USART_RxHead = tmphead; /* Store new index */
if ( tmphead == USART_RxTail )
{
/* ERROR! Receive buffer overflow */
}
USART_RxBuf[tmphead] = data; /* Store received data in buffer */
TCNT2 = 0; /* Clear Timer2 Count */
TIFR |= (1 << 7); /* Clear Interrupt flag */
TIMSK_OCIE2 = 1; /* Enable Comp interrupt */
tmr_count = 0;
}
#pragma vector=USART0_UDRE_vect
__interrupt void USART0_TX_interrupt( void )
{
unsigned char tmptail;
/* Check if all data is transmitted */
if ( USART_TxHead != USART_TxTail )
{
/* Calculate buffer index */
tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;
USART_TxTail = tmptail; /* Store new index */
UDR0 = USART_TxBuf[tmptail]; /* Start transmition */
}
else
{
UCSR0B &= ~(1<<UDRIE0); /* Disable UDRE interrupt */
}
}
/* Read and write functions */
unsigned char USART0_Receive( void )
{
unsigned char tmptail;
while ( USART_RxHead == USART_RxTail ) /* Wait for incomming data */
;
tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK;/* Calculate buffer index */
USART_RxTail = tmptail; /* Store new index */
return USART_RxBuf[tmptail]; /* Return data */
}
/********************************************************************************
* 函数名称:
* 功 能:
* 入口参数:
* 出口参数:
* 调用模块:
*
* 全局变量:
*
*--------------------------------------------------------------------------------
* 设计者:
* 日 期:
* 说 明:
********************************************************************************/
void USART0_Transmit( unsigned char data )
{
unsigned char tmphead;
/* Calculate buffer index */
tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /* Wait for free space in buffer */
while ( tmphead == USART_TxTail );
USART_TxBuf[tmphead] = data; /* Store data in buffer */
USART_TxHead = tmphead; /* Store new index */
UCSR0B |= (1<<UDRIE0); /* Enable UDRE interrupt */
}
/********************************************************************************
* 函数名称:
* 功 能:
* 入口参数:
* 出口参数:
* 调用模块:
*
* 全局变量:
*
*--------------------------------------------------------------------------------
* 设计者:
* 日 期:
* 说 明:
********************************************************************************/
unsigned char DataInReceiveBuffer( void )
{
return ( USART_RxHead != USART_RxTail ); /* Return 0 (FALSE) if the receive buffer is empty */
}
/********************************************************************************
* 函数名称:
* 功 能:
* 入口参数:
* 出口参数:
* 调用模块:
*
* 全局变量:
*
*--------------------------------------------------------------------------------
* 设计者:
* 日 期:
* 说 明:
********************************************************************************/
#pragma vector = TIMER2_COMP_vect
__interrupt void Timer2Comp_ISR( void )
{
INT8U err;
OS_FLAGS flag;
if( tmr_count++ >= 5 ) {
TIMSK_OCIE2 = 0; /* Disable Comp interrupt */
tmr_count = 0;
flag = 1;
OSFlagPost(G_Task_Flag, flag, OS_FLAG_SET, &err);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -