正点原子领航者7020开发板VxWorks6.9 BSP深度定制与时钟网络配置详解
1. 认识领航者7020开发板与VxWorks6.9
正点原子领航者7020开发板是一款基于Xilinx Zynq-7000系列SoC的嵌入式开发平台,核心芯片XC7Z020集成了双核ARM Cortex-A9处理器和FPGA可编程逻辑单元。这块开发板在工业控制、通信设备等领域应用广泛,而VxWorks6.9作为经典的实时操作系统,其高可靠性和实时性使其成为许多关键系统的首选。
我第一次接触这个组合时,发现官方BSP(Board Support Package)并不能直接适配领航者7020的硬件设计。比如开发板的串口默认使用UART0,而官方BSP配置的是UART1;网络PHY地址也与参考设计不同。这些差异会导致系统启动后串口无输出、网络不通等典型问题。通过Workbench3.3开发环境,我们需要对BSP进行深度定制,特别是时钟网络配置这部分,直接影响外设工作的稳定性。
2. 创建定制化BSP包
2.1 基础环境搭建
在开始修改前,需要准备好以下工具链:
- VxWorks6.9安装包
- Wind River Workbench3.3开发环境
- Xilinx Vivado2018.3(用于硬件设计验证)
- 领航者7020开发板原理图PDF文档
建议在Vivado中先检查硬件设计,确认UART0、ENET0、SD0等外设的时钟分配情况。我遇到过因为时钟频率配置错误导致SD卡识别不稳定的情况,后来发现是Vivado中SDHC时钟约束与BSP配置不匹配。
2.2 BSP目录结构克隆
进入VxWorks安装目录的vxworks-6.9\target\config路径,复制官方提供的xlnx_zynq7k文件夹,重命名为xlnx_zynq7020。这个新目录就是我们的定制化BSP工作区。用VS Code打开后,重点关注这三个文件:
- config.h:系统启动参数、驱动宏定义
- hwconf.c:硬件资源映射配置
- xlnx_zynq7k.h:时钟频率定义
3. 关键文件修改实战
3.1 网络启动参数调整
在config.h中找到DEFAULT_BOOT_LINE定义,这是开发板通过TFTP加载内核镜像的关键配置。领航者7020的默认网络配置需要修改为:
#define DEFAULT_BOOT_LINE \ "gem(0,0)host:vxWorks h=192.168.1.119 e=192.168.1.142:fffffe00 \ g=192.168.155.1 u=z7 pw=z7 f=0x0 tn=xlnx_zynq7k"参数说明:
h:主机IP(存放vxWorks镜像的TFTP服务器)e:开发板IP+MAC地址(注意MAC最后四位要符合板卡标识)g:网关地址u/pw:FTP登录凭证(如果使用网络加载)
如果改用SD卡启动,需要启用以下宏定义:
#define INCLUDE_BOOT_FILESYSTEMS #define DRV_STORAGE_SDHC #define INCLUDE_DOSFS // FAT文件系统支持3.2 硬件资源映射修正
打开hwconf.c文件,主要修改三处:
- 串口设备切换:
// 将所有UART1引用改为UART0 INT_VEC_UART1 → INT_VEC_UART0 zynqSioDev1Num → zynqSioDev0Num- PHY地址修改: 根据领航者原理图,PHY芯片地址为1(官方BSP默认为0):
LOCAL struct hcfResource zynqGemDevResources[] = { { "regBase", HCF_RES_INT, {(void *)ZYNQ7K_GEM0_BASE} }, { "phyAddr", HCF_RES_INT, {(void *)1} }, // 关键修改! };- 中断优先级配置:
LOCAL const struct intrCtlrPriority gicPriority[] = { { INT_VEC_UART0, 120 }, // 确保串口中断优先级合理 };4. 时钟网络精确配置
4.1 Vivado设计验证
在Vivado Block Design中查看时钟子系统:
- PS_CLK:33.3MHz(处理器系统时钟)
- UART_CLK:100MHz(需与BSP配置一致)
- FCLK0:自定义PL时钟(如用于自定义IP)
建议导出硬件描述文件(.hdf)后,用xsct工具查看时钟树:
list_clock_nodes get_clock_freq [get_clock_nodes clk_uart]4.2 BSP时钟参数同步
在xlnx_zynq7k.h中修改时钟定义,必须与Vivado设计完全一致:
#define ZYNQ7K_UART_CLK (100000000) // 实测领航者7020的UART时钟为100MHz #define ZYNQ7K_SDHC_CLK (100000000) // SD卡时钟影响数据传输速率 #define ZYNQ7K_ETHERNET_CLK (125000000) // GMAC时钟需满足RGMII时序特别提醒:如果时钟配置错误,可能会出现SD卡读写时丢数据、网络PHY链路不稳定等问题。我曾因为将Ethernet时钟误设为25MHz,导致网络传输速率只有预期的1/5。
5. 编译与烧写实战
5.1 生成Bootloader
在Workbench中创建Bootloader工程时:
- 选择BSP为自定义的
xlnx_zynq7020 - 添加
INCLUDE_ENET宏以支持网络启动 - 勾选
INCLUDE_SDCARD支持SD卡引导
编译后会生成bootrom.bin文件,通过以下命令组合成BOOT.bin:
bootgen -image boot.bif -o BOOT.bin -w on其中boot.bif文件内容示例:
//arch = zynq; split = false; format = BIN the_ROM_image: { [bootloader] bootrom.bin [load=0x10000000] vxWorks.st }5.2 启动问题排查
常见故障及解决方法:
串口无输出:
- 检查UART0在Vivado中的引脚约束
- 测量UART时钟实际频率
- 确认终端波特率设置为115200
网络无法连接:
- 用示波器检查PHY的125MHz时钟
- 验证PHY地址是否为1
- 排查硬件上拉电阻配置
SD卡识别失败:
- 确认卡槽电压为3.3V
- 检查SDHC_CLK是否有100MHz时钟
- 尝试更换不同品牌SD卡
把BOOT.bin和vxWorks镜像拷贝到FAT32格式的SD卡,插入开发板并设置启动模式为SD启动。如果一切配置正确,应该能在串口终端看到VxWorks的启动日志,类似:
[VxWorks Boot]: Attaching to network... done. Loading vxWorks from 192.168.1.119:696. 高级配置技巧
6.1 多时钟域管理
当PL部分使用自定义IP时,需要在Vivado中配置额外的时钟域,并在BSP中同步更新。例如为视频处理模块添加150MHz时钟:
- Vivado中约束:
create_clock -name clk_vga -period 6.666 [get_pins pl_clk0]- BSP中新增定义:
#define ZYNQ7K_VGA_CLK (150000000)6.2 功耗优化配置
通过调整时钟分频降低功耗:
// 在hwconf.c中修改PLL配置 LOCAL void clkConfig(void) { zynqSlcrPllBypass(ARM_PLL, FALSE); zynqSlcrPllSetParam(ARM_PLL, 50, 1, 2); // 降频至800MHz }实测发现,将ARM PLL从1GHz降到800MHz可节省约15%功耗,而对大多数控制应用性能影响不大。
7. 外设驱动调试心得
7.1 UART调试技巧
在串口初始化代码中添加调试打印:
printf("UART clock: %dHz\n", sysClkRateGet(CLOCK_UART));如果输出乱码,很可能是时钟配置错误。我曾经因为将UART时钟误设为50MHz,导致波特率实际值翻倍。
7.2 网络性能优化
通过调整DMA缓冲区提升网络吞吐量:
#define NUM_RX_DESC (64) // 默认16个描述符可能不足 #define NUM_TX_DESC (64)在千兆网络测试中,增大描述符数量可使iperf测速从300Mbps提升到950Mbps。同时建议启用校验和卸载:
#define INCLUDE_ENHANCED_GEM // 启用硬件校验功能8. 常见问题解决方案
8.1 启动卡在FSBL阶段
可能原因:
- BOOT.bin文件结构错误
- QSPI Flash未正确擦除
- 时钟配置不匹配
解决方法:
- 使用
bootgen -arch zynq -list BOOT.bin验证文件结构 - 在Vivado中重新生成FSBL
- 检查PS_CLK是否为33.3MHz
8.2 内存分配失败
修改config.h中的内存映射:
#define LOCAL_MEM_LOCAL_ADRS (0x00000000) #define LOCAL_MEM_SIZE (0x40000000) // 领航者7020配备1GB DDR3如果运行大型应用出现内存不足,可调整内核内存池大小:
#define KERNEL_HEAP_SIZE (0x1000000) // 默认16MB改为256MB经过这些定制化配置后,领航者7020开发板就能充分发挥VxWorks6.9的实时性能了。在实际工业项目中,这种定制化BSP的稳定性直接关系到整个系统的可靠性,建议每次修改后都进行72小时连续运行测试。
