• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > Atmega32單片機串口驅(qū)動程序

    Atmega32單片機串口驅(qū)動程序

    作者: 時間:2013-12-12 來源:網(wǎng)絡(luò) 收藏

    /* ******************************************************************
    * Filename: uart.c
    * Author: lstzixing
    * Mail: blievethink@gmail.com
    * Date: 2009-5-26
    * Description: 串口數(shù)據(jù)收發(fā)接口. For
    * ****************************************************************** */

    #include "app.h"

    // 對發(fā)送緩沖,信號計數(shù)為空閑字符數(shù)
    // 對接收緩沖,計數(shù)為緩沖已有計數(shù)
    typedef struct _FIFO
    {
    INT8U * buf; // FIFO緩沖區(qū)
    INT8U * in, * out; // FIFO讀寫指針
    OS_EVENT * sem; // FIFO讀寫同步信號量
    }FIFO;

    static INT8U UartTxBuf[ UART_TX_LEN ]; // 發(fā)送緩沖
    static INT8U UartRxBuf[ UART_RX_LEN ]; // 接收緩沖
    static FIFO UartTxFifo, UartRxFifo; // 收發(fā)緩沖控制FIFO結(jié)構(gòu)

    OS_SEM_DATA SemData;

    static INT8U UartPutRxChar( INT8U c );
    static INT8U UartGetTxChar( INT8U * err );

    #define UartStartTx() { UCSRB |= 1UDRIE; }
    #define UartStopTx() { UCSRB = ~(1UDRIE); }
    #define UartStartRx() { UCSRB |= 1RXCIE; }
    #define UartStopRx() { UCSRB = ~( 1RXCIE ); }
    /* ****************************************************************
    * UartFlush()
    * 功能:緩沖清空
    * 參數(shù): isTxBuf ------ 是否為發(fā)送緩沖
    * 返回值:None
    * 說明:清空收發(fā)緩沖
    * *************************************************************** */
    void UartFlush( INT8U isTxBuf )
    {
    #if OS_CRITICAL_METHOD == 3
    OS_CPU_SR cpu_sr;
    #endif
    INT8U cnt;

    OS_ENTER_CRITICAL();

    if( isTxBuf )
    {
    UartTxFifo.buf = UartTxBuf; // 復(fù)位發(fā)送緩沖讀寫指針
    UartTxFifo.in = UartTxBuf;
    UartTxFifo.out = UartTxBuf;
    OSSemQuery( UartTxFifo.sem, SemData );
    cnt = UART_TX_LEN - SemData.OSCnt; // 在其它地方必須保證SemData.OSCnt UART_TX_LEN
    while( cnt-- )
    OSSemPost( UartTxFifo.sem ); // 復(fù)位發(fā)送信號量值為UART_TX_LEN
    }

    else
    {
    UartRxFifo.buf = UartRxBuf; // 復(fù)位接收緩沖讀寫指針
    UartRxFifo.in = UartRxBuf;
    UartRxFifo.out = UartRxBuf;
    while( OSSemAccept( UartRxFifo.sem ) ); // 復(fù)位接收信號量值為0

    }

    OS_EXIT_CRITICAL();
    }

    void UartPutStr( char * str )
    {
    char * ptr;

    ptr = (char *)str;

    while(*ptr != '

    主站蜘蛛池模板: 涟水县| 区。| 大关县| 隆化县| 林芝县| 阿克陶县| 徐闻县| 屏东市| 磐石市| 鹤峰县| 肥城市| 应城市| 漳浦县| 徐汇区| 长泰县| 邵阳县| 娱乐| 米脂县| 永福县| 太仓市| 甘泉县| 崇明县| 汝州市| 织金县| 长白| 府谷县| 元江| 喀什市| 文安县| 股票| 武隆县| 新丰县| 如皋市| 黔东| 黑水县| 井研县| 揭西县| 同仁县| 关岭| 正定县| 新乐市|