FMQL15T开发板QSPI Flash固化教程:手把手教你生成和烧录BOOT.bin

张开发
2026/4/11 13:33:39 15 分钟阅读

分享文章

FMQL15T开发板QSPI Flash固化教程:手把手教你生成和烧录BOOT.bin
FMQL15T开发板QSPI Flash固化实战指南从零构建可靠启动镜像在嵌入式系统开发中确保设备上电后能够自动加载并执行固件是基础中的基础。对于采用复旦微FMQL15T芯片的开发板而言QSPI Flash固化是实现这一目标的关键步骤。不同于简单的程序下载完整的固化流程涉及硬件配置、软件工程设置、启动文件生成和烧录验证等多个环节任何一步的疏漏都可能导致系统无法正常启动。本文将带你深入理解FMQL15T的启动机制并通过详细的实操演示教你如何生成可靠的BOOT.bin文件并成功固化到QSPI Flash中。无论你是第一次接触FMQL系列芯片还是已经有过相关开发经验但遇到固化问题这篇指南都能提供系统性的解决方案。1. 开发环境准备与基础概念在开始实际操作前我们需要确保开发环境配置正确并理解几个核心概念。FMQL15T采用ARM Cortex-A7架构其启动过程相比传统单片机更为复杂。系统上电后首先会执行芯片内部ROM中的代码这段代码会从QSPI Flash的特定位置加载First Stage Bootloader(FSBL)。必备工具清单Vivado 2018.3或更高版本复旦微提供定制补丁IAR Embedded Workbench for ARM 8.32Procise配置工具复旦微专用FMQL15T开发板及配套JTAG调试器USB转串口工具用于调试输出关键概念解析BOOT.bin包含FSBL、硬件比特流(bitstream)和应用程序的复合镜像文件QSPI Flash串行闪存用于存储启动镜像支持XIP(Execute In Place)特性FSBL第一级引导程序负责初始化DDR、加载应用程序等基础硬件配置注意使用前务必确认所有工具均为复旦微官方推荐的版本不同版本间可能存在兼容性问题导致固化失败。开发板连接方面需要确保JTAG接口正确连接至调试器串口线连接至PS_UART接口QSPI Flash芯片供电稳定部分开发板需要单独供电启动模式跳线设置为QSPI启动通常为BOOT[2:0]3b0012. Vivado工程关键配置详解Vivado工程配置是整个固化流程的基础错误的硬件配置会导致后续所有步骤徒劳无功。我们以最常见的AXI GPIO工程为基础演示如何修改为支持QSPI启动的配置。2.1 创建工程副本为防止原始工程被修改建议首先创建副本cp -r FQML_AXI_GPIO qspi_program cd qspi_program vivado FQML_AXI_GPIO.xpr 在Vivado界面中通过File Project Save As...将工程另存为qspi_program。这一步骤确保原始工程保持完整方便出现问题时的对照排查。2.2 处理器外设配置在Block Design中双击ZYNQ7 Processing System核进行关键配置DDR配置使能DDR控制器选择正确型号MT41J256M16 RE-125检查时序参数是否自动填充正确串口配置使能PS_UART1波特率保持默认115200注意引脚分配是否与开发板一致QSPI关键设置参数项推荐值注意事项接口模式Quad SPI确保选择Quad而非Dual时钟频率120MHz过高可能导致稳定性问题闪存型号根据实际芯片选择通常为MT25QU系列数据总线宽度x4必须与硬件连接一致配置完成后建议进行以下验证运行Validate Design检查有无明显错误确认时钟配置中QSPI参考时钟源选择正确通常为PS_CLK检查地址映射中QSPI控制器是否被正确分配地址空间2.3 生成硬件比特流完成外设配置后按以下流程生成硬件描述文件右键Block Design选择Generate Output Products选择Generate生成HDL封装在Sources面板右键顶层HDL文件选择Create HDL Wrapper运行Generate Bitstream此过程可能需要较长时间约10-30分钟取决于电脑性能。生成完成后务必检查以下文件是否生成qspi_program.runs/impl_1/*.bit比特流文件qspi_program.srcs/sources_1/bd/*/hw_handoff/*.hdf硬件描述文件提示如果遇到时序违例警告可尝试降低QSPI时钟频率或运行Report Timing Summary进行详细分析。3. Procise工程配置与IAR项目准备Procise是复旦微提供的专用配置工具用于生成启动镜像和配置底层参数。这一步骤将Vivado的输出转换为可用的软件开发环境。3.1 新建Procise工程启动Procise工具选择File New Project指定工程路径建议与Vivado工程同级目录选择Import from Vivado选项导航至Vivado生成的.hdf文件位置导入成功后工程应包含以下基本结构qspi_program_prj/ ├── bsp/ ├── constraints/ ├── drivers/ └── templates/3.2 生成IAR工程模板在Procise界面选择Project Export Project Template选择IAR Embedded Workbench作为目标IDE指定输出目录建议新建iar_project文件夹勾选Generate FSBL project选项生成完成后在指定目录应看到两个IAR工程fsbl_fmql15t引导加载程序工程hello_world示例应用程序工程3.3 关键代码修改在IAR中打开fsbl工程需要进行以下必要修改xparameters.h文件// 注释掉原有包含 // #include xparameters_ps.h // 替换为复旦微专用头文件 #include fmsh_common.hxgpio_l.h文件// 修改IO操作宏定义 #define XGpio_In32(addr) FMSH_ReadReg(addr,0x0) #define XGpio_Out32(addr,data) FMSH_WriteReg(addr,0x0,data)bspconfig.h配置调整#define FSBL_DEBUG_INFO 1 // 启用调试信息 #define QSPI_CLK_FREQ 120000000 // 必须与Vivado配置一致 #define DDR_MEMORY_MODE 0x80000000 // DDR映射地址对于应用程序工程如hello_world主函数应包含必要的硬件初始化int main() { FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x008, 0xDF0D767BU); FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x838, 0xf); FMSH_WriteReg(FPS_SLCR_BASEADDR, 0x004, 0xDF0D767BU); while(1) { // 应用程序主循环 } return 0; }4. 生成BOOT.bin全流程BOOT.bin是固化过程的核心文件它包含了系统启动所需的所有组件。正确的生成顺序和参数配置至关重要。4.1 准备组件文件确保以下文件准备就绪FSBL.out引导加载程序位于fsbl_fmql15t/Debug/目录硬件比特流Vivado生成的.bit文件应用程序.out如hello_world.out4.2 使用Procise生成BIF文件BIF(Boot Image Format)文件描述了BOOT.bin的组成结构在Procise中选择Tools Generate Boot Image选择Create new BIF file按顺序添加以下组件fsbl.out作为bootloadersystem.bit作为硬件配置hello_world.out作为应用程序生成的BIF文件内容示例//arch zynq; split false; format BIN the_ROM_image: { [bootloader]fsbl.out system.bit hello_world.out }4.3 生成最终BOOT.bin在Procise的Boot Image界面点击Add按钮依次添加三个组件确认加载顺序FSBL → Bitstream → Application设置输出文件名为BOOT.bin点击Generate按钮生成过程中需要注意三个文件必须来自同一构建版本确保输出路径无中文或特殊字符生成时间通常在1-3分钟常见问题处理若出现Invalid ELF file错误检查.out文件是否完整若提示Address conflict确认应用程序链接脚本中的地址与硬件配置一致生成的文件大小异常小100KB通常意味着某个组件未正确包含5. QSPI Flash烧录与验证成功生成BOOT.bin后下一步是将其烧录到开发板的QSPI Flash中。这一步骤需要精确配置烧录参数。5.1 硬件连接检查在开始烧录前确认开发板供电稳定建议使用稳压电源JTAG连接可靠接触不良会导致烧录失败串口终端已打开并配置正确115200-8-N-15.2 使用Procise烧录在Procise中选择PSOC Program Flash选择生成的BOOT.bin文件关键参数配置Flash类型QSPI烧录偏移量0x00000000编程算法选择对应Flash型号是否验证建议勾选点击Program开始烧录烧录过程通常需要1-5分钟控制台会显示进度信息。成功的烧录会在最后显示Programming completed successfully。5.3 启动验证烧录完成后断开开发板电源将启动模式设置为QSPI启动BOOT[2:0]001重新上电观察现象串口应有FSBL的启动信息输出应用程序应能正常执行如LED闪烁等若卡住可通过JTAG连接查看PC指针位置调试技巧若启动失败首先检查串口输出的错误信息使用JTAG调试FSBL在main函数设置断点确认DDR初始化是否正确完成测量QSPI时钟信号是否正常约120MHz6. 高级配置与优化技巧基础固化流程完成后下面介绍一些提升可靠性和启动效率的高级技巧。6.1 启动时间优化FMQL15T的启动时间主要消耗在QSPI Flash初始化DDR校准应用程序加载优化措施在FSBL中禁用不必要的硬件初始化使用预计算的DDR校准参数减小应用程序体积-Os优化等级启用QSPI的XIP模式直接执行代码6.2 多镜像备份策略为提高可靠性可以在QSPI Flash中存储多个BOOT.bin副本偏移地址用途大小0x00000000主镜像8MB0x00800000备份镜像8MB0x01000000用户数据区剩余空间对应的BIF文件修改the_ROM_image: { [load0x10000000]fsbl.out [load0x20000000]system.bit [load0x30000000]hello_world.out }6.3 错误处理机制在应用程序中添加Flash健康监测#define QSPI_STATUS_REG 0xE0000000 uint32_t check_flash_health(void) { uint32_t status FMSH_ReadReg(QSPI_STATUS_REG, 0); if(status 0x80000000) { // 检测到错误切换到备份镜像 switch_to_backup_image(); } return status; }7. 常见问题解决方案在实际操作中开发者常会遇到一些典型问题。以下是经过验证的解决方案。7.1 烧录失败问题排查现象Program Flash工具报错Failed to initialize flash解决步骤确认开发板供电充足特别是3.3V电源检查JTAG连接是否可靠尝试重新插拔降低QSPI时钟频率尝试改为60MHz更换Flash编程算法不同厂商芯片需要不同算法7.2 启动卡住问题现象串口输出部分启动信息后停止诊断方法通过JTAG连接暂停处理器查看PC位置检查DDR初始化是否完成查看相关寄存器确认应用程序链接地址是否正确测量系统各电源电压是否稳定7.3 性能不稳定问题现象系统偶尔启动失败或运行异常优化建议在Vivado中重新运行DDR时序分析加强电源滤波特别是DDR供电检查PCB布局确保时钟信号完整在FSBL中添加硬件自检代码在实际项目中遇到最棘手的问题是QSPI时钟抖动导致的随机启动失败。通过示波器捕获发现当时钟频率设置为120MHz时信号完整性较差。最终解决方案是在硬件上添加22Ω串联电阻并在软件中将频率降至108MHz。这个案例说明固化问题往往需要硬件和软件协同解决。

更多文章