2016-04-28 44 views
0

私はnucleo-f446ZE(STM32F446ZET6)にSTCubeMXを使って簡単なプロジェクトを作成しました。HAL_GetTick()クラッシュmcu

プロジェクトはUSBデバイスHIDである必要がありますが、起動に失敗します。デバッガを使いこなした後、私はMCUのPCレジスタが0x00000000または0xFFFFFFFFになることを発見しました。

私はコードを変更しませんでした。私はMDK-ARM(修正GCC、Vision IDE)とGCC(openSTM32)でコードをコンパイルしました。同じことが起こります。

コールスタック:

  • メイン
  • SystemClock_Config
  • HAL_RCC_ClockConfig(632)
  • Hal_GetTick

シモンズ:プログラムはなぜ 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割り込みでインクリメントカウンタ値を返します。 (ただし、オーバーライドすることができます - これは "弱い"リンケージで宣言されています)。アセンブリレベルでステップインするために選択された逆アセンブリウィンドウで「ステップイン」を使用します。また、十分なスタックが割り当てられていること、スタックが壊れていないこと(コールの前または途中)を確認してください。 – Clifford

答えて

3

RCC_ClkInitStructはおそらく正しく初期化(あるいはまったく)されていない

+0

返信いただきありがとうございますが、RCC_CLKInitStructは問題ないと思います。 http://pastebin.com/RxQc2NSZ – user2740652

+1

さらに詳しい情報はこちらをご覧ください。 stm32f4xx_hal_rcc.cで最適化を無効にします(プロジェクトブラウザでファイルを右クリックします)。アセンブラの出力は理解しやすくなります。最後に、__HAL_RCC_SYSCLK_CONFIGマクロのソースを見つけて、どのレジストリに書き込むべきかを調べてください。正しいアドレスがCPUレジスタにロードされていることを確認します。 –

+1

(以下のコードでは、MCUはおそらく外部クリスタルを使用するように設定されていますが、プロジェクトのクリスタルMHzの定義が正しく設定されていますか?) –

関連する問題