【问题标题】:STM32 Hardfault when trying to access memorySTM32 尝试访问内存时出现硬故障
【发布时间】:2022-01-21 23:11:28
【问题描述】:

我正在分析为 STM32H730 微控制器编写的代码。我发现下面的代码 sn-p 在调用 BootHoldRequest(&fnBoot) 时给出了硬故障。

#define BOOTBLOCK_ADD        0x08000000L
#define BootHoldRequest        (*((BOOTLOAD_PROCEED_TYPE *) (BOOTBLOCK_ADD + 0x200)))

typedef void (* CALLBACK_PTR)(void);
typedef uint16_t BOOTLOAD_PROCEED_TYPE(CALLBACK_PTR *);

typedef void (* VOID_FUN_TYPE)(void);
static VOID_FUN_TYPE fnBoot;

if (BootHoldRequest(&fnBoot)) //<--------- HARDFAULT
{
       
}

【问题讨论】:

  • 您的设备内存映射是什么样的?您确定提供的地址是正确的吗?
  • @Someprogrammerdude 我已将 BOOTBLOCK_ADD 更改为 0x08000000L,这是根据参考手册的正确地址。仍然出现硬故障。
  • 预期类型的​​函数是如何到达该地址的?
  • 还有BootHoldRequest(&amp;fnBoot) 有什么意义?它不是一个有效的类似函数的宏。您是如何进行此编译的?
  • @Lundin BootHoldRequest 是一个宏,它将值(地址)转换为指向函数的指针,然后调用该函数。

标签: c arm embedded stm32


【解决方案1】:

由于没有看到整个项目(包括链接器脚本等)就不可能回答你的问题,我只会展示如何调试这个问题。

  1. 这段代码有什么作用?
if (BootHoldRequest(&fnBoot))

        ldr     r0, .L6
        ldr     r3, .L6+4
        bx      r3
.L6:
        .word   .LANCHOR0
        .word   0x8000200

它从BOOTBLOCK_ADD + 0x200 位置加载4 字节地址,然后调用位于该地址的代码。我不知道你那里的数据是否正确,所以你需要自己检查。

如果您使用 IDE(在我的示例中为 Atollic - 与 STM32Cube IDE 几乎相同),您可以轻松检查它。

两种方法: 在这一行设置断点。

  1. 使用表达式窗口查看此地址的内容:
  2. 进入指令调试模式

并按照当时的代码一条汇编指令进行操作。您将看到代码是否完成了它应该做的事情。 这不是你的代码。这是我从事的项目中的代码。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 2021-01-29
    • 2021-09-19
    • 2020-07-13
    • 2016-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多