Zynq FPGA UART程序固化完整流程文档

一、概述

本文档详细记录了将UART循环打印程序固化到Zynq FPGA开发板的完整流程。通过FSBL(First Stage Boot Loader)引导程序,实现上电后自动运行UART打印程序。

二、固化前准备

2.1 硬件准备

  • Zynq开发板(如ZedBoard、ZCU102等)
  • USB-JTAG下载器
  • USB转串口线
  • 存储介质(SD卡或QSPI Flash)
  • 电源适配器

2.2 软件准备

  • Vivado Design Suite(包含Vitis)
  • 串口调试助手(如Putty、SecureCRT)
  • 硬件描述文件(.xsa文件)

三、文件系统结构

3.1 所需文件清单

text

固化项目/ ├── fsbl_platform/ # FSBL平台工程 ├── uart_app/ # UART应用程序工程 ├── hardware/ │ └── system.bit # 硬件比特流文件 └── output/ ├── fsbl.elf # FSBL引导程序 ├── uart_app.elf # UART应用程序 ├── system.bit # 硬件比特流 ├── boot.bif # 引导镜像描述文件 └── boot.bin # 最终固化文件

3.2 文件说明

文件名后缀作用来源
fsbl.elf.elf第一阶段引导程序Vitis生成
uart_app.elf.elfUART应用程序Vitis编译
system.bit.bit硬件配置比特流Vivado导出
boot.bif.bif引导镜像描述文件手工创建
boot.bin.bin最终固化文件bootgen生成

四、详细操作步骤

4.1 步骤1:创建FSBL引导程序

4.1.1 在Vitis中创建Platform Project
  1. 打开Vitis软件
  2. File → New → Platform Project
  3. 输入项目名称:fsbl_platform
  4. 选择硬件描述文件(.xsa文件)
  5. 点击Finish
4.1.2 编译FSBL
  1. 在Project Explorer中右键点击fsbl_platform
  2. 选择Build Project
  3. 等待编译完成
4.1.3 获取fsbl.elf文件

编译完成后,文件位于:

text

fsbl_platform/export/fsbl_platform/sw/fsbl_platform/boot/fsbl.elf

4.2 步骤2:创建UART应用程序

4.2.1 创建Application Project
  1. File → New → Application Project
  2. 项目名称:uart_app
  3. 选择平台:fsbl_platform
  4. 选择模板:Hello World(自动生成main.c)
  5. 点击Finish
4.2.2 替换代码
  1. 打开 uart_app/src/main.c
  2. 删除原有代码,粘贴以下UART测试代码:

c

#include <stdio.h> #include "xil_printf.h" #include "xil_types.h" #include "xparameters.h" #include "xuartps.h" // 全局变量 XUartPs UartInst; u8 data_buffer[64]; u32 counter = 0; // 初始化UART int init_uart() { XUartPs_Config *Config; int Status; // 查找UART配置 Config = XUartPs_LookupConfig(XPAR_PS7_UART_0_DEVICE_ID); if (Config == NULL) { return XST_FAILURE; } // 初始化UART Status = XUartPs_CfgInitialize(&UartInst, Config, Config->BaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } // 设置波特率115200 XUartPs_SetBaudRate(&UartInst, 115200); // 自检 Status = XUartPs_SelfTest(&UartInst); if (Status != XST_SUCCESS) { return XST_FAILURE; } return XST_SUCCESS; } // 主函数 int main() { int i; // 初始化UART if (init_uart() != XST_SUCCESS) { return -1; } // 发送启动信息 XUartPs_Send(&UartInst, (u8*)"\r\n=== UART Test Application ===\r\n", 34); XUartPs_Send(&UartInst, (u8*)"Starting continuous transmission...\r\n", 39); // 主循环 while (1) { // 填充数据 for (i = 0; i < 64; i++) { data_buffer[i] = (counter + i) & 0xFF; } counter++; // 发送数据 XUartPs_Send(&UartInst, data_buffer, 64); // 发送换行 XUartPs_Send(&UartInst, (u8*)"\r\n", 2); // 延时约1秒 for (i = 0; i < 10000000; i++); } return 0; }

4.2.3 验证链接地址
  1. 打开 uart_app/lscript.ld 链接脚本
  2. 确认关键配置:ldMEMORY { ps7_ddr_0 : ORIGIN = 0x00100000, LENGTH = 0x1FF00000 /* ... */ } .text : { *(.text) } > ps7_ddr_0 /* 确保.text段在DDR中 */
  3. 关键点:应用程序起始地址必须是 0x00100000
4.2.4 编译应用程序
  1. 右键点击 uart_app 项目
  2. 选择 Build Project
  3. 验证编译成功(无错误)

4.3 步骤3:验证应用程序地址

4.3.1 方法一:使用objdump命令

bash

# 在Vitis Terminal中执行 arm-none-eabi-objdump -h uart_app.elf | grep ".text"

正确输出示例

text

.text 00000500 00100000 00100000 00001000 2**2

关键检查:第三列(VMA)必须是 00100000

4.3.2 方法二:查看.map文件
  1. 打开 uart_app/Debug/uart_app.map
  2. 搜索 .text 查看地址

4.4 步骤4:生成BOOT.BIN文件

4.4.1 准备三个必需文件
  1. fsbl.elf - 从FSBL项目复制
  2. system.bit - 从Vivado硬件工程导出
  3. uart_app.elf - 从UART项目编译得到

将三个文件复制到同一目录(如 output/

4.4.2 创建BIF描述文件

在 output/ 目录下创建 boot.bif 文件,内容:

text

the_ROM_image: { [bootloader] fsbl.elf system.bit uart_app.elf }

4.4.3 生成BOOT.BIN

方法A:使用Vitis GUI

  1. 菜单栏:Xilinx → Create Boot Image
  2. 点击 Add 依次添加:
    • fsbl.elf(类型选择 bootloader
    • system.bit
    • uart_app.elf
  3. 设置输出路径
  4. 点击 Create Image

方法B:使用命令行

bash

cd output bootgen -image boot.bif -arch zynq -o boot.bin -w on

4.4.4 验证生成结果
  • 生成的文件:boot.bin
  • 文件大小:约3-5MB
  • 如果失败,检查文件顺序和类型设置

4.5 步骤5:烧写到存储设备

4.5.1 方法一:SD卡启动(测试用)
  1. 格式化SD卡为FAT32格式
  2. 复制boot.bin到SD卡根目录
  3. 设置开发板为SD卡启动模式(跳线设置)
  4. 插入SD卡,连接串口线
  5. 上电启动
4.5.2 方法二:QSPI Flash固化(永久)
  1. 连接JTAG和串口线
  2. 打开Vivado → Hardware Manager
  3. Open Target → Auto Connect
  4. 右键开发板 → Add Configuration Memory Device
  5. 选择Flash型号(常见:mt25ql256aba
  6. 选择 boot.bin 文件
  7. 点击 Program,等待完成
  8. 重要:烧写完成后
    • 断开JTAG
    • 关闭电源
    • 设置为QSPI启动模式
    • 重新上电

4.6 步骤6:测试验证

4.6.1 串口设置
  • 串口软件:Putty/SecureCRT
  • 波特率:115200
  • 数据位:8
  • 停止位:1
  • 校验位:None
  • 流控制:None
4.6.2 预期输出

上电后串口应输出:

text

=== UART Test Application === Starting continuous transmission... [然后是连续的十六进制数据]

4.6.3 成功标志
  • 上电后自动运行,无需JTAG
  • 串口连续输出数据
  • 断电重启后仍然正常运行

五、故障排除

5.1 常见问题及解决

问题现象可能原因解决方案
无串口输出波特率不匹配检查串口设置为115200
卡在FSBL阶段应用程序地址错误验证.elf文件起始地址为0x00100000
程序不运行BIN文件生成顺序错误确保顺序:fsbl → bit → app
启动失败启动模式设置错误检查开发板跳线设置
部分运行后停止堆栈大小不足修改链接脚本增加堆栈空间

5.2 调试技巧

5.2.1 添加调试信息

在应用程序开头添加:

c

// 在main函数开始处 XUartPs_Send(&UartInst, (u8*)"App Started!\r\n", 14);

5.2.2 验证硬件连接

c

// 强制发送测试字符 volatile u32 *uart = (u32*)0xE0001000; *uart = 'A';

5.3 关键检查点清单

  • FSBL编译成功(fsbl.elf存在)
  • 应用程序编译成功(uart_app.elf存在)
  • 应用程序起始地址为0x00100000
  • boot.bif文件顺序正确
  • boot.bin生成成功
  • SD卡为FAT32格式
  • boot.bin在SD卡根目录
  • 开发板启动模式正确
  • 串口波特率115200
  • 串口线TX/RX连接正确

六、进阶配置

6.1 修改启动延时

在FSBL中可修改启动延时,给用户中断引导的机会:

c

// 在fsbl_main.c中添加 int timeout = 3; // 3秒延时 while (timeout-- > 0 && !CheckUartInput()) { fsbl_printf("Booting in %d seconds...\r\n", timeout); Delay(1000); }

6.2 多应用程序支持

可通过修改FSBL实现多应用程序选择:

c

// 根据按键选择不同应用 if (ReadBootPin() == 0) { // 启动UART测试程序 HandoffAddress = 0x00100000; } else { // 启动其他应用程序 HandoffAddress = 0x00200000; }

6.3 安全性增强

  • 添加应用程序校验和验证
  • 实现安全启动流程
  • 加密固件保护

七、注意事项

7.1 重要提醒

  1. 不要修改FSBL的跳转逻辑,除非你完全理解其工作原理
  2. 应用程序不能使用地址0x00000000-0x000FFFFF区域(FSBL使用)
  3. 固化前务必先用SD卡测试,确认程序能正常运行
  4. QSPI Flash烧写后必须断电重启,不能热复位

7.2 文件管理建议

  1. 保留每个版本的.elf和.bin文件
  2. 记录每次固化的配置参数
  3. 使用版本控制系统管理源码

7.3 性能优化

  1. 减少启动时间:优化应用程序初始化代码
  2. 减小固件大小:移除不必要的库和代码
  3. 提高可靠性:添加看门狗和错误恢复机制

八、附录

8.1 相关命令参考

bash

# 查看ELF文件信息 arm-none-eabi-objdump -h file.elf arm-none-eabi-readelf -a file.elf # 生成反汇编代码 arm-none-eabi-objdump -d file.elf > disassembly.txt # 查看文件大小 arm-none-eabi-size file.elf

8.2 常用内存地址

地址范围用途说明
0x00000000-0x0003FFFFFSBL区域引导程序使用
0x00100000-0x001FFFFF应用程序区主程序放置位置
0xE0000000-0xE00FFFFF外设寄存器UART、GPIO等

8.3 开发板启动模式设置

开发板SD卡模式QSPI模式JTAG模式
ZedBoardMIO5-0: 111010MIO5-0: 000010MIO5-0: 111111
ZCU102SW6: 000010SW6: 001010SW6: 111111
PYNQ-Z2J12: SD模式J12: QSPI模式J12: JTAG模式

文档版本: 1.0
最后更新: 2026年01月
适用平台: Xilinx Zynq-7000系列
注意事项: 本流程基于Vitis 2019.2版本,其他版本可能略有差异

Read more

SeargeSDXL终极指南:AI绘画工作流完整教程

SeargeSDXL终极指南:AI绘画工作流完整教程 【免费下载链接】SeargeSDXLCustom nodes and workflows for SDXL in ComfyUI 项目地址: https://gitcode.com/gh_mirrors/se/SeargeSDXL 你面临的AI绘画难题 当你开始接触AI绘画时,是否经常遇到这些问题:生成效果不稳定,参数调节复杂,高分辨率图片质量下降,多模型切换困难?这正是SeargeSDXL要为你解决的核心痛点。 作为ComfyUI平台上的专业级AI绘画工具,SeargeSDXL通过精心设计的工作流系统,将复杂的AI绘画过程转化为直观的可视化操作。无论你是专业创作者还是AI绘画爱好者,都能在这里找到高效的解决方案。 核心功能模块解析 智能工作流管理 SeargeSDXL的最大亮点在于其模块化的工作流设计。每个功能模块都经过优化,从图像输入到最终输出,整个流程清晰可见。 从上图可以看到,界面分为三个主要区域:左侧的图像输入与遮罩编辑,中央的文本提示控制,以及右侧的参数精细调节。这种设计让你能够专注于创作本身,而

无人机遥感航拍巡检数据集 无人机遥感图像识别 无人机视角山区泥石流和滑坡图像识别数据集-数据集第10067期

无人机遥感航拍巡检数据集 无人机遥感图像识别 无人机视角山区泥石流和滑坡图像识别数据集-数据集第10067期

滑坡检测数据集核心信息介绍 ** 这个滑坡检测数据集主要用于目标检测任务,整体数据规模和细节都比较明确。从数量上看,数据集总共包含 1660 张图像, 往期热门主题 主题搜两字"关键词"直达 代码数据获取: 获取方式:***文章底部卡片扫码获取*** 覆盖了YOLO相关项目、OpenCV项目、CNN项目等所有类别, 覆盖各类项目场景(包括但不限于以下----欢迎咨询定制): 项目名称项目名称基于YOLO+deepseek 智慧农业作物长势监测系统基于YOLO+deepseek 人脸识别与管理系统基于YOLO+deepseek 无人机巡检电力线路系统基于YOLO+deepseek PCB板缺陷检测基于YOLO+deepseek 智慧铁路轨道异物检测系统基于YOLO+deepseek 102种犬类检测系统基于YOLO+deepseek 人脸面部活体检测基于YOLO+deepseek 无人机农田病虫害巡检系统基于YOLO+deepseek 水稻害虫检测识别基于YOLO+deepseek 安全帽检测系统基于YOLO+deepseek 智慧铁路接触网状态检测系统基于YOLO+

3个步骤让石头扫地机器人无缝接入HomeAssistant智能家居

还在为频繁切换Roborock官方APP和HomeAssistant而烦恼吗?这个专为石头扫地机器人设计的集成插件,能够让你的清洁设备真正融入智能家居生态,实现自动化联动控制。 【免费下载链接】homeassistant-roborockRoborock integration for Home Assistant. This integration uses your devices from the Roborock App 项目地址: https://gitcode.com/gh_mirrors/ho/homeassistant-roborock 为什么选择这个集成方案? 传统的Xiaomi集成存在地图请求次数限制,而这个定制化方案完美解决了这个问题。通过本地网络通信,你可以同时使用官方APP和HomeAssistant,无需在两者之间做出妥协。 核心优势: * 🚫 无地图请求限制 * 📱 可与官方APP并行使用 * 🗺️ 内置实时地图显示 * 🔧 丰富的自定义服务 第一步:快速安装集成插件 通过HACS安装(推荐) 1. 打开HomeAss

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

2026年,我整理了中国 200 多家机器人(具身智能)公司名单

近几年,机器人行业突然变得异常热闹。尤其是2022年9月特斯拉首次亮相具身智能人形机器人 Optimus 之后,国内外都掀起了一波浪潮。2023年之后,国内出现了一批新的人形机器人公司,为了更好地理解这个行业,我整理了一份中国机器人企业名单,包含200 多家企业,涵盖人形机器人、工业机器人、移动机器人、服务机器人、特种机器人等领域。 注:名单中的企业排序没有特殊含义,仅表示本人收集信息的先后顺序。 序号企业简称总部成立时间主营产品网址企业全称1优必选深圳2012年人形机器人、轮式机器人https://ubtrobot.com深圳市优必选科技股份有限公司2宇树科技杭州2016年四足机器狗、人形机器人https://unitree.com宇树科技股份有限公司3智元上海2023年四足、轮式、双足人形机器人、具身模型https://zhiyuan-robot.com智元创新(上海)科技股份有限公司4海康机器人杭州2016年机器视觉、移动机器人https://hikrobotics.com杭州海康机器人股份有限公司5傅利叶上海2015年康复机器人、双足人形机器人、灵巧手https://f