#include "uart0.h"
#include "mcu.h"
/*
*************************************************************************************************************
*
* ATmega128 UART0 driver
*
* File : UART0.c
* By : hjjft
*************************************************************************************************************
*/
/////////////////////////////////////////////////
// uart0驱动 //
/////////////////////////////////////////////////
//静态全局变量
static unsigned char UART0_RxBuf[UART0_RX_BUFFER_SIZE];
static volatile unsigned char UART0_RxHead;
static volatile unsigned char UART0_RxTail;
static unsigned char UART0_TxBuf[UART0_TX_BUFFER_SIZE];
static volatile unsigned char UART0_TxHead;
static volatile unsigned char UART0_TxTail;
//串口初始化函数
void UART0_InitUART( unsigned long baudrate )
{
unsigned char x;
UBRR0H = (unsigned char)(CPU_CLK_FREQ/(16*baudrate) - 1) >>8; //设置波特率
UBRR0L = (unsigned char)(CPU_CLK_FREQ/(16*baudrate) - 1) & 0xFF;
UCSR0B = ( (1<<RXCIE0) | (1<<RXEN0) | (1<<TXEN0) ); //允许串口接收、发送和允许接收中断
UCSR0C = ( (1<<UCSZ01) | (1<<UCSZ00) ); //1位停止位,8位数据位
x = 0; //初始化数据缓存
UART0_RxTail = x;
UART0_RxHead = x;
UART0_TxTail = x;
UART0_TxHead = x;
}
//串行接收中断处理函数
void UART0_RX_interrupt( void )
//biml注意中断函数的表示方法
{
unsigned char data;
unsigned char tmphead;
data = UDR0; //读接收数据
//biml 以字节的方式读取串口缓冲区的数据
tmphead = ( UART0_RxHead + 1 ) & UART0_RX_BUFFER_MASK; //计算缓存索引
//应用程序的缓冲区可以理解成一个循环链表结构
UART0_RxHead = tmphead; //保存新的缓存索引
if ( tmphead == UART0_RxTail )
{
//这里加入缓存溢出处理
}
UART0_RxBuf[tmphead] = data; //把接收数据保存到接收缓存
}
//串行发送中断处理函数
void UART0_TX_interrupt( void )
{
unsigned char tmptail;
if ( UART0_TxHead != UART0_TxTail ) //检查是否发送缓存里的所以数据都已经发送完毕
{
tmptail = ( UART0_TxTail + 1 ) & UART0_TX_BUFFER_MASK; //计算缓存索引
UART0_TxTail = tmptail; //保存新的缓存索引
UDR0 = UART0_TxBuf[tmptail]; //开始发送
}
else
{
UCSR0B &= ~(1<<UDRIE0); //关UDRE中断
}
}
//从接收缓存里接收一个字节
unsigned char UART0_ReceiveByte( void )
{
unsigned char tmptail;
while ( UART0_RxHead == UART0_RxTail ); //等待接收数据
tmptail = ( UART0_RxTail + 1 ) & UART0_RX_BUFFER_MASK; //计算缓存索引
UART0_RxTail = tmptail; //保存新的缓存索引
return UART0_RxBuf[tmptail];
}
//将一个字节放入发送缓存
void UART0_TransmitByte( unsigned char data )
{
unsigned char tmphead;
tmphead = ( UART0_TxHead + 1 ) & UART0_TX_BUFFER_MASK; //计算缓存索引
while ( tmphead == UART0_TxTail ); //等待有空地缓存空间
UART0_TxBuf[tmphead] = data; //保存数据到缓存
UART0_TxHead = tmphead; //保存新的缓存索引
UCSR0B |= (1<<UDRIE0); //开 UDRE 中断
}
void UART0_Transmitconstr(const unsigned char *str) //发送一个const字符串(发送非const字符串会出错)
{
unsigned char i;
unsigned char max = str_length(str);
for(i = 0; i < max; i++)
{
UART0_TransmitByte(str[i]);
}
}
void UART0_Transmitstr(unsigned char *str) //发送一个字符串
{
unsigned char i;
unsigned char max = strlen(str);
for(i = 0; i < max; i++)
{
UART0_TransmitByte(str[i]);
}
}
//判断接收缓存是否为空
unsigned char UART0_DataInReceiveBuffer( void )
{
return ( UART0_RxHead != UART0_RxTail ); //返回0表示接收缓存已空
}