關(guān) 閉

        新聞中心

        EEPW首頁 > 工控自動(dòng)化 > 設(shè)計(jì)應(yīng)用 > 基于WinCE6.0的 LPC3250串口驅(qū)動(dòng)程序開發(fā)

        基于WinCE6.0的 LPC3250串口驅(qū)動(dòng)程序開發(fā)

        作者: 時(shí)間:2009-09-18 來源:網(wǎng)絡(luò) 收藏

        串口與‘550工業(yè)規(guī)范的串口有差異,為了保證程序的通用性和盡量減少代碼量,在實(shí)現(xiàn)程序時(shí),需要繼承 CPdd16550和CReg16550類,根據(jù)實(shí)際的硬件特性實(shí)現(xiàn)它們的純虛函數(shù)并擴(kuò)展其虛函數(shù)的功能,配置硬件相關(guān)的寄存器和修改相關(guān)代碼。首先實(shí)現(xiàn) CReg16550的繼承類CReg32xx,主要實(shí)現(xiàn)與物理底層操作的函數(shù)Write_xxx和Read_xxx,對(duì)串口寄存器進(jìn)行讀寫操作。這里要注意的是LPC串口寄存器地址間隔是32位,而不是標(biāo)準(zhǔn)的8位;CPdd16550的繼承類Clpc32xxPdd16550UART本質(zhì)還是個(gè)抽象類,同時(shí)為標(biāo)準(zhǔn)串口和高速串口服務(wù),要重新實(shí)現(xiàn)Init、GetDivisorO-{Rate、GetWaterMark、 MapHardware、CreateHardwareAc-cess、CreateSerialObject、DeleteSerialObject等函數(shù),其他的函數(shù)可以直接調(diào)用CPdd16550的成員函數(shù),只需要修改相關(guān)串口寄存器的宏定義。
        在Clpc32xxPdd16550UART的Init函數(shù)中,GetIsrInfo以串口的Active注冊(cè)表鍵為依據(jù)查出物理中斷號(hào),并保存在 DDKISRINFO結(jié)構(gòu)體的dwlrq成員中。KernelloCon-trol函數(shù)將物理中斷號(hào)轉(zhuǎn)換為邏輯中斷號(hào),符合條件就將邏輯中斷號(hào)回寫到注冊(cè)表中。相關(guān)代碼如下:

        本文引用地址:http://www.104case.com/article/202649.htm


        接著調(diào)用父類CPdd16550的Init函數(shù),創(chuàng)建中斷服務(wù)線程(IST)事件,并通過InterruptInitialize函數(shù)將事件與邏輯中斷號(hào)關(guān)聯(lián)起來,最后調(diào)用CreateHardwareAccess和MapHardware函數(shù)將串口基地址及相關(guān)寄存器片內(nèi)地址映射到內(nèi)核進(jìn)程的虛擬地址。
        在MapHardware中,用GetWindowInfo根據(jù)串口的Active注冊(cè)表鍵獲得串口的全部I/O端口和內(nèi)存地址信息,然后用 MmMapIoSpace函數(shù)將串口物理地址和相關(guān)控制寄存器地址轉(zhuǎn)換成內(nèi)核進(jìn)程的虛擬地址,以便后面對(duì)寄存器進(jìn)行操作,部分代碼如下:


        CreateHardwareAccess函數(shù)根據(jù)MapHardware得到的m_pBaseAddress,構(gòu)造一個(gè)CRegLPC32xx類實(shí)例,然后調(diào)用CRegLPC32xx類的Init函數(shù)確保串口控制器硬件進(jìn)入穩(wěn)定的工作狀態(tài)。
        根據(jù)LPC3250的數(shù)據(jù)手冊(cè),設(shè)置標(biāo)準(zhǔn)UART的波特率需要設(shè)置小數(shù)波特率預(yù)分頻器和UART波特率發(fā)生器。當(dāng)不用小數(shù)波特率預(yù)分頻器(即X=Y=1) 時(shí),將標(biāo)準(zhǔn)UART的{Baudrate,DLM:DLL}的值定義一個(gè)數(shù)組BaudPairs[]。GetDivisorOfRate根據(jù)這個(gè)數(shù)組得到分頻系數(shù),然后調(diào)用父類的成員函數(shù)SetBaudRate便可設(shè)置波特率。高速UART的波特率類似,只是波特率計(jì)算公式和分頻系數(shù)與標(biāo)準(zhǔn)UART不同。
        用GetWaterMark得到接收器FIFO的觸發(fā)深度,分別為16、32、48和60位,然后在CPdd16550的InitReceive中設(shè)置FIFO控制寄存器,默認(rèn)的FIFO觸發(fā)深度是32位。



        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 荔波县| 台湾省| 方城县| 徐闻县| 璧山县| 大悟县| 沽源县| 遵义县| 柳河县| 黎平县| 三原县| 杭州市| 永定县| 信宜市| 胶南市| 大新县| 康定县| 柳州市| 丰都县| 金山区| 河东区| 丹棱县| 卢氏县| 涪陵区| 伊春市| 贡嘎县| 连江县| 岚皋县| 济阳县| 剑阁县| 灵台县| 宜春市| 易门县| 白朗县| 高雄县| 通化市| 无为县| 安阳市| 小金县| 常德市| 孟州市|