Cyclone V SoC 从SDRAM运行裸机应用调试异常问题求助
问题根因与解决方案
根因定位
你遇到的复位问题由多个已知的Cyclone V SoC调试适配问题共同导致:
- Ubuntu源安装的OpenOCD 0.10.0版本过旧,缺少Cyclone V SoC的复位、USB Blaster II驱动的适配补丁
- 未手动关闭HPS默认开启的看门狗,程序运行后未喂狗触发自动复位
- 调试初始状态下MMU、Cache处于开启状态,与裸机程序的地址映射预期不匹配
- 缺少SDRAM、HPS时钟的初始化流程,直接访问未初始化的SDRAM触发数据异常导致CPU复位
修复步骤
1. 替换OpenOCD版本
弃用Ubuntu 18源自带的OpenOCD 0.10.0,使用以下两种方案二选一:
- 直接使用SoC EDS 20.1自带的OpenOCD,路径默认位于
intelFPGA_lite/20.1/embedded/openocd/bin/openocd,该版本已经集成Altera官方的Cyclone V适配补丁 - 自行编译OpenOCD 0.12及以上版本,编译时开启USB Blaster II驱动支持
2. 修正OpenOCD配置
修改altera_fpgasoc.cfg配置:
- 删除
adapter_khz 1000配置项,USB Blaster II不支持动态调节速率,该配置会导致速率适配报错 - 新增复位配置:
reset_config srst_only srst_pulls_trst,解决日志中how to reset的复位逻辑报错 - 在
cycv_dbginit函数中新增关闭看门狗的操作,避免看门狗自动复位:
proc cycv_dbginit {target} { # 关闭HPS看门狗 mww 0xFFD02008 0x00000000 # General Cortex-A8/A9 debug initialisation cortex_a dbginit }
3. 增加调试启动初始化流程
GDB连接到OpenOCD之后、加载程序之前,先执行以下操作关闭MMU、Cache,避免地址映射异常:
# 关中断、切换到管理模式 set $cpsr = 0x1D3 # 关MMU、ICache、DCache mcr p15, 0, $r0, c1, c0, 0 # 清空TLB mcr p15, 0, $r0, c8, c7, 0
也可以将上述逻辑加到OpenOCD的gdb-attach事件中,attach后自动执行。
4. 裸机程序添加初始化代码
如果需要跳过U-Boot预启动步骤直接调试,将U-Boot中HPS时钟初始化、SDRAM控制器初始化、I/O引脚配置的汇编代码,添加到裸机程序的启动头文件中,在进入应用逻辑前完成所有硬件初始化,避免访问未就绪的硬件模块触发异常。
内容的提问来源于stack exchange,提问作者Jake549
相关产品推荐
相关产品推荐

