小库里 发表于 2025-5-25 23:04

STM32G0 中断中的变量 Memory Fault/HardFault

用 STM32Cube IDE开发STM32G071在 Scanning Mode 上作 7 段 。每 20 毫秒还在比较器中断内递减计数器值 。1) 有时程序会因 Hard Fault 而挂起,2)中断内发生 Memory Fault/HardFault。

stormwind123 发表于 2025-5-26 12:28

内存访问未对齐?

probedog 发表于 2025-5-26 12:29

可能是因为堆栈溢出吧!

classroom 发表于 2025-5-26 12:30

非法地址访问,指针未初始化或野指针?

flycamelaaa 发表于 2025-5-26 18:20

总线错误或者是中断时序冲突吧。。

powerantone 发表于 2025-5-26 19:30

禁用中断保护。

公羊子丹 发表于 2025-5-27 07:40

会不会是中断里访问了未初始化的指针或非法内存?建议用 __attribute__((section(".noinit"))) 保持变量有效。

周半梅 发表于 2025-5-27 07:41

建议检查变量是不是在 ISR 中被频繁访问导致栈溢出?尤其是局部变量。

帛灿灿 发表于 2025-5-27 07:42

你中断里有用到数组或者指针操作吗?HardFault 很容易是越界访问造成的。

童雨竹 发表于 2025-5-27 07:42

试试看把中断中用的变量声明成 volatile 的,防止编译器优化出问题。

万图 发表于 2025-5-27 07:43

我之前遇到类似的问题,最后发现是主循环和中断同时修改一个变量没加保护,试试关中断或加 __disable_irq()。

Wordsworth 发表于 2025-5-27 07:44

STM32G0 RAM 比较小,如果你在中断里递归或用了太多临时变量,很容易爆栈。

Bblythe 发表于 2025-5-27 07:45

中断时间是不是太频繁了?20ms 本身不快,但嵌套中断或处理太重也会触发异常。

Pulitzer 发表于 2025-5-27 07:45

建议在 HardFault_Handler 里 dump 一下栈看看触发的位置,CubeIDE 支持。

Uriah 发表于 2025-5-27 07:46

可以试试 ST 提供的 HardFault 分析工具,看看是哪个地址访问非法。

Clyde011 发表于 2025-5-27 07:47

我有一次是 HAL 库中用了 HAL_Delay 在中断里,结果直接挂,建议中断别用阻塞函数。
页: [1]
查看完整版本: STM32G0 中断中的变量 Memory Fault/HardFault