本文适用于复旦微的FMQL系统的psoc产品(FMQL10/15/20/45)
如果只开发ps端的控制接口,可以直接使用procise导出的bsp代码来控制ps端自带的外设,此时是可以没有bit流的。
如果需要用到pl端的ip核,则需要对应的bit程序,并且要移植该ip核的 驱动程序 。
5.4 将Vivado Block Design导入Procise(2.4.4节)
步骤1: 打开Procise,新建一个空的Procise工程,取名 Procise_axi_led,器件选择 fmql45t900(不同的芯片根据实际型号选择),这里选择。
步骤2: 上方菜单选择 PSOC → From Vivado。
📍 图片说明: 原文档中“Procise中PSOC → From Vivado”截图,展示了Procise菜单栏,PSOC菜单下拉项中包含“From Vivado”、“FlashloaderBootgen”、“Create Boot Image”等选项。
步骤3: 在弹出的窗口中,添加Vivado生成的 system.bd 文件与PS的IP配置(.xci)文件。
📍 图片说明: 原文档中“添加.bd和.xci文件”截图,展示了Load Block Design窗口,包含.bd文件路径选择和.xci文件路径选择两个输入框。
文件路径说明: - .bd文件路径:prjdir/{prj_dir}/prjdir/{prj_name}.srcs/sources_1/bd/bdname/{bd_name}/bdname/{bd_name}.bd
- .xci文件路径:prjdir/{prj_dir}/prjdir/{prj_name}.srcs/sources_1/bd/bdname/ip/{bd_name}/ip/bdname/ip/{bd_name}_processing_system7_0_0/${bd_name}_processing_system7_0_0.xci
步骤4: 点击“OK”后,在弹出的 “Export Hardware Project” 窗口中选择 Empty 模板工程(或HelloWorld)。
📍 图片说明: 原文档中“选择模板工程”截图,展示了Export Hardware Project窗口,列表中包含“Empty”、“HelloWorld”、“FSBL”、“DDR3Test”等模板选项,根据需要选择。fsbl和helloWorld最好都选上
1、 FSBL—第一级启动引导,必须使用,运行在axisram空间
2、 MemoryTest—用来测试ps端挂的ddr是否能正常读写
3、 PerpheralTestTest—用来测试ps端的外设控制器接口,每个外设都有使用参考代码
4、 Lwip----网络协议栈,裸机使用网络时,已这个为基础开发
5、 SdFatfs—带fat文件系统的demo,存储介质是sd卡或是emmc颗粒
6、 SSBL—二级boot,可选
7、 HelloWorld—基础示例工程,默认运行在ahbsram.icf空间,在使用时demo时,如果程序想跑在ddr空间,需要修该为a7_psddr.icf
步骤5: 点击“OK”,Procise将自动启动IAR SDK。
5.5 ⭐ 从SDK移植代码到IAR(2.4.5节)—— 核心重点
5.5.1 观察IAR SDK工程结构
打开IAR SDK后,展开 FM_QL_bsp,可以看到生成的SDK目录结构如下:
📍 图片说明: 原文档中“IAR SDK工程目录结构”截图,展示了IAR Embedded Workbench工程面板,左侧工程树中展开“FM_QL_bsp”,包含bootloader、include、libsrc、pl等子目录,以及Application工程下的helloworld.c文件。
各目录说明: - bootloader/ — PS启动相关 - include/ — 头文件(fmsh_ps_parameters.h等) - libsrc/ — 驱动库源码(PS外设驱动) - pl/ — PL相关IP驱动(该目录初始为空,需要手动添加文件)
📌 关键说明: 2.4.3节中Xilinx SDK生成的 led_bsp/ps7_cortexa9_0/ 中的文件已被自动复制到 Procise_axi_led/SDK/system_platform/FM_QL_bsp/pl/ 目录下。IAR SDK已建立了相关路径索引和文件夹,但没有将具体的.c和.h文件加入工程,需要用户自行添加。
5.5.2 添加驱动文件到IAR工程
步骤1: 右键点击IAR工程中的 pl → include 路径,选择 “Add Files”。
步骤2: 在弹出的文件选择窗口中,从 SDK_from_Vivado/system_platform/HelloWorld/FM_QL_bsp/pl/include/ 目录下选择以下4个库文件:
文件名 说明
xil_assert.h 断言处理头文件
xil_types.h Xilinx数据类型定义
xparameters.h 硬件参数(地址映射等)
xstatus.h 状态返回值定义
📍 图片说明: 原文档中“添加4个include文件”截图,展示了文件选择对话框,路径定位到pl/include目录,列表中选中了xil_assert.h、xil_types.h、xparameters.h、xstatus.h四个文件。
步骤3: 同样的方法,添加 libsrc → gpio_v4_3 → src 下所有.c和.h文件(GPIO驱动)。
📍 图片说明: 原文档中“添加gpio_v4_3驱动的所有文件”截图,展示了文件选择对话框,路径定位到gpio_v4_3/src目录,选中了所有.c和.h文件。
步骤4: 同样的方法,添加 libsrc → standalone_v6_8 → src 下的 xil_assert.c 文件。
📌 添加驱动文件清单: - include/ 下:xil_assert.h、xil_types.h、xparameters.h、xstatus.h - libsrc/standalone_v6_8/src/ 下:xil_assert.c - libsrc/gpio_v4_3/src/ 下:所有.c和.h文件(共约10个文件,包括xgpio.c、xgpio.h、xgpio_g.c、xgpio_intr.c、xgpio_l.h、xgpio_sinit.c、xgpio_selftest.c等)
5.5.3 ⭐ 修改驱动文件以兼容IAR平台(核心步骤)
这是从Xilinx SDK移植到IAR SDK最关键的一步。 Xilinx SDK的驱动代码依赖于Xilinx的库函数,需要修改为IAR平台兼容的调用方式。
修改1:修改 xparameters.h
打开 xparameters.h,找到以下行并注释掉:
// 注释掉这一行 —— 这是Xilinx特有的头文件,IAR平台不兼容
// #include “xparameters_ps.h”
📌 原因: xparameters_ps.h 是Xilinx SDK中PS部分的参数头文件,包含Xilinx特有的宏定义,IAR平台不兼容。如果不注释掉,编译时会报错“cannot open source file xparameters_ps.h”。
修改2:修改 xgpio_l.h — 共两处修改
修改A: 注释掉 #include “xil_io.h”,添加 #include “fmsh_common_io.h”
// 注释掉原来的
// #include “xil_io.h”
// 添加IAR平台的IO函数头文件
#include “fmsh_common_io.h”
修改B: 找到宏定义区域,将 XGpio_In32 和 XGpio_Out32 替换为IAR平台的函数
/*************** Macros (Inline Functions) Definitions *******************/
// 注释掉原来的宏定义(Xilinx特有的寄存器读写函数)
// #define XGpio_In32 Xil_In32
// #define XGpio_Out32 Xil_Out32
// 替换为IAR平台的寄存器读写函数
#define XGpio_In32(addr) FMSH_ReadReg(addr, 0x0)
#define XGpio_Out32(addr, data) FMSH_WriteReg(addr, 0x0, data)
/*********************************************************************/
📌 原因: Xil_In32 和 Xil_Out32 是Xilinx SDK中 xil_io.h 定义的IO读写函数,在IAR平台需要使用 FMSH_ReadReg 和 FMSH_WriteReg 替代。如果不修改,编译时会报错“undefined reference to Xil_In32”。
5.5.4 编写流水灯代码
完成驱动文件修改后,打开 helloworld.c(或 empty.c),删除原有代码,添加以下代码:
#include <stdio.h>
#include “platform.h”
#include “fmsh_common.h”
#include “xgpio.h”
#include “fmsh_ps_parameters.h”
int FGpioOutputExample(void);
int main()
{
init_platform();
FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x008, 0xDF0D767BU); //unlock
FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x838, 0xf); //Open USER_LVL_SHFTR_EN_A and USER_LVL_SHFTR_EN_5
FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x004, 0xDF0D767BU); //lock
printf("Hello World\n\r"); while(1){ printf("\n\r** FMQL45 - LED Test **\n\r"); FGpioOutputExample(); } cleanup_platform(); return 0;}
int FGpioOutputExample(void){
XGpio GpioOutput; /* The driver instance for GPIO Device configured as O/P */ u32 LED_CHANNEL = 1; int Status; u32 MaxLoop = 3; u32 LedBit; u32 LedWidth = 7; Status = XGpio_Initialize(&GpioOutput, 0); if (Status != XST_SUCCESS) { return XST_FAILURE; } //set all output XGpio_SetDataDirection(&GpioOutput, LED_CHANNEL, 0x0); //set GPIO outputs to high XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, 0xFFFFFFFF); for (u32 i = 0x0; i < MaxLoop; i++) { for (LedBit = 0x0; LedBit < LedWidth; LedBit++) { XGpio_DiscreteWrite(&GpioOutput, LED_CHANNEL, ~(1 << LedBit)); delay_ms(200); } } return XST_SUCCESS;}
⚠️ 重要提示: 在访问任何PL资源之前,必须使能USER_LEVEL_SHIFTER寄存器,否则无法正常控制PL端的LED灯!
5.5.5 编译验证
在IAR SDK中右键点击工程名,选择 “Rebuild All”,如果上述驱动文件修改正确,应当编译通过,无报错。
📍 图片说明: 原文档中“IAR SDK编译成功”截图,展示了IAR编译输出窗口,显示“Total number of errors: 0”、“Total number of warnings: 0”,编译成功。
六 移植要点总结(核心速查表)
八 常见问题
Q1: 编译报错“cannot open source file xparameters_ps.h”
• 原因: xparameters.h 中引用了Xilinx特有头文件
• 解决: 按5.5.3节步骤,注释掉 #include “xparameters_ps.h”
Q2: 编译报错“undefined reference to Xil_In32”
• 原因: xgpio_l.h 中的宏定义未修改
• 解决: 按5.5.3节步骤,将 XGpio_In32/XGpio_Out32 替换为 FMSH_ReadReg/FMSH_WriteReg
Q3: 下载位流后IAR SDK识别不到JTAG
• 原因: procise_jtag.exe 进程占用JTAG接口
• 解决: 在任务管理器中结束 procise_jtag.exe 进程
Q4: LED灯不亮
• 原因: 未使能USER_LEVEL_SHIFTER寄存器
• 解决: 在代码中添加 FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x838, 0xF);
Q5: 编译通过但运行时LED无反应
• 原因: AXI GPIO地址配置错误或EMIO管脚未正确约束
• 解决: 检查system.hdf中axi_gpio_0的基地址是否为0x41200000,检查XDC管脚约束文件是否正确
九、参考资料
• 《FMQL45 开发板用户手册》
• 《PROCISE使用教程》(原appn102)
• 《PROCISE From Vivado使用教程》(原appn103)
• 原文档:00_FMAP2701-FMQL系列产品-开发平台基础教程-基于AG102开发板(v1.13)-原appn101.pdf