硬汉嵌入式论坛

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

[STM32H7] 求助:Reset上电后直接进入HardFault,无法进入C环境的main函数

  [复制链接]

26

主题

73

回帖

151

积分

初级会员

积分
151
QQ
发表于 2020-4-23 12:46:03 | 显示全部楼层 |阅读模式
非常奇怪的一个问题:Reset上电后直接进入HardFault,无法进入C环境的main函数。

2020-04-23_124104.jpg 2020-04-23_124202.jpg

进入调试时,发现执行到“startup_stm32h743xx.s”文件中的Reset_Handler中的:BX      R0,立即进入HardFault。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2020-4-23 13:02:24 | 显示全部楼层
不使用SystemInit也行?

执行下看看
回复

使用道具 举报

26

主题

73

回帖

151

积分

初级会员

积分
151
QQ
 楼主| 发表于 2020-4-23 13:37:26 | 显示全部楼层
eric2013 发表于 2020-4-23 13:02
不使用SystemInit也行?

执行下看看

我是用寄存器开发的,在main函数中,再设置时钟,所以不使用SystemInit: 2020-04-23_133232.jpg
回复

使用道具 举报

26

主题

73

回帖

151

积分

初级会员

积分
151
QQ
 楼主| 发表于 2020-4-23 13:40:03 | 显示全部楼层
另外,我查到是由于新加某个解码函数造成的:

屏蔽解码函数,就可以正常进入main函数;加入解码函数,编译正常,可以下载到STM32H743,但就会发生以上错误。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2020-4-23 13:54:56 | 显示全部楼层
pnhywyb 发表于 2020-4-23 13:37
我是用寄存器开发的,在main函数中,再设置时钟,所以不使用SystemInit:

SystemInit就是寄存器的,这也不是设置时钟,这个是复位时钟。现在时钟配置都是在main里面实现的。。。

  /* Reset the RCC clock configuration to the default reset state ------------*/
  /* Set HSION bit */
  RCC->CR |= RCC_CR_HSION;

  /* Reset CFGR register */
  RCC->CFGR = 0x00000000;

  /* Reset HSEON, CSSON , CSION,RC48ON, CSIKERON PLL1ON, PLL2ON and PLL3ON bits */
  RCC->CR &= 0xEAF6ED7FU;

  /* Reset D1CFGR register */
  RCC->D1CFGR = 0x00000000;

  /* Reset D2CFGR register */
  RCC->D2CFGR = 0x00000000;

  /* Reset D3CFGR register */
  RCC->D3CFGR = 0x00000000;

  /* Reset PLLCKSELR register */
  RCC->PLLCKSELR = 0x00000000;

  /* Reset PLLCFGR register */
  RCC->PLLCFGR = 0x00000000;
  /* Reset PLL1DIVR register */
  RCC->PLL1DIVR = 0x00000000;
  /* Reset PLL1FRACR register */
  RCC->PLL1FRACR = 0x00000000;

  /* Reset PLL2DIVR register */
  RCC->PLL2DIVR = 0x00000000;

  /* Reset PLL2FRACR register */

  RCC->PLL2FRACR = 0x00000000;
  /* Reset PLL3DIVR register */
  RCC->PLL3DIVR = 0x00000000;

  /* Reset PLL3FRACR register */
  RCC->PLL3FRACR = 0x00000000;

  /* Reset HSEBYP bit */
  RCC->CR &= 0xFFFBFFFFU;

  /* Disable all interrupts */
  RCC->CIER = 0x00000000;
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
发表于 2020-4-27 21:11:51 | 显示全部楼层
有中断使能,但是未处理。
回复

使用道具 举报

26

主题

73

回帖

151

积分

初级会员

积分
151
QQ
 楼主| 发表于 2020-4-29 11:03:43 | 显示全部楼层
lixin91985 发表于 2020-4-27 21:11
有中断使能,但是未处理。

你好,程序是加了某个音频解码库,并加上演示的解码函数,就不能进入main函数了。

没加音频解码库前的编译情况: 2020-04-29_102506.jpg

加了音频解码库后的编译情况:
2020-04-29_103928.jpg

编译都能正常通过,但加了音频解码库后,就不能进入main函数了,直接HardFault。
回复

使用道具 举报

23

主题

101

回帖

170

积分

初级会员

积分
170
发表于 2020-7-24 13:23:18 | 显示全部楼层
pnhywyb 发表于 2020-4-29 11:03
你好,程序是加了某个音频解码库,并加上演示的解码函数,就不能进入main函数了。

没加音频解码库前的 ...

我也遇到,一上电就进入hardFault,甚至Reset_Handler都没有进入
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-8-1 22:39:45 | 显示全部楼层
特意注册的,刚开始学这个,不知道掌握之后有没有用。 我用的keil,勾了Use MicroLIB就不这样了,没勾的话,在进入main那步就直接跳转hardFault
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-8-1 22:40:04 | 显示全部楼层
特意注册的,刚开始学这个,不知道掌握之后有没有用。 我用的keil,勾了Use MicroLIB就不这样了,没勾的话,在进入main那步就直接跳转hardFault
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2020-8-2 09:05:53 | 显示全部楼层
7698521 发表于 2020-8-1 22:39
特意注册的,刚开始学这个,不知道掌握之后有没有用。 我用的keil,勾了Use MicroLIB就不这样了,没勾的话 ...

将你main函数里面所有内容都注释掉,全编译,然后调试,看看是否还会进
因为不勾选这个,使用的是C标准库,如果使用C标准库的话,且用户调用到了一些C库函数,特别是printf这些,要做重定向。
回复

使用道具 举报

6

主题

34

回帖

52

积分

初级会员

积分
52
发表于 2024-9-23 18:10:52 | 显示全部楼层
今天我也遇到了这个问题。根据我的推测很可能是flash超额使用了。
可我128K的flash 才使用了64K.就这个样子了。

上电复位是可以正常运行,如果软件复位就不行了。hardfault 报错BKPT
我都凌乱了。

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-9-24 09:48:13 | 显示全部楼层
lixin91985 发表于 2024-9-23 18:10
今天我也遇到了这个问题。根据我的推测很可能是flash超额使用了。
可我128K的flash 才使用了64K.就这个样 ...

配置400MHz主频肯定没问题的
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-7-13 16:30:54 | 显示全部楼层
我现在遇到了一样的问题,芯片是AT32F437ZGT7,硬件和软件一样的情况下之前是没有问题的。最近调试的时候不知道为什么出现了,这样跳不到main函数的情况。即使是将main函数下都所有代码都注释掉也条不进去,网上很多帖子都显示和微库和半主机模式有关,但是这个我勾选了,之前一样的情况下也没有问题。而且现在有几块板子都出现一样的问题,有大佬知道还可能是什么问题吗?
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-7-13 16:43:22 | 显示全部楼层
at32f437zgt7 遇到了基本一样的问题,也是在启动文件里面调不到main函数。但是之前一样的程序一样的硬件是没有问题的,也不是微库的问题,还可能是什么原因呢,把main函数里面所有的注释了也是一样跳不到main函数直接硬件错误了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2025-7-14 08:58:12 | 显示全部楼层
qwerz_123 发表于 2025-7-13 16:43
at32f437zgt7 遇到了基本一样的问题,也是在启动文件里面调不到main函数。但是之前一样的程序一样的硬件是 ...

估计你的板子硬件有问题。
回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2025-7-14 09:22:01 | 显示全部楼层
qwerz_123 发表于 2025-7-13 16:43
at32f437zgt7 遇到了基本一样的问题,也是在启动文件里面调不到main函数。但是之前一样的程序一样的硬件是 ...

Reset_Handler 里会调用 SystemInit 函数,然后才调 main,你在 SystemInit 这个函数里打断点尝试一下。

如果连这个函数都进不去,你的链接器脚本和芯片肯定对不上。能进去就看哪一步出的错。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-7-14 11:04:38 | 显示全部楼层
yono 发表于 2025-7-14 09:22
Reset_Handler 里会调用 SystemInit 函数,然后才调 main,你在 SystemInit 这个函数里打断点尝试一下。
...

可以进到SystemInit,但是跳不到main函数,就是在""LDR  R0, =__main" BX R0 "后跳到HardFault
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-7-14 11:13:00 | 显示全部楼层
eric2013 发表于 2025-7-14 08:58
估计你的板子硬件有问题。

也不确定,烧录一个简单的串口打印测试程序可以正常运行
回复

使用道具 举报

25

主题

232

回帖

307

积分

高级会员

积分
307
QQ
发表于 2025-7-14 11:32:39 | 显示全部楼层
qwerz_123 发表于 2025-7-14 11:04
可以进到SystemInit,但是跳不到main函数,就是在""LDR  R0, =__main" BX R0 "后跳到HardFault

那问题又缩小一些,如果确定 SystemInit 没问题,包括里面的时钟设置啥的没问题。系统是起来了。

检查一下map,main函数地址是啥,SystemInit 是啥,为啥BX main 会出错。可以往这个方向排查。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2025-7-14 16:46:47 | 显示全部楼层
yono 发表于 2025-7-14 11:32
那问题又缩小一些,如果确定 SystemInit 没问题,包括里面的时钟设置啥的没问题。系统是起来了。

检查 ...

解决了,SRAM容量的问题,这个AT32F437ZGT7默认SRAM 384KB,程序用了300多K按道理是没问题的,但是这个芯片的SRAM容量是可以配置的使用厂家的烧录软件可以看到SRAM的容量,之前不知道为什么给配置为了128KB不知道是不是芯片的BUG,使用厂家的烧录软件改为默认的就行了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-11 23:50 , Processed in 0.062676 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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