ST意法半导体
直播中

golabs

9年用户 960经验值
擅长:可编程逻辑 电源/新能源 MEMS/传感技术 测量仪表
私信 关注
[问答]

keil在debug时出现Cannot access Memory*** error 122: AGDI: memory read failed (0xF81AF008)的原因?怎么解决?

使用的开发板是ST官方的板子NUCLEO-G474RE,程序能用ST-Link烧录进去,但是没有现象(用的STM32CubeMx配置的初始化)。debug后发现程序直接跑飞了,command一直报:“Cannot access Memory”“*** error 122: AGDI: memory read failed (0xF81AF008)”。

回帖(1)

他在笑

2025-4-27 17:15:59

针对Keil调试时出现的“Cannot access Memory”和“AGDI: memory read failed (0xF81AF008)”错误,以下是逐步解决方案:


1. 检查调试配置



  • 目标设备选择:在Keil的 Options for Target → Device 中确认选择的是正确的芯片型号 STM32G474RE

  • 调试接口设置:在 Debug 选项卡中,确保ST-Link的接口模式为 SWD,并尝试降低SWD时钟速度(如从4 MHz降至1 MHz)。

  • 复位控制:勾选 Reset and Run,确保程序烧录后自动复位。


2. 验证启动文件与链接脚本



  • 启动文件:确认CubeMX生成的启动文件(如startup_stm32g474xx.s)正确匹配芯片型号,并检查堆栈大小(Stack_SizeHeap_Size是否过小)。

  • 链接脚本:检查.sct文件中的Flash和RAM地址范围是否正确(Flash起始地址应为0x08000000,RAM为0x20000000)。


3. 排查代码问题



  • 最小化测试:创建一个仅点亮LED的简单程序,验证硬件和工具链是否正常。

  • 指针与数组越界:检查代码中的指针操作和数组访问,尤其是动态内存或外设寄存器操作。

  • 外设时钟初始化:确认所有使用的外设(如GPIO、UART等)已通过__HAL_RCC_xxx_CLK_ENABLE()开启时钟。


4. 分析硬件错误



  • 查看异常状态寄存器:在调试时,通过 Memory Window 查看 SCB->HFSR(地址0xE000ED30)的值,确定硬件错误类型(如FORCED、VECTTBL)。

  • 检查PC指针:当程序跑飞时,暂停调试并查看 Disassembly Window,确认PC是否指向非法地址(如0xF81AF008可能表示异常处理错误)。


5. 更新固件与驱动



  • 升级ST-Link固件:使用ST-Link Utility或STM32CubeProgrammer更新ST-Link的固件。

  • 确认Keil版本:确保Keil MDK为最新版本,避免兼容性问题。


6. 优化与配置调整



  • 降低编译器优化等级:在 Options for Target → C/C++ 中设置优化等级为 -O0,排除优化导致的异常。

  • 禁用看门狗:若启用了独立看门狗(IWDG)或窗口看门狗(WWDG),暂时禁用以避免误触发复位。


7. 硬件检查



  • 电源稳定性:确保开发板供电充足,避免电压不稳导致芯片异常。

  • 连接可靠性:检查ST-Link与开发板的SWD接线是否接触良好,必要时重新插拔。


8. 调试启动过程



  • 单步执行启动代码:在调试模式下,从Reset_Handler开始单步执行,观察是否在初始化阶段(如SystemInit函数)出现错误。

  • 中断向量表检查:确认向量表地址正确(通常为Flash起始地址),且未在运行时被意外修改。


9. 替换环境验证



  • 使用其他IDE测试:如STM32CubeIDE,验证问题是否与Keil配置相关。

  • 更换开发板:若可能,用另一块NUCLEO-G474RE测试,排除硬件故障。


10. 深入分析错误地址



  • 地址0xF81AF008可能属于Cortex-M4的保留内存区域,通常由以下原因触发:

    • 无效指令执行:程序计数器(PC)跳转到未定义的代码区域。

    • 总线访问冲突:尝试访问未映射的外设或非法内存地址。

    • 堆栈溢出:检查.map文件中堆栈使用情况,增大Stack_Size(如0x800)。



示例操作步骤(Keil环境)



  1. 复位并暂停:点击调试界面的 Reset 按钮,再点击 Stop

  2. 查看寄存器:在 Register Window 中检查 PCLRSP 的值。

  3. 检查内存映射:通过 Memory Window 输入0xF81AF008,确认该地址是否可读。

  4. 查看异常信息:输入 SCB->HFSR 的值,若为 0x40000000 表示强制异常(需进一步分析 SCB->CFSR)。


总结


该错误通常由程序跑飞或非法内存访问引起,需结合硬件错误寄存器、代码审查和调试配置调整综合排查。优先通过最小化测试和单步调试定位问题根源。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分