私はSTM32を学ぶために使用しているSTM32L476RCニューロボードを持っています。私はSTM32Cube HALとAC6 System Workbenchを使って開発しています。私はCubeMXから離れていきたいと思っています。私の目標は、何かを稼ぐだけでなく、学習に向けたものです。STM32 SysTickは2倍の速さでカウントする必要があります。
私が抱えている問題は、以下のコードを使ってシステムタイマーを設定しようとしたときに、2倍の速さでカウントされているようです。
ただし、電源を入れたままにしておくと正しい速度でカウントされます。
私はCubeMXを使って次のクロック設定を生成し、それをSystem Workbenchで作成した新しいプロジェクトに直接貼り付けましたが、systickカウンタはまだ2倍の速さでカウントされているようです。しかし、CubeMXによって生成されたプロジェクトはうまく動作しているようです。
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInit;
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = 16;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
RCC_OscInitStruct.PLL.PLLM = 1;
RCC_OscInitStruct.PLL.PLLN = 10;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
//Error_Handler();
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
//Error_Handler();
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
//Error_Handler();
}
/**Configure the main internal regulator output voltage
*/
if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
{
//Error_Handler();
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/**Configure the Systick
*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
私が紛失しているものがあります。多分何とかティックカウンタがどこかで設定され、HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/ 1000)を呼び出すと、別のティックカウンターを設定するだけですか?何も思いつきません!私は何が起こっているとして完全に失われて助けてください!私は単純にLEDを点滅し、ロジックアナライザで周波数を測定することにより、ダニ速度を計測しています
:
if (HAL_GetTick() - LEDstopwatch > 1000)
{
// Toggle the LED
//BSP_LED_Toggle(LED2);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_10);
// Reset the stopwatch
LEDstopwatch = HAL_GetTick();
}
私のテストプロジェクトのための完全なコードはここにある: https://github.com/c-herring/STM32L476_Nucleo_FirstTest
ありがとう!
こんにちはギョーム。お返事をありがとうございます。私はまだ少し混乱しています。私はSysTickがHCLKから派生したと思った。私はコピーしたコードがクロックソースを変更したと思います。私はデバッガをステップ実行し、SystemCoreClockが正しく80MHzに更新されました。私もPWMをセットアップして、その80MHzの正しいキャリア周波数を測定します。したがって、HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/ 1000); 80MHzのHCLKでSysTick割り込み時間を正しく更新する必要がありますか?問題は、HCLKを80MHzに変更しても、Systickを更新しないと、正しい速度で動作することです。私はsystickを更新すると速く実行します – Chris
また、CubeMXの自動生成コードも同じSystemInit関数を呼び出し、SWで新しいプロジェクトを作成して生成されたコードとまったく同じクロックを設定するようです。その後、HAL_Init()を呼び出してからSystemClock_Config()を呼び出します。私は最初から作成されたプロジェクトとCubeMXコードの間にコードの違いは見られません。CubeMXコード:https://github.com/c-herring/testmx – Chris