我使用 STCubeMX 为我的 nucleo-f446ZE(STM32F446ZET6) 创建了一个简单的项目。
该项目应该是一个 USB 设备 HID,但它无法启动。在搞乱调试器后,我发现 MCU PC 寄存器转到 0x00000000 或 0xFFFFFFFF 或有时是随机无效值。
我没有修改任何代码。我用 MDK-ARM(修改后的 GCC,Vision IDE)和 GCC(openSTM32)编译了代码,同样的事情发生了。
调用栈:
- 主要的
- SystemClock_Config
- HAL_RCC_ClockConfig (632)
- Hal_GetTick
Ps:RAM 在 0x080149A 之后损坏,这就是为什么程序会做一些奇怪的事情 Image
解决方案
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;