2021年1月26日火曜日

STM32CubeIDE: Basic Timerを使う

STM32F446REには
  • Advanced-control Timer
  • General purpose Timer
  • Basic Timer
の3種類のTimerが搭載されています。この中でBasic Timerが最も機能が少なく設定も簡単です。

STM32F446REのBasic TimerはTIM6、TIM7の2つです。Basic Timer主に内蔵DACトリガーと波形生成に使われます。もし内蔵DACを使う場合はTIM6、TIM7は使わないほうが無難だと思います。

TIM6の割り込みでLチカを駆動する


メインループ内でHAL_Delay()を使ってLチカさせるのではなく、Timer割り込みでLチカします。タイミングが正確になり、メインループではLチカを気にすることなく他の仕事に専念できます。

STM32CubeIDE: Version 1.5.1
Target board: Nucleo-F446RE

MXの設定


Timers
  TIM6
    Configuration
      Prameter Settings
        Counter Settings
          Prescaler(PSC - 16 bits value): 42000-1
          Counter Period(AutoReload Register -16 bits value): 1000-1
     
    NVIC Settings
      NVIC Interruput Table
        TIM6 global interruput and DAC1, DAC2 underrun error interrupts: ✓

Nucleo-F446REを指定して初期化するとデフォルトではクロック(APB1/APB2 Timer Clocks)は84MHzになります。Prescalarに42000を設定すると2kHzになり、Counter Periodが1000なので2Hz→0.5sの周期で割り込みがかかります。

PrescalerとCounter Periodは-1した値を設定する必要があるそうです。

参考: トランジスタ技術 2020年3月号 別冊付録1 P38

TIM6のCounter Settingsにはauto-reload preloadという項目がありますが、これはCounter Periodを動的に設定した際に、値を反映させるタイミングを設定するもののようです。

参考: RM039: 19.3.2 Basic timers - Counting Mode

割り込みを使用する際にはNVICで割り込みを有効にする必要があります。結構忘れがちですw

main.cにコードを追加


  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* USER CODE END 2 */

HAL_TIM_Base_Start_IT()でタイマーを開始し、割り込みを有効にします。

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)
{
	if (htim == &htim6) {
		HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
	}
}
/* USER CODE END 4 */

HAL_TIM_PeriodElapsedCallback()で割り込みハンドラを記述します。LD2の出力をトグルします。

これでボード上のLED2が1秒間隔で点滅します。

オシロで波形を観測


0 件のコメント:

コメントを投稿