3. 配置串口驱动

任务目标

在PowerPC目标板上完成串口驱动配置,使VxWorks能够通过串口终端输出启动信息并提供shell交互。本案例以MPC8240平台为例,使用片上DUART(SCC1)作为控制台串口。

环境与依赖

  • 宿主机:Windows/Linux,安装WorkBench 3.x或Tornado 2.2
  • 目标板:PowerPC(MPC8240),串口线连接至宿主机COM口
  • BSP:mpc8240(或对应板级支持包),需已包含串口驱动源文件
  • 串口终端:超级终端或PuTTY,波特率9600,8数据位,无校验,1停止位

配置步骤与关键代码

串口驱动配置的核心在BSP的config.h和sysLib.c中完成。以下为最小必要配置:

// config.h —— 串口控制台配置
#define CONSOLE_TTY     0           // 使用SCC1作为控制台
#define CONSOLE_BAUD_RATE 9600      // 波特率
#define CONSOLE_UART    1           // 启用串口驱动

// sysLib.c —— 串口寄存器基地址与中断配置
#define SCC1_BASE_ADDR  0x80000000  // MPC8240 DUART SCC1基地址
#define SCC1_IRQ_LEVEL  3           // 中断优先级
#define SCC1_IRQ_VECTOR 48          // 中断向量号

// 串口初始化(在sysHwInit中调用)
void sysHwInit(void)
{
    // 映射DUART寄存器地址空间
    sysOut8(SCC1_BASE_ADDR + 0x00, 0x00);  // 复位SCC1
    sysOut8(SCC1_BASE_ADDR + 0x02, 0x00);  // 屏蔽所有中断
    
    // 配置SCC1为UART模式(8位数据,无校验,1停止位)
    sysOut8(SCC1_BASE_ADDR + 0x04, 0x00);  // 模式寄存器1
    sysOut8(SCC1_BASE_ADDR + 0x06, 0x00);  // 模式寄存器2
    
    // 设置波特率9600(基于系统时钟33MHz)
    sysOut8(SCC1_BASE_ADDR + 0x08, 0x0C);  // 时钟寄存器高字节
    sysOut8(SCC1_BASE_ADDR + 0x0A, 0x00);  // 时钟寄存器低字节
    
    // 使能发送器和接收器
    sysOut8(SCC1_BASE_ADDR + 0x0C, 0x05);  // 命令寄存器:使能TX
    sysOut8(SCC1_BASE_ADDR + 0x0C, 0x01);  // 命令寄存器:使能RX
}

// 串口中断处理(在sysHwInit2中注册)
void sysHwInit2(void)
{
    intConnect((VOIDFUNCPTR*)INUM_TO_IVEC(SCC1_IRQ_VECTOR),
               (VOIDFUNCPTR)tyIRQHandler, 0);
    sysIntEnablePIC(SCC1_IRQ_LEVEL);
}

运行与验证

  1. 将上述配置加入BSP后,重新编译VxWorks镜像:make vxWorks
  2. 通过BDM或JTAG将镜像下载到目标板并运行
  3. 宿主机打开串口终端,连接目标板串口
  4. 复位目标板,观察终端是否出现VxWorks启动横幅

通过条件

  • 串口终端显示VxWorks启动信息,包括版本号和内存检测结果
  • 启动完成后出现shell提示符 ->
  • 输入 i 命令能列出系统任务,输入 help 能显示命令列表

若终端无输出,依次检查:串口线是否连接正确、终端参数是否匹配(9600/8/N/1)、CONSOLE_TTY是否指向实际使用的串口、SCC1基地址是否与硬件手册一致。