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 件のコメント:
コメントを投稿