(骨子)
TIM1を使う。
プリスケーラ × カウンタピリオド × 1/f = タイマー周期
400 × 42000 × 1/168M = 100ms
クロック周波数 f = 168MHz(後述参照)
(手順)
●タイマーの設定
※Clock Source = Internal Clock。Prescaler、Counter Periodには1小さい値を設定する。
●クロック周波数の確認
※APB2=168MHz --> TIM1
●割り込みを発生させる
■実装(100ms周期のタイマー割り込みの中からシグナルイベントを発生させ、タスクで受けてLEDをトグルする)
●初期化(要コーディング)
HAL_TIM_Base_Start_IT(&htim1);
●割り込みハンドラ(TIM共通)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
/* USER CODE BEGIN Callback 0 */
/* USER CODE END Callback 0 */
/* USER CODE BEGIN Callback 1 */
if (htim == &htim1)
{
osSignalSet(defaultTaskHandle, (1<<1));
}
/* USER CODE END Callback 1 */
}
■割り込みハンドラが本当に割り込みの中で呼ばれているか確認する。
●割り込みハンドラにブレークをかけて、xpsrの値を調べる。
※xpsrの下位8ビットが0以外なので、割り込みハンドラであることが分かる。
※割り込みハンドラの中から、シグナルイベントを発生させている。
●シグナルイベントを受けるタスク側にブレークをかけて、xpsrの値を調べる。
※xpsrの下位8ビットが0なので、タスク(割り込みハンドラではない)ことが分かる。
※シグナルイベントを受けてLEDの点灯をトグルしている。
スクリーンショットはPDF版を見てください。
5-timer.pdf