现象:从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);
} |