FQML_AXI_GPIO与Procise协同调试:从Vivado工程到IAR固件的全链路实践
2026/7/14 12:12:52 网站建设 项目流程

1. 跨平台开发环境搭建

在国产化替代浪潮下,Procise工具链正成为Vitis/SDK之外的新选择。这次我在JFMQL15T开发板上实测了一套完整的开发流程:从Vivado硬件设计开始,通过Procise导入工程,最终在IAR环境下完成固件调试。整个过程涉及三个关键工具链的协同,就像在不同语言的国度间搭建桥梁。

先说说硬件准备。我用的Zynq-7000平台型号是xc7z015clg485-2,这个芯片的PS-PL架构非常适合做AXI外设开发。在Vivado 2022.1新建工程时,有个细节容易踩坑——必须正确选择芯片封装型号,有次我选错后缀导致后续引脚约束全部报错。

开发环境配置建议:

  • Vivado 2022.1(需安装Zynq-7000器件支持包)
  • Procise 3.5.2(国产工具链,界面全中文但文档较少)
  • IAR Embedded Workbench 8.50.6(注意要ARM版本)

提示:Procise对工程路径有严格要求,建议全英文路径且不要有空格,否则导入时可能报"文件解析失败"的错误。

2. Vivado硬件系统构建

2.1 Block Design核心配置

创建名为system的Block Design后,首先添加ZYNQ7 Processing System IP。双击进入配置界面时,我通常会先做三件事:

  1. 在Clock Configuration里确认PL时钟频率(本例保持默认100MHz)
  2. 在DDR Configuration禁用DDR控制器(本实验不需要)
  3. 在Peripheral I/O Pins勾选PJTAG相关EMIO

添加AXI GPIO IP时,关键参数这样设置:

# GPIO配置示例 set_property CONFIG.C_ALL_OUTPUTS {1} [get_bd_cells axi_gpio_0] set_property CONFIG.C_GPIO_WIDTH {4} [get_bd_cells axi_gpio_0]

这里GPIO Width设为4对应开发板上的4个PL端LED。有个实用技巧:在Board界面直接拖拽AXI GPIO到画布上,Vivado会自动完成部分连线。

2.2 硬件设计中的坑点记录

第一次做EMIO PJTAG配置时,我犯了个顺序错误——应该在Run Block Automation之前添加PJTAG引脚。补救方法是重新打开Block Design,通过"Add IP"搜索axi_jtag并配置:

  1. 设置JTAG时钟频率为10MHz
  2. 将TCK/TDI/TDO/TMS四个信号Make External
  3. 手动连接到Zynq的EMIO接口

连线完成后务必执行Generate Output Products,这时在生成的顶层HDL文件中能看到如下关键信号:

output [3:0] pl_led_tri_o; inout PJTAG_0_tck; inout PJTAG_0_tdi; inout PJTAG_0_tdo; inout PJTAG_0_tms;

3. Procise工程迁移实战

3.1 工程导入的玄机

Procise导入Vivado工程时,有个隐藏规则:只识别特定格式的SDK工程。必须在Vivado中先执行:

  1. File → Export → Export Hardware(勾选Include bitstream)
  2. File → Launch SDK创建空工程(工程名必须以_bsp结尾)

导入时遇到的最棘手问题是文件路径映射。Procise会严格保持Vivado中的相对路径,如果工程移动过位置,需要手动修改.prj文件中的路径指向。这里分享一个诊断技巧——用文本编辑器打开.procise文件,检查 标签内的路径是否正确。

3.2 驱动文件移植技巧

从Vivado SDK到Procise需要移植这些关键驱动文件:

SDK/workspace/system_platform_FM_QL_bsp/ ├── include/ │ ├── xil_assert.h │ ├── xparameters.h │ └── ... └── libsrc/ ├── gpio_v4_3/src/ └── standalone_v6_1/src/

在IAR中添加文件时要注意:

  1. 头文件路径必须包含Procise生成的ps_parameters.h
  2. 需要修改xgpio_l.h中的底层读写接口:
// 原始Xilinx接口 #define XGpio_In32(addr) Xil_In32(addr) // 替换为Procise兼容接口 #define XGpio_In32(addr) FMSH_ReadReg(addr,0x0)

4. IAR固件开发详解

4.1 寄存器初始化序列

在main函数中必须优先初始化PS端系统寄存器,这是很多开发者容易遗漏的:

FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x008, 0xDF0D767BU); // 解锁SLCR FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x838, 0xf); // 配置MIO bank电压 FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x004, 0xDF0D767BU); // 锁定SLCR

4.2 GPIO控制实战代码

下面这个函数实现了PL端LED的跑马灯效果,包含完整的错误处理:

int FGpioOutputExample(void) { XGpio led_out; u32 status = XGpio_Initialize(&led_out, 0); if(status != XST_SUCCESS) { return XST_FAILURE; // 初始化失败时红灯常亮 } XGpio_SetDataDirection(&led_out, 1, 0x0); // 设置通道1为输出 XGpio_DiscreteWrite(&led_out, 1, 0x0F); // 初始全亮 for(int i=0; i<3; i++) { // 循环3次 for(int bit=0; bit<4; bit++) { XGpio_DiscreteWrite(&led_out, 1, ~(1<<bit)); delay_ms(200); // 自定义延时函数 } } return XST_SUCCESS; }

在调试时发现,Procise对delay_ms()的实现与SDK不同,需要改用FMSH_DelayUs()函数并换算时间单位。

5. 协同调试技巧

5.1 PJTAG的双重作用

EMIO PJTAG在这个设计中扮演两个角色:

  1. 作为PS端调试接口(替代传统JTAG)
  2. 提供PL端信号观测通道

在IAR调试配置中,需要特别注意:

  1. 选择CMSIS-DAP调试器
  2. 接口类型设为SWD
  3. 在Additional Options添加:
--jtag_speed 1000 --emu_use_jtag

5.2 常见错误排查表

现象可能原因解决方案
Procise导入失败SDK工程未以_bsp结尾重新创建SDK工程
IAR编译报错xil_io.h缺失文件路径未包含standalone_v6_1/src手动添加搜索路径
LED无响应AXI GPIO基地址错误检查xparameters.h中的定义
PJTAG连接超时EMIO未正确约束重新生成bit文件

6. 性能优化建议

在最后测试阶段,发现GPIO响应速度不如预期。通过以下优化手段将翻转频率从1MHz提升到25MHz:

  1. 修改AXI GPIO IP配置:

    • 启用Fast Write模式
    • 设置AXI数据宽度为32位
  2. 固件层优化:

// 原始单次写入 XGpio_DiscreteWrite(&led_out, 1, val); // 优化为直接寄存器操作 *(volatile uint32_t*)(GPIO_BASEADDR + 0x00) = val;
  1. 在Vivado中启用AXI Interconnect的Low Latency模式

这套方案在国产化替代项目中已经验证通过,特别适合对工具链有特定要求的军工、电力等行业场景。虽然初期工具适配需要额外工作量,但一旦打通全链路,后续开发效率反而会高于传统方案。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询