コンフィグレーターを使ってみる タイマー割り込み編

コンフィグレーターを使ってみる タイマー割り込み編

今回もSTM32CubeIDEに関する話題です。

コンフィグレーターという便利な機能があるのでご紹介します。
今回はタイマー割り込みの機能を実装してみます。

投稿時の開発環境:
PC:Windows10 OS
IDE: STM32CubeIDE Version1.1.0
Configurator: STM32CubeMX Version5.4.0
Board: STM32Nucleo-F401RE

Project Explorer でプロジェクト名 F401の左側が > になっていたら > をクリックします。
> が V にかわってツリーの下の階層が見えてきます。

水色のアイコンの F401.ioc をダブルクリックします。

Device Cofiguraiton Tool が起動します。

ツールは Pinout & Configuration / Clock Configuration / Project Manager / Tools の4つのタブで構成されています。
ツールを起動した状態では Pinout & Configuration の背景が水色になって選択されています。

Categoriesの下にある Timersをクリックします。

今回は TIM1(タイマー1) を使ってみます。
TIM1 をクリックすると右側に TIM1 Mode and Configuration と表示されるので Mode の Clock Source を Internal Clock に設定します。Clock Source に Internal Clockを選択すると、Configuraitonに項目が表示されるようになります。

Configuration は更に以下の4つのタブで構成されています。

Parameter Settings / User Constants / NVIC Settings / DMA Settings

項目をマウスでクリックすると選択した項目の背景色が水色になります。

タイマー周期を設定する

Parameter Settingsタブが選択された状態でパラメーターを設定していきます。

プリスケーラ × カウンタピリオド × 1/f = タイマー周期 になります。
クロック周波数 f = 84MHz です。
プリスケーラを 4000 、タイマー周期を1秒とすると、カウンタピリオドは 21000 になります。
プリスケーラとカウンタピリオドは16ビットなので 1-65535 までの値を設定するようにしてください。
それからオートリロードを Enable にしておきます。

プリスケーラとカウンタピリオドのカウント始まりはゼロなので、設定する値は -1 しなければなりません。
各パラメータは以下のように設定してください。

Prescaler 3999
Counter Mode Up
Counter Period 20999
Internal Clock Division No Division
Reperirion Counter 0
auto-reload preload Enable

設定した画面の様子は以下を参考にしてください。

クロックを確認する

Clock Configuration(上の階層の大きなタブの方です)をクリックするとクロックの系統図を見ることができます。

右側の APB1 と APB2 Timer clocks が 84MHz になっていることが確認できます。
TIM1はどっちを使うの?って思いますが、

データシートによると各タイマのクロックは

APB1 : TIM2, 3, 4, 5
APB2 : TIM1, 9, 10, 11

となっています。でも、どちらも 84MHz なので気にしなくても良いですね。

ボード上のマイコンのデータシートは以下からダウンロードすることができますので確認してみてください。

STM32F401データシート

割り込みを許可する

Configuration の NVIC Settings を選択して TIM1 update interrupt and TIM10 global interrupt の Enable にチェックを入れます。

コーディングする

一度ビルドしてみましょう。
Project – Build All を選択します。
(または Project Explorer で F401 を選択した状態で、 Project – Build Project を選択する)

Do you want generate Code ? と聞いてきますので Yes を選択します。

ビルドエラーがないことを確認します。

Project Explorer の F401 > Core > Src の main.c をダブルクリックします。

main()関数の中の while (1) の上あたりに MX_TIM1_Init(); という関数が追加されています。

この MX_TIM1_Init() がコンフィグレーターによって追加された初期化関数になります。いろいろな周辺機能を追加すると MX_xxx_Init() の初期化関数が増えていきます。
xxx の部分は周辺機能の略号になっています。
MX の由来は STM32CubeMX から来ているものと想像ができます。STM32CubeMX はIDEが開発される以前から存在するコンフィグレーターです。

この MX_TIM1_Init() をダブルクリックして選択しておいて、右クリックします。
メニューが出ますので Open Declaration を選択します。

するとこの関数の実装部分に飛ぶことができます。

関数の最後の USER CODE BEGIN と END の間に以下のようにコードを実装します。
これでタイマー1が動作を開始します。

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

次にタイマー割り込みが動いていることを確認するためにLチカのコードを実装します。

Project Explolre の F401 > Core > Startup の 左側の > をクリックし startup_stm32f401retx.s をダブルクリックします。

このファイルには割り込みベクターが書かれています。

183行目の TIM1_UP_TIM10_IRQHandler を選択しておいて右クリックし、Open Declaration を選択します。

ウィンドウが出るので stm32f4xx_it.c の方を選択し OK します。

以下のように /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */ と /* USER CODE END TIM1_UP_TIM10_IRQn 1 */
の間に HAL_GPIO_TogglePin()を実装します。

void TIM1_UP_TIM10_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */

  /* USER CODE END TIM1_UP_TIM10_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
  HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
  /* USER CODE END TIM1_UP_TIM10_IRQn 1 */
}

ビルドして実行する

Run – Debug を選択します。
正しくコードが実装されれば main()関数の HAL_Init()のところでプログラムが待機しますので Run – Resume します。

正しくコードが実装されれば 緑色のLEDが1秒毎に点滅します。

コンフィグレーターを使うことで、わずかなコードで必要な機能を実現することができます。
IDEといい、コンフィグレーターといい強力なツールですね。

次回からシリアル通信について書いていきます。

この続きを読むには こちら からどうぞ。

HALカテゴリの最新記事