STM32G0 中断中的变量 Memory Fault/HardFault
用 STM32Cube IDE开发STM32G071在 Scanning Mode 上作 7 段 。每 20 毫秒还在比较器中断内递减计数器值 。1) 有时程序会因 Hard Fault 而挂起,2)中断内发生 Memory Fault/HardFault。内存访问未对齐? 可能是因为堆栈溢出吧! 非法地址访问,指针未初始化或野指针? 总线错误或者是中断时序冲突吧。。 禁用中断保护。 会不会是中断里访问了未初始化的指针或非法内存?建议用 __attribute__((section(".noinit"))) 保持变量有效。 建议检查变量是不是在 ISR 中被频繁访问导致栈溢出?尤其是局部变量。 你中断里有用到数组或者指针操作吗?HardFault 很容易是越界访问造成的。 试试看把中断中用的变量声明成 volatile 的,防止编译器优化出问题。 我之前遇到类似的问题,最后发现是主循环和中断同时修改一个变量没加保护,试试关中断或加 __disable_irq()。 STM32G0 RAM 比较小,如果你在中断里递归或用了太多临时变量,很容易爆栈。 中断时间是不是太频繁了?20ms 本身不快,但嵌套中断或处理太重也会触发异常。 建议在 HardFault_Handler 里 dump 一下栈看看触发的位置,CubeIDE 支持。 可以试试 ST 提供的 HardFault 分析工具,看看是哪个地址访问非法。 我有一次是 HAL 库中用了 HAL_Delay 在中断里,结果直接挂,建议中断别用阻塞函数。
页:
[1]