2016-04-28 53 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的定義是否正確設置?) –