音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

RS232串口驅(qū)動(dòng)的改進(jìn)

作者:usp 欄目:通信技術(shù)
RS232串口驅(qū)動(dòng)的改進(jìn)
改動(dòng)之處:
1.增加接收緩沖UART0GetBuf[UART0_GET_QUEUE_LENGTH/4],定義成32位的緩沖,以便字對(duì)齊,這樣應(yīng)用程序只需調(diào)用UART0Putch(uint8 Data),和定時(shí)查詢UART0Getch(uint8 *P_TEMP)就可以完成串口應(yīng)用,當(dāng)然是以增加ram為代價(jià)的.
2.接收中斷改為一直開(kāi)著,我有點(diǎn)不明白為什么zlg的驅(qū)動(dòng)接收中斷是關(guān)的,應(yīng)用程序調(diào)用UART0Getch時(shí)才打開(kāi),應(yīng)用程序怎么知道何時(shí)有數(shù)據(jù)需要接收.
3.去掉OSSemPost,中斷接收數(shù)據(jù)直接入隊(duì),用于單任務(wù).
4.FIFO是初始化為8個(gè)字節(jié)中斷,所以字符超時(shí)中斷后FIFO中可能不止一個(gè)數(shù)據(jù),應(yīng)當(dāng)循環(huán)讀空.
5.我覺(jué)得Uart0WriteFull也需要改一下,對(duì)于單片機(jī)的程序來(lái)說(shuō),一般不允許隊(duì)列滿,萬(wàn)一滿了,說(shuō)明有問(wèn)題,那么應(yīng)當(dāng)清空隊(duì)列,而不是等兩個(gè)周期,再寫(xiě)入,當(dāng)然這與應(yīng)用有關(guān).

我在項(xiàng)目中已經(jīng)使用這個(gè)程序,現(xiàn)在試驗(yàn)中沒(méi)有問(wèn)題,正在系統(tǒng)測(cè)試,先發(fā)出來(lái)與大家共享.如有問(wèn)題,請(qǐng)各位指正.

#define IN_UART0
#include "config.h"

static uint32 UART0SendBuf[UART0_SEND_QUEUE_LENGTH/4];
static uint32 UART0GetBuf[UART0_GET_QUEUE_LENGTH/4];


    uint8 Uart0WriteFull(DataQueue *Buf, QUEUE_DATA_TYPE Data, uint8 Mod)
{
    uint16 TEMP;
    
    Mod = Mod;
    
    TEMP = QueueSize((void *)Buf);
    while (TEMP <= QueueNData((void *)Buf))         /* 等待數(shù)據(jù)隊(duì)列不滿 */
    {
        OSTimeDly(2);
    }
    return QueueWrite((void *)Buf, Data);           /* 數(shù)據(jù)重新入隊(duì) */
}


        uint8 UART0Init(uint32 bps)
{
    uint16 Fdiv;
    
    PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05;    /* 選擇管腳為UART0 */

    U0LCR = 0x80;                               /* 允許訪問(wèn)分頻因子寄存器 */
    Fdiv = (Fpclk / 16) / bps;                  /* 設(shè)置波特率 */
    U0DLM = Fdiv / 256;                            
    U0DLL = Fdiv % 256;                        
    U0LCR = 0x03;                               /* 禁止訪問(wèn)分頻因子寄存器 */
                                                /* 且設(shè)置為8,1,n */
    U0IER = 0x05;                               /* 允許接收和發(fā)送中斷 */
    U0FCR = 0x87;                               /* 初始化FIFO */
    if (QueueCreate((void *)UART0SendBuf,
                     UART0_SEND_QUEUE_LENGTH,
                     NULL,
                     (uint8 (*)())Uart0WriteFull)
                     == NOT_OK)
    {
        return FALSE;
    }
    if (QueueCreate((void *)UART0GetBuf,
                     UART0_GET_QUEUE_LENGTH,
                     NULL,
                     (uint8 (*)())Uart0WriteFull)
                     == NOT_OK)
    {
        return FALSE;
    }
    return TRUE;
}


        void UART0Putch(uint8 Data)
{
    uint8 TEMP;
    
    OS_ENTER_CRITICAL();
    QueueWrite((void *)UART0SendBuf, Data);         /* 數(shù)據(jù)入隊(duì) */
    if ((U0LSR & 0x00000020) != 0)
    {                                               /* UART0發(fā)送保持寄存器空 */
        QueueRead(&TEMP, UART0SendBuf);             /* 發(fā)送最初入隊(duì)的數(shù)據(jù) */
        U0THR = TEMP;
        U0IER = U0IER | 0x02;                       /* 允許發(fā)送中斷 */
    }
    OS_EXIT_CRITICAL();
}


        void UART0Write(uint8 *Data, uint16 NByte)
{
    OS_ENTER_CRITICAL();
    while (NByte-- > 0)
    {
        UART0Putch(*Data++);
    }
    OS_EXIT_CRITICAL();
}


        uint8 UART0Getch(uint8 *P_TEMP)//modify by zjl
{
    if (QueueRead(P_TEMP, UART0GetBuf) == QUEUE_OK)
        return QUEUE_OK;
    else
        return QUEUE_EMPTY;
}



        void UART0_Exception(void)
{
    uint8 IIR, TEMP, i;
    
    OS_ENTER_CRITICAL();
    while(((IIR = U0IIR) & 0x01) == 0)
    {                              &nbs
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)問(wèn)TC35I應(yīng)該設(shè)置為哪種聲音模式啊
求助:如何聯(lián)系高通公司,如何取得許可和msm6000芯片。
求無(wú)線通信模塊
價(jià)格是多少?
哎,手機(jī)若帶“黑名單”多好!
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)