硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1378|回复: 5
收起左侧

[STM32H7] 求助!!!STM32H730VBT6出现hardfault UNDEFINSTR

[复制链接]

2

主题

7

回帖

13

积分

新手上路

积分
13
发表于 2022-12-28 10:45:06 | 显示全部楼层 |阅读模式
问题及现象描述:       STM32H730VBT6做的电机驱动控制器,主频550MHZ,使能ICAHCE/DCACHE,在空载运行时可以持续运行(目前测试12H持续运行无问题),在带载40A(2KW)运行时,基本10min以内会出现hardfault,详见下列截图

图1 进入硬件错误中断,错误原因为执行未定义指令

图1 进入硬件错误中断,错误原因为执行未定义指令
      

图2 读取栈帧,查看进入错误中断前的状态

图2 读取栈帧,查看进入错误中断前的状态
           

图3 栈帧中对应的LR地址和FLASH中存储的程序指令

图3 栈帧中对应的LR地址和FLASH中存储的程序指令
      

图4 栈帧中对应的PC地址

图4 栈帧中对应的PC地址
      

图5 MPU配置

图5 MPU配置

图1 进入硬件错误中断,错误原因为执行未定义指令    图2 读取栈帧,查看进入错误中断前的状态               图3 栈帧中对应的LR地址和FLASH中存储的程序指令                   图4 栈帧中对应的PC地址                                 图5   MPU配置

由上述截图可了解到
1、图1,在进入hardfault_handler是因为触发了   执行未定义指令的故障,
2、图2,栈帧显示LR值为0x08007D27,即PC是执行的0x08007D22中的指令,机器码为F002FD01,即跳转到0x0800A728,且Flash中0x08007D22中存储的指令正确(图3),但是在栈帧中存储的PC值却是0x0802A728(与正确地址0x0800A728不一样,bit5意外翻转)
3、图4,栈帧中PC值0x0802A728地址处无任何代码,因此会出现  执行未定义指令故障


问题:
     为什么0x08007D22地址中存储的代码正确F002FD01,但是在执行的时候,却出现了一个bit位的翻转?将0X0800A728翻译成了0x0802A728?是否跟CACHE配置有关?或者是否是因为电流太大导致MCU受到干扰,应该如何排查?




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-12-28 11:11:34 | 显示全部楼层
1、首先这个错误是随机的吗,还是固定,出现异常了,基本都是bit翻转问题。如果是bit翻转,可以使能Flash和RAM的ECC校验监测的。
2、怀疑是干扰问题的话,可以使用屏蔽罩先将芯片或者找个设备屏蔽起来测试。还有就是你的通信接口都做隔离了没用,建议加上。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2022-12-28 11:44:26 | 显示全部楼层
eric2013 发表于 2022-12-28 11:11
1、首先这个错误是随机的吗,还是固定,出现异常了,基本都是bit翻转问题。如果是bit翻转,可以使能Flash和 ...

谢谢硬哥指导!
1、基本带载运行10min以内,是一定会出错,但是不一定是同一个错误,开启CACHE的情况下,有的时候会出现 UNALIGNED(未对齐内存访问) 故障,通过查看栈帧,此故障也是bit位意外翻转了
2、我原来怀疑是CACHE问题,将ICACHE/DCACHE关闭后,还是会出故障,出现了一次 NOCP(没有协处理器)故障
3、目前正在准备将芯片罩起来试试
4、板子设计了CAN通信和USART通信,但是目前还没有外接通信,仅控制器单独运行
5、我试试ECC校验检测
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2022-12-29 11:44:59 | 显示全部楼层
找到原因了,主要是因为MCU的主频和内核供电电压不匹配导致硬件错误,结论如下:
1、配置MCU主频为550MHZ,内核电压等级应该配置为VOS0,但是实际配置内核电压等级为VOS1(主频最大允许为400MHZ,且ACLK、HCLK、PCLK均与内核电压等级不匹配) image.png
2、在上述配置下,空载运行,PCB板温度低,MCU温度低没有出现问题,但是当带载后,PCB温度迅速上升,MCU温度也跟着升高,当MCU高于约50℃时,就会出现莫名其妙的硬件错误

解决办法:
1、将VOS等级修改为VOS0,匹配550MHZ主频运行
2、或者保持VOS1电压等级,将主频降低到400MHZ以下

目前采样第2种办法,将主频降低到256MHZ,因为升高内核电压等级后,MCU功耗增加,发热比较大
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107031
QQ
发表于 2022-12-29 11:53:33 | 显示全部楼层
向上的少年 发表于 2022-12-29 11:44
找到原因了,主要是因为MCU的主频和内核供电电压不匹配导致硬件错误,结论如下:
1、配置MCU主频为550MHZ ...

其实强烈推荐使用CubeMX配置PLL时钟。除了这个时钟配置问题还有Flash延迟参数配置问题。
回复

使用道具 举报

2

主题

7

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2022-12-29 14:17:07 | 显示全部楼层
eric2013 发表于 2022-12-29 11:53
其实强烈推荐使用CubeMX配置PLL时钟。除了这个时钟配置问题还有Flash延迟参数配置问题。

好的,感谢指点,我用CubeMX配置一下然后对比看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-14 17:35 , Processed in 0.308535 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表