OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4269|回复: 4

HAL库 血的教训,栈不够,HardFault_Handler

[复制链接]

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1698
金钱
1698
注册时间
2012-5-10
在线时间
438 小时
发表于 2019-12-4 17:23:50 | 显示全部楼层 |阅读模式
现象:从bootloader跳过来之后,仿真全部死在 main-》SystemClock_Config-》HAL_RCC_ClockConfig-》HAL_RCC_GetSysClockFreq
调试过程:
      不死机操作:main函数中, (SystemClock_Config, while)之间的代码全部注释掉
      死机操作:不注释掉 main函数中, (SystemClock_Config, while)之间的代码
现象分析:
      死机与不死的区别就是注释掉了一些代码,但是注释掉的代码是在死机语句的后面,理论上是不会对前面造成任何影响。但是现象就是这么神奇,注释掉死机语句后面的代码,程序就ok了
最终解决办法:
     加大栈: Stack_Size      EQU     0x00000800
结论:
    以前使用标准库写了很多比较大的项目,栈一直都是0x400,
    这个项目使用H743,没有标准库,使用最新的hal库,而且这还是项目前期,程序在main函数中,就是一些初始化内容,与hal 最接近的地方,使用hal函数最多的地方,以hal库这么冗杂的写法,栈理应紧张


代码如下

  1. int main(void)
  2. {
  3.     /* This project template calls firstly two functions in order to configure MPU feature
  4.        and to enable the CPU Cache, respectively MPU_Config() and CPU_CACHE_Enable().
  5.        These functions are provided as template implementation that User may integrate
  6.        in his application, to enhance the performance in case of use of AXI interface
  7.        with several masters. */

  8.     /* Configure the MPU attributes as Write Through for SDRAM*/
  9.     MPU_Config();
  10.     delay_ms(100);
  11. #if (DEVICE_SOFT_TYPE == SOFT_BOOTLOADER)
  12.     CPU_CACHE_Enable();
  13. #endif
  14.     /* STM32H7xx HAL library initialization:
  15.          - Configure the Systick to generate an interrupt each 1 msec
  16.          - Set NVIC Group Priority to 4
  17.          - Low Level Initialization
  18.        */
  19.     HAL_Init();
  20.     /* Configure the system clock to 400 MHz */
  21. //#if (DEVICE_SOFT_TYPE == SOFT_BOOTLOADER)
  22.     SystemClock_Config();
  23. //#endif
  24.     /****************************************系统硬件初始化*********************************/
  25.     __HAL_RCC_GPIOA_CLK_ENABLE();
  26.     __HAL_RCC_GPIOB_CLK_ENABLE();
  27.     __HAL_RCC_GPIOC_CLK_ENABLE();
  28.     __HAL_RCC_GPIOD_CLK_ENABLE();
  29.     __HAL_RCC_GPIOE_CLK_ENABLE();
  30.     __HAL_RCC_GPIOF_CLK_ENABLE();
  31.     __HAL_RCC_GPIOG_CLK_ENABLE();
  32.     Led_GPIOInit();                             //初始化led
  33.     Android_Usart_Init();
  34.    
  35.     #if (DEVICE_SOFT_TYPE != SOFT_BOOTLOADER)
  36.     Utils_IO_Init();
  37.     //   IWDG_Init(IWDG_PRESCALER_32, 3000);         //初始化看门狗,3s
  38.     Sensor_Init();
  39.     Motor_GPIO_Init();
  40.     Timer3_Init();
  41.     OutBar_Usart_Init();
  42.     InnerBar_Usart_Init();
  43.     LeftQr_Usart_Init();
  44.     RightQr_Usart_Init();
  45.     WaterQr_Usart_Init();
  46.     right_adc_io_init();
  47.     right_DA_GPIOInit();
  48.     left_DA_GPIOInit();
  49.     left_adc_io_init();
  50.     Channel_GPIOInit();
  51.     #endif
  52.    
  53.     StartSystemStartTask();
  54.     vTaskStartScheduler();

  55.     while(1);
  56. }
复制代码



如有技术问题,微信扫头像交流,STM32,JAVA,服务器
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-12-4 18:36:12 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-12-26
在线时间
6 小时
发表于 2023-5-16 21:49:21 | 显示全部楼层
谢谢,我也碰到堆栈不够的问题。
回复 支持 反对

使用道具 举报

2

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
499
金钱
499
注册时间
2019-8-20
在线时间
154 小时
发表于 2023-5-22 09:44:57 | 显示全部楼层
H743这类的芯片内存很大的,一般也不用省那点RAM,,,我平时哪怕点个灯的工程堆栈都设0x1000(4KB)
回复 支持 反对

使用道具 举报

30

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2020-4-17
在线时间
111 小时
发表于 2023-5-23 09:33:27 | 显示全部楼层
猫头表示之前也碰到过,加大堆栈就可以了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 11:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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