你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32H7,0x00000000地址的内容引发hardfault

[复制链接]
斯克莱特 提问时间:2025-1-22 11:41 / 未解决

问题背景:

STM32H7,串口初始化时执行HAL_UART_MspDeInit函数,调用HAL_NVIC_DisableIRQ(huart->hdmarx->Init.Request)时引发hardfault。具体原因是因为变量huart(对应类型UART_HandleTypeDef)中未对hdmarx进行初始化,该指针变量指向0x00000000,但0x00000000有具体值(不清楚为何会有值,值从哪里来,断上电值不改变)。导致hdmarx->Init.Request的值变为0x6095.执行HAL_NVIC_DisableIRQ函数时入参异常,进入hardfault.

image.png

求助:关于stm32h7 ,0x00000000地址的内容是如何被改变的?观察过正常情况下的值,如下。前三个地址的值是0,但异常时,前三个地址的值是非0。

image.png

收藏 评论5 发布时间:2025-1-22 11:41

举报

5个回答
种花家刘氓兔 回答时间:11 小时前

DMA的配置问题吧 先死机再跳到0x00000000

xmshao 回答时间:9 小时前
未初始化的局部变量的值往往是随机不确定的,其地址一般跟编译器和运行环境有关,比方栈的布局、函数调用时机。


我认为你现在的重点 是保证代码本身没问题,如果对一个没明确初始化的局部变量或指针进行赋值或使用,到底会发生什么谁也不确定。


这种不确定,往往会带来各种奇怪问题,包括产生hardfault.


具体到STM32H7系列,地址00是ITCM所在区域的地址。
斯克莱特 回答时间:7 小时前

种花家刘氓兔 发表于 2025-1-22 11:54
DMA的配置问题吧 先死机再跳到0x00000000

debug查看,在初始化之前,0x00000000地址的内容已经发生改变。

斯克莱特 回答时间:7 小时前

xmshao 发表于 2025-1-22 14:03
未初始化的局部变量的值往往是随机不确定的,其地址一般跟编译器和运行环境有关,比方栈的布局、函数调用时 ...

但这种用法,在ST的hal库中也是直接用,并未做初始化。且不是每次上电都会出现,概率性的出现这种情况,且出现值都是一样的。

butterflyspring 回答时间:6 小时前
斯克莱特 发表于 2025-1-22 16:21
[md]但这种用法,在ST的hal库中也是直接用,并未做初始化。且不是每次上电都会出现,概率性的出现这种情 ...



各个外设调用之前都需要有初始化,保证地址正确

既然调用了相关的函数,并且用到了寻址,那么它也应该被先初始化。

否则就如同你看到的,地址的内容不对,导致访问出错。

上面的大佬也提到了,RAM不去初始化,它地址是随机的。如果这个随机值落在了合理总线范围内,不会出现hard fault(但是没起到预期作用)。



所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版