Atmega32单片机串口驱动程序

时间:2013-12-12来源:网络

/* ******************************************************************
* UartHdInit()
* 函数名:UartInit()
* 说明:
* 参数:baudrate ----- 波特率
* partity ------ 奇偶校验方式
* stops ------ 停止位数
* len -------- 数据帧长度
* 说明:此函数必须最先被调用
* ****************************************************************** */
void UartInit( void )
{
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr;
#endif
UartTxFifo.sem = OSSemCreate( UART_TX_LEN ); // 发送结构初始化
UartTxFifo.buf = UartTxBuf;
UartTxFifo.in = UartTxFifo.out = UartTxBuf;

UartRxFifo.sem = OSSemCreate( 0 ); // 接收结构初始化
UartRxFifo.buf = UartRxBuf;
UartRxFifo.in = UartRxFifo.out = UartRxBuf;


// 初始化串口,设置baudrate, len, parity, stops --
OS_ENTER_CRITICAL();
// UCSRA = 0xff;
UCSRB = 1RXCIE | 1RXEN | 1TXEN; // 收发使能,接收中断
UCSRC = 1URSEL| 1UPM1| 1UPM0| 1UCSZ1| 1UCSZ0; // 异步,8位字节,奇校验
UBRRL = ((INT32U)F_OSC / (16*(INT32U)UART_BAUD ) - 1 ) 0xff; // 设置波特率
UBRRH = ((INT32U)F_OSC / (16*(INT32U)UART_BAUD ) - 1 ) >> 8;
OS_EXIT_CRITICAL();
}

void UartTxIsr( void ) // 发送寄存器空中断
{
INT8U err, c;

c = UartGetTxChar( err );
if( err == UART_OK )
UDR = c; // 发送数据
}

void UartRxIsr( void ) // 发送寄存器空中断
{
INT8U err, c;

err = UCSRA;
c = UDR;
if( !(err ( DOR|PE|FE )) )
UartPutRxChar( c );
}
/* *****************************************************************
* UartPutRxChar()
* 函数名: UartPutRxChar()
* 参数:c ----- 要写入的字符
* 返回值:UART_OK --- 操作成功
* UART_BUF_FULL -- 失败,缓冲满
* 说明:此函数仅供中断系统调用
* ***************************************************************** */
static INT8U UartPutRxChar( INT8U c )
{
OSSemQuery( UartRxFifo.sem, SemData );
if( SemData.OSCnt UART_RX_LEN ) // 缓冲不满
{
*(UartRxFifo.in)++ = c;
if( UartRxFifo.in >= UartRxBuf + UART_RX_LEN )
UartRxFifo.in = UartRxBuf;
OSSemPost( UartRxFifo.sem ); // 向任务发送信号量

return UART_OK;
}
else
{
UartStopRx(); // 缓冲满,不再接收数据
return UART_BUF_FULL;
}
}

/* *****************************************************************
* UartGetTxChar()
* 函数名: UartGetTxChar()
* 参数:err ---- 错误参量
* 返回值:UART_OK
* UART_BUF_EMPTY --- 失败,缓冲空
* 说明:
* ***************************************************************** */
static INT8U UartGetTxChar( INT8U * err )
{
INT8U c;

c = 0;
OSSemQuery( UartTxFifo.sem, SemData );
if( SemData.OSCnt UART_TX_LEN ) // TX_LEN, 缓冲有数据可发送
{
c = *(UartTxFifo.out)++;
if( UartTxFifo.out >= UartTxBuf + UART_TX_LEN )
UartTxFifo.out = UartTxBuf;
OSSemPost( UartTxFifo.sem ); // 向任务发送信号量
*err = UART_OK;
}
else
{
UartStopTx(); // 缓冲空,不再使能发送中断
*err = UART_BUF_EMPTY;
}

return c;
}

1 2

关键词: Atmega32 串口驱动 ucos

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版