割り込み
今回はSTM32は複雑なMPUであり高性能なタイマであるタイマ1を利用しているので、一番簡単な更新割り込みつまり、自動再ロードレジスタが溢れたときに発生する割り込みが主題である。
割り込みで一秒周期で、オンボードのLEDを点滅させるプログラムを作ることにする。
Pinoutの再設定
今回も前回作ったSTM32CubeMXのファイルをtim1_led_interruptとして別名保存する。
そしてPinoutの再設定である。
一つ目はオンボードLEDの設定である。このLEDはPC13に接続されており、ピンの状態がHighの時は消灯しLowの時は点灯する。
MPUのイラストのPC13の端子を右クリックするとメニューが現れるのでGPIOの出力ピンとして設定し、別名をONBOARD_LEDとしておく、便利なことにこのONBOARD_LEDという名称が生成されるプログラムで利用できるようになる。
つぎはタイマ1の設定である。クロックのみタイマ1に供給し、各チャンネルのタイマピンはDisableにする。
この設定で各チャンネルのタイマピンはタイマから切り離されたことになる。
これでPinoutの設定終わり。
TIM1の詳細設定
更新割り込みが入るようにTIM Update interruptにチェックを入れる。
次に1秒周期、つまり500ms毎に割り込が入るようにプリスケールと自動再ロードレジスタの設定である。
プリスケールは36000分周(36000-1)なので72MHz÷36000=2KHzの周期、そして自動再ロードレジスタを1000(1000-1)にしたので、これで2Hzつまり500msの割り込みが発生するようになる。
以上である。
プログラム生成
初期コードを生成である。これにてSTM32CubeMXの作業は終わりである。
コードを追加
まずはいつものように、割り込み開始のコードを/* USER CODE BEGIN 2 */と/* USER CODE END 2 */の間に追加した。
/* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim1); /* USER CODE END 2 */
HALライブラリィの割り込みのプログラム流儀は、HALライブラリィ指定のコールバック関数に処理を書く、今回はHAL_TIM_PeriodElapsedCallbackという関数を、/* USER CODE BEGIN 0 */と/* USER CODE END 0 */の間に追加した。
/* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM1) { HAL_GPIO_TogglePin(ONBOARD_LED_GPIO_Port, ONBOARD_LED_Pin); } } /* USER CODE END 0 */
STM32CubeMXでオンボードLEDの別名をONBOARD_LEDとするとONBOARD_LED_GPIO_PortとかONBOARD_LED_Pinとかが定義されより抽象的にコードを書くことができる。
HAL_TIM_PeriodElapsedCallbackはタイマのハンドルが渡ってくるのでタイマ1の割り込みか否かチェックする必要がある。
これで書き込めば一秒間隔でオンボードLEDが点滅する。
参考資料
データシート関係
今となっては日本語マニュアル等をどこで入手したかわからないので、当方手持ちのPDFファイルをアップロード公開した。最新版があるならそちらを参考してください。
"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
"STM32F103xx日本語リファレンスマニュアル"をダウンロード
"STM32F100x データシート"をダウンロード
"STM32CubeMXのユーザスマニュアル"をダウンロード
"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード
プログラム関係
- STM32CubeMXの入手はSTマイクロのSTM32CubeMXのページから
- MDK-ARMのダウンロードはKeilのページから