3. 配置串口驱动并实现控制台输入输出
任务目标
在VxWorks BSP中完成串口控制器参数配置与驱动初始化,使目标机控制台(shell)能够通过串口实现输入输出交互。本案例以典型16550 UART为硬件模型,聚焦于BSP中串口驱动的最小可运行实现。
环境与依赖
- VxWorks 7 或 VxWorks 6.9+(本文以VxWorks 7为例)
- BSP工程已创建,目标板串口外设基地址已知(本案例使用0x3F8,对应PC兼容平台COM1)
- 依赖VxWorks提供的
tyLib(终端驱动库)与uart16550驱动组件(若使用VxWorks自带驱动)或自行实现底层寄存器操作
实现方案
本案例采用VxWorks标准串口驱动框架:通过BSP配置sysLib.c中的串口设备参数,在sysHwInit()中完成驱动初始化,并调用tyLib将串口注册为控制台设备。核心工作包括:定义串口寄存器基地址与中断号、配置波特率/数据位/校验位、实现设备注册与控制台绑定。
关键完整代码
/* sysSerial.c - BSP串口驱动配置与初始化 */
#include <vxWorks.h>
#include <tyLib.h>
#include <uart16550.h>
#include <sysLib.h>
/* 串口硬件参数定义 */
#define UART_BASE_ADDR 0x3F8 /* COM1基地址 */
#define UART_IRQ 4 /* COM1中断号 */
#define UART_BAUD_RATE 115200
#define UART_DATA_BITS 8
#define UART_PARITY NONE_PARITY
#define UART_STOP_BITS 1
/* 控制台设备名称 */
#define CONSOLE_DEV_NAME "/tyCo/0"
/* 串口设备描述结构 */
static UART_DEV uartDev0;
/* 串口寄存器初始化函数 */
static STATUS uartRegInit(void)
{
UART_CHAN *pChan = &uartDev0.chan;
/* 设置通道参数 */
pChan->baudRate = UART_BAUD_RATE;
pChan->dataBits = UART_DATA_BITS;
pChan->parity = UART_PARITY;
pChan->stopBits = UART_STOP_BITS;
/* 调用16550驱动初始化 */
if (uart16550DevInit(&uartDev0, UART_BASE_ADDR, UART_IRQ, 0) != OK)
return ERROR;
return OK;
}
/* 控制台设备注册 */
static STATUS consoleDevCreate(void)
{
/* 将串口设备注册为终端设备 */
if (tyDevInit(CONSOLE_DEV_NAME, &uartDev0.chan, 0, 0) != OK)
return ERROR;
/* 绑定为系统控制台 */
if (iosDevAdd(&uartDev0.devHdr, CONSOLE_DEV_NAME, &tyDrvName, 0) != OK)
return ERROR;
return OK;
}
/* BSP硬件初始化入口(在sysHwInit中调用) */
STATUS sysSerialInit(void)
{
/* 初始化串口寄存器 */
if (uartRegInit() != OK)
return ERROR;
/* 创建控制台设备 */
if (consoleDevCreate() != OK)
return ERROR;
return OK;
}
BSP集成配置
在sysLib.c的sysHwInit()函数末尾添加调用:
/* sysLib.c - 在sysHwInit()中添加 */
#ifdef INCLUDE_SERIAL
if (sysSerialInit() != OK)
logMsg("Serial init failed!\n", 0,0,0,0,0,0);
#endif
在config.h中确保以下宏已定义:
/* config.h - 串口与控制台配置 */
#define INCLUDE_SERIAL
#define CONSOLE_DEV_NAME "/tyCo/0"
#define CONSOLE_BAUD_RATE 115200
运行与验证
- 编译BSP工程,生成VxWorks镜像并烧录到目标机。
- 使用串口线连接目标机COM1与主机,主机侧打开串口终端(如PuTTY/TeraTerm),设置波特率115200、8数据位、无校验、1停止位。
- 目标机上电启动,观察主机串口终端是否出现VxWorks启动日志。
- 启动完成后,在串口终端输入
i命令并回车,若系统列出任务列表,则说明控制台输入输出正常。
通过条件:串口终端能完整显示VxWorks启动信息,且shell命令可正常交互执行,无乱码或超时。
常见问题
- 无输出:检查基地址与中断号是否匹配实际硬件;确认
INCLUDE_SERIAL已定义。 - 乱码:主机串口参数与BSP配置不一致,重点核对波特率。
- 输入无响应:确认
tyDevInit与iosDevAdd调用顺序正确,且控制台设备名与CONSOLE_DEV_NAME一致。