STM32F103C8T6マイコンボード

アマゾンで310円でSTM32F103C8T6マイコンボードを購入した。
ブレッドボードに刺して実験できるので使い勝手がよい。

そこでSTM32学習で使おうとSTM32CubeMXでソースを生成することにした。

久々の半田付け

久々の半田付け

プロジェクト設定

STM32CubeMXのMPUをSTM32F103C8T6を選択しプロジェクト設定は以下のようにした。
生成するコードはMDK-ARM V4用である。
MPUの選択の詳細はSTM32CubeMX その2-Lチカやってみようを参照のこと。

プロジェクト設定

プロジェクト設定

クロックの設定

STM32(arm)のマイコンの最初の鬼門はクロック設定である。今回入手したSTM32F103C8T6マイコンボードには参考になるソースがなかったので試行錯誤で設定をした。
要点は、STM32F103C8T6は72Mhzが最高速度で、このボードには小さいながら8MHzとRTC用の水晶が載っているので適切に設定する必要ということ、幸いにもSTM32CubeMXは限界を超える設定をすると赤い警告がでるので直観的で設定しやすい。

STM32CubeMXで試行錯誤で設定した結果がこれである。
詳細はキャプチャした画面図を参考して貰いたい。

クロックの設定

クロックの設定

その3はタイマのプログラム

その2でGPIOを使ったLチカのプログラムを記述したが、その3はタイマだろうということで、タイマについて書く。

STM32のタイマの機能は、

  1. カウンタ値によってタイマ出力ピンのレベルを変化させる。
  2. カウンタ値によって割り込みを発生させる。
  3. タイマ入力ピンに与えられたパルスの回数やパルス幅の測定。

がある。

1.には、タイマ値によってタイマ出力ピンをオンオフする比較出力(アウトプットコンペア出力)とPWMがあるが、今回は比較出力(アウトプットコンペア出力)である。

比較出力(アウトプットコンペア出力)

そもそも比較出力(アウトプットコンペア出力)とはという話であるが、STM32は複数のタイマを持っているが、タイマひとつに4つのタイマ出力ピンを持っている。
異論があるかもしれないが、タイマ出力ピンのオンオフの割合を設定するのがPWMとするなら、タイマ出力ピンのオンオフの周期を設定するのが比較出力(アウトプットコンペア出力)だと言えるかもしれない。
タイマ出力の変化タイミングは、タイマに与えられたクロックとプリスケールと自動再ロードレジスタの値できまるのである。

比較出力とPWMのタイミング

比較出力とPWMのタイミング

タイマ1の4つのタイマ出力ピンを1秒間隔で点滅

今回はタイマ1の4つのタイマ出力ピンを1秒間隔で点滅させる。これが目標である。

Pinout設定

まずはSTM32CubeMXのPinoutでTIM1を図のように設定する。

タイマ1のPinout設定

タイマ1のPinout設定

この設定でタイマ1のクロックを72MHzの内部クロック(APB2)とし、PA8~PA11までの4ピンをタイマ出力ピンとした。

TIM1コンフィグ

次は1秒間隔で点滅するように設定をしていく。コンフィグでタイマ1のボタンを選択し、

タイマ1の選択ボタン

タイマ1の選択ボタン

タイマ1の詳細を設定する。

タイマ1のコンフィグ

タイマ1のコンフィグ

これは意図した周期でタイマ出力ピンをオンオフさせる設定である。

まずはオンオフさせる周期の設定である。STM32のタイマのプリスケールと自動再ロードレジスタはともに16ビットつまり 65535まで設定できる。プリスケールを72000000にすればプリスケールだけで1秒間隔を作れるが65535までの値が設定できるので、今回は36000分割(36000-1)を設定する。これで72Mhz÷36000=2000つまり2KHzの周期で変化するので自動再ロードレジスタを2000カウント(2000-1)と設定すれぱ1秒周期を作り出せる。

次にピンの振る舞いであるが、これは各ピンの設定でする。
今回は4つアクティブにしたタイマ出力ピンのmodeをToggle on modにすれば点滅をする。点滅の開始点はPulseの値できまるので1,501,1001,1501にした。以上で設定は終わりである。

プログラム生成

初期コードを生成である。これにてSTM32CubeMXの作業は終わりである。

プロジェクトの生成

プロジェクトの生成

コードを追加

STM32CubeMXでは初期化までのコードを生成してくれるが、動作させるコードはユーザが書く必要がある。今回はタイマ1比較出力を始めるコードだ。/* USER CODE BEGIN 2 */と/* USER CODE END 2 */の間に以下のコードを追加した。

  /* USER CODE BEGIN 2 */
  if (HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1) != HAL_OK) 
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2) != HAL_OK) 
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_3) != HAL_OK) 
  {
    Error_Handler();
  }
  if (HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_4) != HAL_OK) 
  {
    Error_Handler();
  }

  /* USER CODE END 2 */

これで4つのLEDが1秒ごとに点滅するようになる。

一秒間隔で点滅

一秒間隔で点滅

簡単だが難しい

STM32CubeMXの完成度が高く直観的かつ簡単にプロトタイプのソースを生成できるのだが、ソースを完成させるにはSTM32そのものの知識が必要なうえHALライブライに詳しい必要がある。
HALライブライの情報がすくないので、ターゲットMPUのデータシートやHALライブラリィのドキュメントやHALライブラリィのサンプルソースを丹念に読み込んで理解する必要がある。簡単だが難しい。

参考資料

データシート関係

今となっては日本語マニュアル等をどこで入手したかわからないので、当方手持ちのPDFファイルをアップロード公開した。最新版があるならそちらを参考してください。

STM32F100xx 日本語リファレンスマニュアル"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
STM32F103xx日本語リファレンスマニュアル"STM32F103xx日本語リファレンスマニュアル"をダウンロード
STM32F100x データシート"STM32F100x データシート"をダウンロード
STM32CubeMXのユーザスマニュアル"STM32CubeMXのユーザスマニュアル"をダウンロード
STM32F1xxx HALドライバ・ユーザマニュアル"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード

プログラム関係