タイマー割り込みとLED点滅
1.本日の内容
(1) STM32マイコン(nucleo f401RE)を使用して、タイマー割り込みにより、LEDの点滅を行う。
・目次
2.内容
(1) やる内容の詳細
・STM32マイコン(nucleo f401RE)を使用して、タイマー割り込みにより、LEDの点滅を行う。
点滅:1秒点灯、1秒消灯の繰り返し。
・CubeMxによる。タイマ割り込みの設定方法について。
・タイマ割り込みの開始の仕方
・タイマー割り込みとは
(2) 使用部品
個数 | 部品名 | 型番 | |
1 | USBケーブル | USBミニBタイプ | |
1 | mbed(マイコンボード) | nucleo f401RE |
(3) STM32CubeMXの設定、プログラムを出力
CubeMXの設定の詳細は下記を参照
→STM32マイコン学習_1(環境の導入:CubeMXとTrueStdio) - Project_OKI’s diary
(a)使用ピンを設定
・PA5:GPIO_Output
(b)使用するピンの名前を変更
・PA5→右クリック→Enter Username→LED1とする。
(c) 割り込み設定
・System Core → RCCをクリック
・High Speed Clock(HSE)を、Crystal/Ceramic Resonatorに設定
→内部水晶振動子などを使用する。
→外部からクロックを入力する場合は、「BYPASS Clock Source」に設定。
(d) タイマーの設定(ここで何ms毎に処理するか設定)
・TimersのTIM3をクリック
・Clock Source を Internal Clock に設定
・Parameter Settingsタブをクリック
・Prescalerを 1000-1
・Counter Periodを 16000-1
に設定
・NVIC Settingsタブをクリック
・Enableのチェックを入れる。
※「⚠」のマークが表示されていたり、黄色くなっている場所は
設定によっては機能が競合するということ。
(d)プログラムの出力
・Project Maagerを選択
・Project Nameにプログラムの名前を入力:SW_LED5
※スペース、空白文字、日本語を含めるとエラーになる場合があるので、使用しない。
・Project Location:プロジェクトを保存する場所
・Application Structure:Advanced (出力するフォルダの構成を選択)
・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)
(f)GENERATE CODEで、コードを出力
(g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。
(4) AtricTrueStdioでプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーにSW_LED5(作成したプロジェクトの名前)が表示
・チェックされているのを確認して、終了をクリック
(b) プログラムの書き込み
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載する。
/* USER CODE BEGIN 2 */ //TIM3開始 HAL_TIM_Base_Start_IT(&htim3); /* USER CODE END 2 */
//タイマー割り込み実行関数 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3){ //TIM3割り込み処理 //LED点灯時は、LEDを消灯。 LED消灯時は、LEDを点灯する。 HAL_GPIO_TogglePin(LEDOUT1_GPIO_Port,LED1_Pin); } } /* USER CODE END 4 */
(a)PrescalerとCounter Periodの設定値について
・PrescalerとCounter Period、APBの値によって、割り込みタイミング[s]が決定する。
・APBは、Clock Configurationの値が参照される。
・今回は、TIM3を使用するので、APB1を参照し、16MHzとなる。
→APB1:TIM2, 3, 4, 5,
参照:STM32F401xEのデータシートのP.14
(b) 割り込みタイミング[sec]の計算
・計算式:
タイマカウントの動作タイミングをf[Hz]とすると。
f = APB1/(Counter Period+1)/(Prescaler+1)
今回の場合:
APB1 = 16000000
Counter Period = 16000-1
Prescaler = 1000 - 1
より
f = 16000000/(16000-1+1)/(1000-1+1)
= 1[Hz]
f[Hz] = 1/s[sec] より
s = 1/f
=1 [sec] となる。
つまり、1秒に一回、TIM3の割り込み処理が動作するということ。
(c) 式から、設定したい秒数をPrescalerの値によって決める。
例えば、10msに1回、動作させたいと考える。
その場合、PrescalerとCoutenter Periodは、いくつにすればよいか。
簡単なのは、Counter Periodの値をAPB1/1000に固定する。
T[Hz] = APB1/(APB1/1000)/(Prescaler + 1)になる。
=1000/(Prescaler + 1)
(Prescaler + 1) = 1000/T
=1000 * s
Prescaler =1000 * s - 1
で、計算することができる。
例:10msに設定したい場合
Prescaler = 1000*10/1000 -1
= 10 - 1 と設定すれば、10msごとに割り込み処理が入る。
同様に、100msと設定したい場合は、
Prescaler = 100 -1 とすればよい。
(c) HAL_TIM_Base_Start_IT(&htim3);
・タイマー割り込みをEnableにする。
・引数(&htim3)のタイマー割り込みを使用可能とする。(この場合はTIM3)
(d)void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
・タイマー割り込みを実行するための関数
(e) if(htim == &htim3){ }
・TIM3の実行、TIM3が動作すると、{}の中を実行する。
参考:https://babyron64.hatenablog.com/entry/2018/07/31/000537
作成の参考動画:
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
・SPI通信とは - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary