我使用STCubeMX为我的nucleo-f446ZE(STM32F446ZET6)创建了一个简单的项目。HAL_GetTick()crash mcu
该项目应该是USB设备HID,但无法启动。在调试器搞乱了之后,我发现单片机的PC寄存器变为0x00000000或0xFFFFFFFF,有时也是随机的无效值。
我没有修改任何代码。我使用MDK-ARM(修改后的GCC,Vision IDE)和GCC(openSTM32)编译代码,发生同样的事情。
调用堆栈:
- 主要
- SystemClock_Config
- HAL_RCC_ClockConfig(632)
- Hal_GetTick
PS:为什么程序做 RAM得到0x080149A后和损坏奇怪的东西图片
解决方案
CubeMX没有设置时钟非常好。这里是我用来制作usb的设置。
//RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
//RCC_OscInitStruct.HSIState = RCC_HSI_ON;
//RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 192;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;
RCC_OscInitStruct.PLL.PLLQ = 4;
RCC_OscInitStruct.PLL.PLLR = 2;
默认'HAL_GetTick()'实现只返回在SYSTICK中断递增计数器值。 (但可以被覆盖 - 它被声明为“弱”链接)。在选择的反汇编窗口中使用“step-into”插入汇编级别。还要检查是否有足够的堆栈分配,并且堆栈没有中断(在调用之前或期间)。 – Clifford