ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

PS通过AXI总线控制PL的LED灯实验之三---procise创建导出iar工程

2026/9/12 18:27:26 拓冰建站 浏览量
PS通过AXI总线控制PL的LED灯实验之三---procise创建导出iar工程 本文适用于复旦微的FMQL系统的psoc产品FMQL10/15/20/45如果只开发ps端的控制接口可以直接使用procise导出的bsp代码来控制ps端自带的外设此时是可以没有bit流的。如果需要用到pl端的ip核则需要对应的bit程序并且要移植该ip核的 驱动程序 。5.4 将Vivado Block Design导入Procise2.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}/prjd​ir/{prj_name}.srcs/sources_1/bd/bdname/{bd_name}/bdn​ame/{bd_name}.bd.xci文件路径prjdir/{prj_dir}/prjd​ir/{prj_name}.srcs/sources_1/bd/bdname/ip/{bd_name}/ip/bdn​ame/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移植代码到IAR2.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); //unlockFMSH_WriteReg(FPS_SLCR_BASEADDR, 0x838, 0xf); //Open USER_LVL_SHFTR_EN_A and USER_LVL_SHFTR_EN_5FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x004, 0xDF0D767BU); //lockprintf(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_WriteRegQ3: 下载位流后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