環境を構築
ソフトウェア
ソフトのインストールなどの細かい説明は省略するが、ばんとさんは、STM32CubeMXは一応Windowsのみ対応というので、STマイクロサイトよりダウンロードしたSTM32CubeMXをWindows8.1にインストールした。
ばんとさんはmbed LCP1114用にMDK-ARM V4(uVision 4) LITE(32Kの制限のあるフリー版)をインストールしているので、STM32CubeMXから吐き出すソースはMDK-ARM V4とすることにした。
ハードウェア
今回ばんとさんがSTM32CubeMXを学習するプラットフォームはSTM32 Value line DiscoveryとSTbeeである。共にCortex-MのARMでSTマイクロではF1シリーズと呼ばれるMCUが載っているボードだ。現在入手が容易でばんとさんも持っているSTM32F401RE-Nucleoなどのボードでもいいのであるが、STbeeはSTM32を勉強した川内さんの『STM32マイコン徹底入門』のターゲットボードで、書籍で使うStandard Peripherals Libraryとは違うがハードウェアは同じなので参考にできるという算段で選んだ。
STM32 Value line Discoveryは各種!?端子付きのベースボードに載っててテストしやすいのでメインで使用する。
STbeeはUSBやSDIOなどをサポートした高性能なMCUなので、STM32 Value line Discoveryでテストできないときは、こちらを利用することにする。
STM32CubeMXでの作業
改めてSTM32CubeMXの話である。
STM32CubeMXでは以下の手順でひな形のソースを吐き出す。
- MCUの選択
- クロックの設定
- 各種周辺機器の設定
- プロジェクトのセーブ
- ひな形のソースの吐き出し
設定データをファイルとして保存できるので、納得できるまで設定修正できる。
ここではSTM32 Value line DiscoveryをターゲットにLチカプログラムが出来るまで順を追って説明する。
MCUの選択
STM32CubeMXを起動すると以下のような画面が出るのでNew Projectを選ぶ。
MCU選択画面が出てくるのでSTM32 Value line DiscoveryのMCUであるSTM32F100RBTxを選択する。
MCUを選択すると、Pin設定などができる画面に移行する。
クロックの設定
STM32(ARM)は周辺機器が豊富なのでクロックは複雑で、データシートや川内さんの解説本でも多くのページを割いて記述されている。設定も相当ややこしいのであるが、クロックを正しく設定しないと正しく動作しないのだ。
第一の関門である。
クロック信号を入力するPinの設定
STM32 Value line Discoveryは、8MHzの水晶発振子とRTC用水晶発振子をクロックソースとしているので、以下の手順で設定を行う。
まずはPinout設定で、クロック信号を入力するピンの設定で、8MHzの水晶発振子とRTC用水晶発振子を信号を利用するように設定する。
クロック信号の適切な設定
STM32 Value line DiscoveryのMCUであるSTM32F100RBTxの動作周波数は24Mhzが最高らしいので、8Mhzのクロックを2分周してPLL(位相同期回路)のソースとし、これを6逓倍して24Mhzを作る。
これをクロックコンフィグ画面にて設定していく。クロックの分岐の具合や最高速度超えの設定をすると赤文字の警告が出てくるので、データシート片手にソースを書くより効率的だ。
GPIOの設定
ボード上のLEDの次はLチカをする為にGPIOの設定だ。AVRなどでGPIOの設定をするならポート方向レジスタの設定で終わりなのだが、STM32(ARM)の場合はポートの設定の他にも、クロック配給設定が必要になってくる。
GPIOやタイマなどの周辺機器は、デェフォルトは停止状態でクロックを配給して始めて動くのである。
STM32 Value line Discoveryは、PC8,PC9にLEDが接続されているので、今回はこれを出力用のGPIOに仕立ててLチカさせてみる。
これをSTM32CubeMXで設定するなら以下のようになる。PC8,PC9のピンをクリックしてGPIO_Outputにする。
GPIO_Outputのプッシュプル接続・オープンドレイン接続などの詳細設定は、この画面でGPIOのポタンをクリックする。
クリックすると詳細画面が出るので設定をする。
Lチカなら以上の設定で終わりだ。
プロジェクトの保存及びソースコードの生成
次にプロジェクトを生成する為に設定をする。ALT+PまたはメニューのProjectよりSettingsを選択し適切に設定する。
これでプロジェクトがセーブできるようになったので、メニューからFileからSaveを選んで保存する。
Ctrl+Shift+GかメニューからProjectよりGenerate Codeを選べばソースコードが生成される。
これでSTM32CubeMXの作業は一旦終わり。
生成されたMDK-ARMのプロシェクト
生成されたプロジェクトをMDK-ARM V4で読み込むと以下のように読み込まれた。コンパイルなどは問題なく行えるのだが、ST-Linkの”JTAG接続からSW接続へ”の修正をしないと書き込み・デバッグが出来なかった。
ソースはHALの流儀通り、周辺機器の初期化はstm32f1xx_hal_msp.cファイルに割り込みなどはstm32f1xx_it.cファイルに分かれて生成される。
ユーザコードを書き込む場所
生成されたソースは周辺機器の初期化までなので、生成されたものをコンパイルしてターゲットに書き込んでもLEDは点滅しない。LEDの点滅はユーザがプログラミングする必要がある。
以下は生成されたソースの抜粋だ。
/* USER xx BEGIN xx */ と /* USER xx END xx */ という一対のコメントがあるが、このコメント間にユーザコードを書く必要がある。これ以外の場所で書くとSTM32CubeMXで再度コードを生成したときに消されてしまうので注意が必要だ。
/* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_RTC_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_8); // ここはばんとが追加 HAL_Delay(100); // HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_9); // HAL_Delay(100); // } /* USER CODE END 3 */ }
/* USER CODE BEGIN 3 */と/* USER CODE END 3 */の間に、LEDが点滅するようにコードを追加した。これをコンパイルして書き込めばボード上のLEDは点滅する。
今回はSTM32CubeMXの簡単な使い方を書いたが、これにて終了。
次回以降は、もう少しつっこんだSTM32CubeMXの使い方やHAL流のソースの書き方を検証しながら書く。
参考資料
データシート関係
今となっては日本語マニュアル等をどこで入手したかわからないので、当方手持ちのPDFファイルをアップロード公開した。最新版があるならそちらを参考してください。
"STM32F100xx 日本語リファレンスマニュアル"をダウンロード
"STM32F103xx日本語リファレンスマニュアル"をダウンロード
"STM32F100x データシート"をダウンロード
"STM32CubeMXのユーザスマニュアル"をダウンロード
"STM32F1xxx HALドライバ・ユーザマニュアル"をダウンロード
プログラム関係
- STM32CubeMXの入手はSTマイクロのSTM32CubeMXのページから
- MDK-ARMのダウンロードはKeilのページから