STM32 nucleoを使う (6) タイマー


はじめに

組込み系ではタイマーが必要不可欠です。まずタイマー割り込みを使って周期的な動作をさせてみます。

タイマーの種類

STM32には多くのタイマーが搭載されています。
高機能タイマー TIM1/TIM8/TIM20
汎用タイマー TIM2/TIM3/TIM4、TIM16/TIM17
基本タイマー TIM6/TIM7
タイマー割り込みであれば基本タイマ―を使うのが簡単です。

基本タイマ

基本タイマのTim7を使ってみます。
10ms毎にタイマー割り込みを発生させ、1秒毎にLED出力を反転させます。
Tim7はAPB1の配置されているのでクロックはTIM1CLKになります。クロックをプリスケーラ―で分周しカウンタ値と一致すると割り込みを発生させます。

CubeMx設定

Clock Confiigurationタブを選択しクロック設定を表示させます。
クロックの設定を確認します。APB1のタイマークロックは72MHzです。

Pinout & Configurationを選択し、Timersを広げ、TIM7をクリックします。
まずModeのActivatedにチェックを入れます。
Parametar Settingsタブを表示します。

10msを作るにはいくつカウントさせればよいかというと

\frac{10ms}{\frac{1}{72MHz}}=720000

プリスケーラの値を64とすると

\frac{720000}{64}=11250

カウンタは0から始まるので1を引いた値11249となります

Prescalerに64、Counter Periodに11249を設定します。

割り込みを有効にします。NVIC Settingタブを選択し、TIM7 global interruptのEnabledにチェックを入れます。

割り込みハンドラー

割り込みの種類がtim7によるものかチェックします。
カウンタをインクリメントし100を超えたらLED出力を反転させます。

/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    static unsigned char count = 0;

    if(htim == &htim7) {
        count++;
        if (count >= 100) {
            HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
            count = 0;
        }
    }
}
/* USER CODE END 0 */

Tim7の初期化終了後にHAL_TIM_Base_Start_IT()を呼びTim7を実行させます。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_TIM7_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim7);    /* tim7 Start */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

1秒毎にLEDが点滅します。
STM32の使い方を学習した内容をまとめています。内容に不備等ありましたら連絡お願いします。