2016-04-28 51 views
0

我使用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后和损坏奇怪的东西图片 Debugger,assembly

解决方案

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; 
+0

默认'HAL_GetTick()'实现只返回在SYSTICK中断递增计数器值。 (但可以被覆盖 - 它被声明为“弱”链接)。在选择的反汇编窗口中使用“step-into”插入汇编级别。还要检查是否有足够的堆栈分配,并且堆栈没有中断(在调用之前或期间)。 – Clifford

回答

3

的RCC_ClkInitStruct可能是不正确初始化(或全部)

+0

感谢您的回复,但我认为RCC_CLKInitStruct没问题。 http://pastebin.com/RxQc2NSZ – user2740652

+1

进一步提示。禁用对stm32f4xx_hal_rcc.c的优化(在项目浏览器中右键单击该文件)。汇编器输出将更容易理解。 Seondly,找到__HAL_RCC_SYSCLK_CONFIG宏的来源,并回溯它应该写入哪个注册表。验证是否将正确的地址加载到CPU寄存器中。 –

+1

(在下面的代码中,MCU可能配置为使用外部晶振,您的项目中晶振MHz的定义是否正确设置?) –