打印

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

[复制链接]
648|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小蘭|  楼主 | 2018-7-6 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象:从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库这么冗杂的写法,栈理应紧张


代码如下

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

    /* Configure the MPU attributes as Write Through for SDRAM*/
    MPU_Config();
    delay_ms(100);
#if (DEVICE_SOFT_TYPE == SOFT_BOOTLOADER)
    CPU_CACHE_Enable();
#endif
    /* STM32H7xx HAL library initialization:
         - Configure the Systick to generate an interrupt each 1 msec
         - Set NVIC Group Priority to 4
         - Low Level Initialization
       */
    HAL_Init();
    /* Configure the system clock to 400 MHz */
//#if (DEVICE_SOFT_TYPE == SOFT_BOOTLOADER)
    SystemClock_Config();
//#endif
    /****************************************系统硬件初始化*********************************/
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    __HAL_RCC_GPIOE_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    __HAL_RCC_GPIOG_CLK_ENABLE();
    Led_GPIOInit();                             //初始化led
    Android_Usart_Init();
   
    #if (DEVICE_SOFT_TYPE != SOFT_BOOTLOADER)
    Utils_IO_Init();
    //   IWDG_Init(IWDG_PRESCALER_32, 3000);         //初始化看门狗,3s
    Sensor_Init();
    Motor_GPIO_Init();
    Timer3_Init();
    OutBar_Usart_Init();
    InnerBar_Usart_Init();
    LeftQr_Usart_Init();
    RightQr_Usart_Init();
    WaterQr_Usart_Init();
    right_adc_io_init();
    right_DA_GPIOInit();
    left_DA_GPIOInit();
    left_adc_io_init();
    Channel_GPIOInit();
    #endif
   
    StartSystemStartTask();
    vTaskStartScheduler();

    while(1);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

451

主题

463

帖子

1

粉丝