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