新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Atmega32單片機串口驅動程序

        Atmega32單片機串口驅動程序

        作者: 時間:2013-12-12 來源:網絡 收藏

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

        #include "app.h"

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

        static INT8U UartTxBuf[ UART_TX_LEN ]; // 發送緩沖
        static INT8U UartRxBuf[ UART_RX_LEN ]; // 接收緩沖
        static FIFO UartTxFifo, UartRxFifo; // 收發緩沖控制FIFO結構

        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()
        * 功能:緩沖清空
        * 參數: isTxBuf ------ 是否為發送緩沖
        * 返回值:None
        * 說明:清空收發緩沖
        * *************************************************************** */
        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; // 復位發送緩沖讀寫指針
        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 ); // 復位發送信號量值為UART_TX_LEN
        }

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

        }

        OS_EXIT_CRITICAL();
        }

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

        ptr = (char *)str;

        while(*ptr != '

        主站蜘蛛池模板: 福建省| 郎溪县| 商丘市| 腾冲县| 金阳县| 临邑县| 南投县| 巴塘县| 潞城市| 铅山县| 安仁县| 日土县| 南皮县| 克什克腾旗| 台中县| 霍州市| 崇明县| 武夷山市| 内江市| 凤凰县| 武宁县| 巫山县| 潼南县| 南部县| 建湖县| 阿勒泰市| 安泽县| 三原县| 婺源县| 沙田区| 洛阳市| 河西区| 天全县| 新巴尔虎左旗| 酉阳| 杭锦后旗| 安丘市| 昌江| 大同县| 赣州市| 罗定市|