zynq程序固化补充篇: 不切换启动模式强制烧写

在使用Xilinx SDK 2018.2进行首次QSPI模式Flash烧录时遇到错误,需要切换到JTAG模式才能完成。问题起因于2017.3版本后Xilinx对QSPI编程的改动,要求使用特定的FSBL。解决方案是在FSBL的main.c中添加代码强制进入JTAG模式以避免从Flash加载分区。此问题在后续烧录时不再出现,但调试仍需回到JTAG模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

  使用SDK2018.2第一次进行烧写 Flash,在qspi模式下会报错,只有切换至jtag模式下才可以进行烧录,后续的再次烧录不会出现类似问题。但是调试的时候必须切回jtag模式(将BOOT MODE 5拉低才可以调试)
  2017.2等版本时不会存在类似问题
  硬件设计的更改在很多时候终归没有软件的更改灵活,有没有一种办法可以在不修改启动模式的情况下通过软件的修改强制烧写进去呢?

解决思路

在这里插入图片描述
  如图为Zynq BOOT MODE配置,MIO[5:3]为Boot Devices设置为100,可以看出MIO[5]引脚为高时为QSPI模式,MIO[5]引脚为低时为JTAG Boot Mode模式。在硬件设计上面是将MIO上拉电阻,预留了下拉电阻
  用sdk烧写时可以在交互窗口中找到如下打印信息:

在这里插入图片描述
  确定现象后查阅xilinx相关文档说明,发现从VIVADO 2017.3版本开始,Xilinx官方为了使Zynq-7000和Zynq UltraScale +实现流程相同,在QSPI FLASH使用上做了变化,即Zynq-7000编程flash需要“指定的fsbl”。这个fsbl用于初始化系统(主要是运行ps7_init()函数)。
  通过分析可知下载QSPI FLASH 的“指定的fsbl”文件与生成boot.bin文件的fsbl文件不同,这里是不能混淆的。
  而QSPI编程要求器件以JTAG模式启动。(因为在QSPI引导模式下启动,则“指定的fsbl”将尝试从flash加载分区,从而导致flash编程的错误行为。导致不能下载flash或下载flash后不能启动。)
  下图是官方解决办法的原始说明
在这里插入图片描述

最终办法:

  也就是说通过在“指定的fsbl”中的main.c中如下位置添加如下语句,防止FSBL在编程运行时从Flash设备加载任何现有分区。

/*
 * Read bootmode register
 */
BootModeRegister = Xil_In32(BOOT_MODE_REG);
BootModeRegister &= BOOT_MODES_MASK;

//add this line to trick boot mode to JTAG
BootModeRegister = JTAG_MODE;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快跑bug来啦

创作不易,来点动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值