TIM2を使用し1ms Tick Counterを作成します。 確認の為、MCOを有効とし、出力ポートも設定します。 |
|||||||||
|
|||||||||
1.1. TIM2の設定 Timers内TIM2を選択し、Mode を以下の様に設定します。
|
|||||||||
|
|||||||||
Parameter Settingsを以下の様に設定します。
|
|||||||||
system clock = 32MHzなので、Prescalerで1/32としてTIM2のクロックソースを1MHzに設定。 Counter Periodを1000カウントとすることで1msとします。 Prescalerへの設定値は分周値-1とします。 Counter Periodの設定値も-1した値とします。 |
|||||||||
1.2. RCC_MCOの設定 RCC_MCOを有効とし、System clock を出力するように設定します。Clock ConfigurationでRCC_PCMを1/16にして出力するよう設定します。 よってRCC_MCOには2MHzが出力されます。 Maximam max speed は 2MHz 出力なので LOW でも大丈夫です。 |
|||||||||
1.3. 出力ポートの設定 どこでも良いのですが、今回は PA7 を出力ポートとするように設定します。 |
|||||||||
1.4. 割込みの設定 NVIC Interrupt Tableを選択しEnabledにチェックを入れます。その後、Code Generateを実行。 |
|||||||||
2.1. TIM2割込み処理 |
|||||||||
USER CODE PV BEGINの下に外部変数を追加します。 ここでは uint32_t g_uwTickCountとします。 /* Private variables ---------------------------------------------------------*/ TIM_HandleTypeDef htim2; /* USER CODE BEGIN PV */ uint32_t g_uwTickCount; /* USER CODE END PV */ |
|||||||||
USER CODE BEGIN 2の下に、HAL_TIM_Base_Start_ITを記述します。 これでTIM2割込み許可となります。 /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_TIM2_Init(); /* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim2); /* USER CODE END 2 */ |
|||||||||
USER CODE BEGIN 4の下に割込み処理関数を記述します。 関数名はHAL_TIM_PeriodElapsedCallback固定です。 g_uwTickCountをインクリメント。 HAL_GPIO_TogglePin関数でTICK_OUTを1ms毎にトグルします。 /* USER CODE BEGIN 4 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { g_uwTickCount++; HAL_GPIO_TogglePin(TICK_OUT_GPIO_Port, TICK_OUT_Pin); } /* USER CODE END 4 */ |
|||||||||
|
|||||||||
最初にRCC_MCOの波形を確認します。![]() RCC_MCOの周波数は2.0172MHz、周期は495.71nsとなっています。ぴったり2MHzにならないのは HSI RC の誤差です。 次に TICK_OUT の波形を確認します。 ![]() TICK_OUT の周期は1.9827msとなっています。 RCC_MCOの周期から計算すると、 495.71(ns) x 2 x 1000 x 2 = 1.98284(ms) となり、ほぼ実測値と一致しています。 |