皆さま こんにちは。
前回、STM32L010F4P6は初期値が2.097MHzのMSIクロックで動作することがわかりました。
今回はこのクロックを使ってタイマー割り込みでLチカしてみます。
投稿時の開発環境を記しておきます。
PC:Windows10 OS
IDE: STM32CubeIDE Version1.3.0
Configurator: STM32CubeMX Version5.6.0
マイコン: STM32L010F4P6
Board: 自作のボード
プロジェクトは前回のものを使う
STM32 ゼロから始めるローパワーマイコン デバッガーでLチカ 前編 および後編でつくったプロジェクトを使っていきます。
main.cのLチカコードを削除しておく
コメントを除いたコードを以下のように編集しておきます。
(コメントは残しておいて結構です)
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
}
}
タイマーの設定を行う
ProjectExplorer で STM32L010.ioc ファイルをダブルクリックします。
Pinout & Configuration – Categories – Timers をクリックし, TIM2 をクリックします。
TIM2 Mode and Configuration – Clock Source で Internal Clock を選択します。
Configuration – Parameter Settings – Counter Settings を以下の通りに設定します。
Prescaler : 499
Counter Mode : Up
Counter Period : 4193
Internal Clock Division : No Division
auto-reload preload : Enable
そして NVIC Settingsを選択し、 TIM2 global interrupt Enabled にチェックを入れます。
Clock Configurationを選択し、クロックを確認します。
System Clock Mux で MSI が選択されていることを確認します。
APB2 timer clocks が 2.097MHz になっていることを確認します。
1秒周期でLチカする計算
プリスケーラ × カウンタピリオド × 1/f = タイマー周期[秒] になります。
クロック周波数 f = 2.097MHz です。
プリスケーラを 500 、タイマー周期を1秒とすると、カウンタピリオドは 4194 になります。
プリスケーラとカウンタピリオドは16ビットなので 1-65535 までの値を設定するようにしてください。
それからオートリロードを Enable にしておきます。
プリスケーラとカウンタピリオドのカウント始まりはゼロなので、-1した値を設定します。
プリスケーラは 499, カウンタピリオドは 4193 を設定します。
以下の画像の通りであることを確認してください。
パラメーターの設定
割り込みの設定
ビルドする
ひとまず、ここまでで一度ビルドしておきましょう。
Project – Build All を選択します。
MX_TIM2_Init()という関数が追加されて設定した値を確認することができます。
コーディングする
タイマーを動かすにはスタートの関数を呼ぶ必要があります。
main.cの while()ループの手前の BEGIN 2 と END 2 の間に以下の関数を記述します。
MX_TIM2_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END 2 */
次に Core - Src - stm32l0xx_it.c をダブルクリックして開き、以下の関数内に HAL_GPIO_TogglePin()を追記します。
お約束で BEGIN と END の間に記述するのでしたね。
TIM2_IRQHandler()がTIM2の割り込み関数になります。
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1);
/* USER CODE END TIM2_IRQn 1 */
}
ビルドして実行してみる
Project - Built All でビルドしてエラーがないことを確認し、 Run - Debug します。
HAL_Init()のところで停止するので、F8キーを押して実行します。
1秒周期でLチカすれば成功です。
うまく動きましたでしょうか?
今回はMSIの 2.097MHz のクロックで計算しましたが、HSIの16MHzで計算してみるとか、いろいろ試してみてください。
お疲れさまでした。
コメントを書く