·上一文章:STM32F103x的USB多路数据采集系统设计
·下一文章:存储分析 如何解决虚拟环境I/O瓶颈问题
接着调用父类CPdd16550的Init函数,创建中断服务线程(IST)事件,并通过InterruptInitialize函数将事件与逻辑中断号关联起来,最后调用CreateHardwareAccess和MapHardware函数将串口基地址及相关寄存器片内地址映射到内核进程的虚拟地址。
在MapHardware中,用GetWindowInfo根据串口的Active注册表键获得串口的全部I/O端口和内存地址信息,然后用 MmMapIoSpace函数将串口物理地址和相关控制寄存器地址转换成内核进程的虚拟地址,以便后面对寄存器进行操作,部分代码如下:
CreateHardwareAccess函数根据MapHardware得到的m_pBaseAddress,构造一个CRegLPC32xx类实例,然后调用CRegLPC32xx类的Init函数确保串口控制器硬件进入稳定的工作状态。
根据LPC3250的数据手册,设置标准UART的波特率需要设置小数波特率预分频器和UART波特率发生器。当不用小数波特率预分频器(即X=Y=1) 时,将标准UART的{Baudrate,DLM:DLL}的值定义一个数组BaudPairs[]。GetDivisorOfRate根据这个数组得到分频系数,然后调用父类的成员函数SetBaudRate便可设置波特率。高速UART的波特率类似,只是波特率计算公式和分频系数与标准UART不同。
用GetWaterMark得到接收器FIFO的触发深度,分别为16、32、48和60位,然后在CPdd16550的InitReceive中设置FIFO控制寄存器,默认的FIFO触发深度是32位。