【Digi-Key社提供】フレッシャーズ&学生応援特別企画
実験しながら学ぶフーリエ解析とディジタル信号処理
[Vol.2 STM32マイコンの開発環境を準備する]
スペクトル解析やディジタル・フィルタを最適化してマイコンに実装
- 著者・講師:別府 伸耕/Nobuyasu Beppu (リニア・テック)
- 企画編集・主催: ZEPエンジニアリング株式会社
- 関連製品:[VOD]Pythonで学ぶ やりなおし数学塾1【微分・積分】
- 関連製品:[VOD]Pythonで学ぶ やりなおし数学塾2【フーリエ解析】
- 関連製品:[VOD]Pythonで学ぶ マクスウェル方程式 【電場編】+【磁場編】
- 関連製品:[VOD/KIT]STM32マイコン&Wi-Fiモジュールで学ぶ C/C++プログラミング入門
- 関連記事:Pythonではじめる 数値解析入門 [Vol.1 Pythonの開発環境をインストールする]
- 関連記事:Pythonではじめる 数値解析入門[Vol.2 グラフ描画ライブラリ“Matplotlib”で2次元のグラフを描く]
【Index】
STM32マイコンの開発環境をインストールする
STM32系マイコンの開発環境を整える
ここでは,STM32系マイコンを開発するために使う3つのソフトウェアをインストールします.
- “STM32CubeIDE”のインストール
- “STM32CubeProgrammer”のインストール
- “Tera Term”のインストール
対象OSはWindows10とする
これ以降の内容は,OSとして64ビット版のWindows10を使用しているパソコン上での操作を前提とします.他のOSを使用する場合は,ダウンロードするファイルや設定方法などを適宜変更してください.また,ここで紹介する内容は2020年10月におけるものです.今後ソフトウェアの仕様やURLなどが変更される可能性がありますのでご了承ください.
無料の会員登録を済ませておく
今後STM32系のマイコンの開発環境を利用する際に便利なように,無料の会員登録をしておくことをおすすめします.会員登録しなくてもソフトウェアをダウンロードすることはできますが,毎回自分の名前とメール・アドレスを記入することを求められるのでやや面倒です.
STマイクロエレクトロニクス社のWebページ(https://www.st.com/content/st_com/ja.html)にアクセスし,上部のメニューから「ログイン」をクリックします(図1).続いて,「新規登録」をクリックして氏名およびメール・アドレスを登録します(図2).今後の作業はログインした状態で進めるものとします.
STM32CubeIDEをインストールする
STM32系マイコンのための統合開発環境
“STM32CubeIDE”はIDE(Integrated Development Environment: 統合開発環境)という名前のとおり,STM32系マイコンのプログラムを開発するための機能がひととおり揃っている開発環境です.このソフトウェアだけでソース・コードの編集,クロックや内部モジュールの設定,コンパイル,デバッグといった作業をすべて行うことができます.
今回はバージョン1.4.0をインストールします.ダウンロードするファイルの容量は700 Mバイト程度,インストールに必要なディスク容量は2 Gバイト程度です.
STM32CubeIDEのインストーラをダウンロードする
STM32CubeIDEのWebページ(https://www.st.com/ja/development-tools/stm32cubeide.html)にアクセスして,「ソフトウェア入手」をクリックします(図3).
図4のような画面が表示されるので,今回はWindows版インストーラ“STM32CubeIDE-Win”の「ソフトウェア入手」をクリックします.ライセンス契約に同意する旨の確認画面が表示されるので,「同意」をクリックします.するとインストーラのファイルを保存するファイル・ダイアログが開くので(Webブラウザの設定によっては開かない場合もあります),デスクトップなどのわかりやすい場所に保存しておきます.
STM32CubeIDEのインストールを実行する
インストーラのダウンロードが完了したら,圧縮フォルダを展開します.できる限りトラブルを避けるために,インストーラをCドライブ直下に移動させてから起動することをおすすめします.インストーラを起動するとコンピュータに変更を加える旨の確認画面が出るので,「はい」をクリックします.
インストーラの起動画面(図5)が表示されたら“Next”をクリックします.続いてライセンスに関するメッセージが出るので“I Agree”をクリックします.その後インストール先のフォルダを指定する画面が出るので適宜設定します.今回はデフォルトのまま進めます.
最後に,インストールするコンポーネントを選択する画面が表示されます.今回はすべてのコンポーネントにチェックを入れて[Install]をクリックします(図6).しばらく待つとインストールが完了するので,[Finish]をクリックして終了します.
問題なく起動するか確認する
インストールが完了したら,試しにSTM32CubeIDEを起動してみます.初回起動時はファイアウォールに関する確認画面が表示されるので,適宜チェックを付けて[アクセスを許可する]をクリックします(図7).また,統計情報の収集に関する確認メッセージが表示されるので,とりいそぎ[Yes]をクリックしておきます(図8).
以上の確認の後,図9のようにスタート画面が表示されれば作業完了です.STM32CubeIDEを閉じてしまって構いません.
パソコンにNUCLEOボードを接続して確認
NUCLEOボードは,ターゲットとなるマイコン本体の部分と,プログラムの書き込み回路やデバッガとして動作する“ST-Link”と呼ばれる部分から構成されています.
STM32CubeIDEをインストールすると,“ST-Link”とUSB接続するためのドライバが自動的にインストールされます.念のため,パソコンが問題なくST-Linkを認識できているかを確認しておきます.
NUCLEOボードをUSBケーブルでパソコンに接続した状態で,「デバイスマネージャー」を起動します.デバイスマネージャーは[Windowsメニュー]-[Windowsシステムツール]-[コントロールパネル]をクリックして,「デバイスマネージャー」をクリックすると開けます.デバイスマネージャーの「ユニバーサル シリアル バス デバイス」の欄に“ST-Link Debug”と表示されていることを確認してください(図10).もしST-Link Debugが見当たらない場合はST-Linkのドライバが正しくインストールされていない可能性があるので,STM32CubeIDEのインストールをもう一度やりなおすことをおすすめします.
STM32CubeProgrammerをインストールする
マイコンにプログラムを書き込むためのソフトウェア
“STM32CubeProgrammer”は,STM32CubeIDEで作成したプログラム(バイナリ・ファイル)をマイコンに書き込むためのソフトウェアです.
今回はバージョン2.5.0をインストールします.ダウンロードするファイルの容量は160 Mバイト程度,インストールに必要なディスク容量は300 Mバイト程度です.
STM32CubeProgramemrのインストーラをダウンロードする
STM32CubePorgrammerのWebページ(https://www.st.com/ja/development-tools/stm32cubeprog.html)にアクセスして,「ソフトウェア入手」をクリックします(図11).
図12のような画面が表示されるので,“STM32CubeProg”の欄の「ダウンロード」をクリックします.ライセンス契約に同意する旨の確認画面が表示されるので,「同意」をクリックします.例によってデスクトップなどのわかりやすい場所に保存しておきます.
STM32CubeProgrammerのインストールを実行する
インストーラのダウンロードが完了したら,圧縮フォルダを展開します.インストーラをCドライブ直下に移動させてから起動することをおすすめします.インストーラを起動するとコンピュータに変更を加える旨の確認画面が出るので,「はい」をクリックします.
図13にSTM32CubeProgrammerのインストーラの起動画面を示します.[Next]をクリックし,次の画面でも[Next]をクリックします.続いてライセンスの同意確認画面が表示されるので“I accept the terms of this license agreement.”にチェックを付けて[Next]をクリックします.
プログラムのインストール先のフォルダは,デフォルトのままとします.また,インストールするコンポーネントを選択する画面でも,デフォルトのまま“STM32CubeProgrammer”と“Signing Tool and Keygen”を選択します(図14).この画面で[Next]をクリックするとインストールが開始されます.
インストール中に,デバイス・ドライバに関する画面が表示されます(図15).先にSTM32CubeIDEをインストールしていればデバイス・ドライバのインストールも済んでいるはずなので,[完了]をクリックするだけで先に進めます.
インストールが終わるとショートカットの追加に関する画面が表示されるので,お好みで設定してください(図16).
最後に[Done]をクリックしてインストール完了です.
Tera Termをインストールする
シリアル通信の実験で使う仮想ターミナルを導入する
パソコン側でシリアル通信データを表示するために,仮想ターミナル・ソフトを用意します.ここでは,有名なフリー・ソフトの“Tera Term”(テラターム)をインストールする手順を紹介します.
Tera Termのインストーラをダウンロードする
今回は図17に示すOSDNのページ(https://ja.osdn.net/projects/ttssh2/releases/70691)から,バージョン4.102 のインストーラ“teraterm-4.102.exe”をダウンロードします.
インストールを実行する
ダウンロードが完了したらインストーラを起動し,インストール作業を進めます.ライセンス契約に同意し,インストールするコンポーネントの選択画面ではデフォルトのまま先に進みます.使用言語およびショートカットについて設定すると,それまで設定した内容の確認画面が表示されます.ここで[インストール]をクリックするとインストールが始まります.
ボー・レートのデフォルト設定を変更する
今後使いやすいように,Tera Termの設定を変更しておきます.Tera Termは,インストール・ディレクトリ(デフォルトの場合は“C:/Program Files (x86)/teraterm-4.102”)にある“TERATERM.INI”という設定ファイルを読み込んで動作します.このファイルをテキスト・エディタ(メモ帳など)で開いて編集すれば,デフォルト設定を変更できます.
Tera Termのデフォルトのボー・レートは9600 bpsですが,今後の実験では115200 bpsをよく使うので設定を変更しておきます.“TERATERM.INI”の中の“BaudRate”という行を探して,リスト1のように書き換えます.
|
---|
リスト1 Tera Termのデフォルトのボー・レートを設定する |
デフォルトの言語を設定する
“UILanguageFile”という行をリスト2のように書き換えると,Tera Termのユーザ・インターフェースを日本語化できます.なお,もともと日本語で表示できている場合はこの設定は不要です.
|
---|
リスト2 Tera Termのデフォルトの言語設定" |
簡単なテスト・プログラムを作ってみる
新しいプロジェクトを作る
作業用のフォルダを作っておく
ここでは簡単なプログラムを実際に作りながら,STM32系マイコンの開発環境の使い方を確認します.
あらかじめ,Cドライブ直下に一連のプロジェクトを保存する“STM32_projects”というフォルダを作っておきます.今回は,このフォルダの中に“20201013test”というフォルダを作り,その中で作業をすることにします.
STM32CubeIDEを起動する
統合開発環境“STM32CubeIDE”を起動すると,図18のようにワークスペースを選択する画面が表示されます.先に作成しておいた“20201013test”のフォルダを選択して,[Launch]をクリックします.図19に示すスタート画面が表示されるので,“Start new STM32 project”をクリックします.初めてこのツールを使うときは必要なファイルのダウンロードが行われるので,しばらく待ちます.
使用するマイコンの型番を選ぶ
最初に“Target Selection”という画面が表示されます(図20).今回は“STM32F446RET6”というマイコンが搭載されている“NUCLEO-F446RE”ボードを使用するので,“Part Number”の欄に“STM32F446RE”と入力します.すると“MCUs/MPUs List”の欄に候補が1つだけ表示されるので,これを選択して[Next]をクリックします.
プロジェクトの名前を決める
続いて図21のようにプロジェクトの名前の入力する画面が表示されます.“Project Name”の欄に好きな名前を入れてください.今回は“test1”としました.“Options”の項目はデフォルトのままにしておきます.[Finish]をクリックすると,図22のメッセージが表示されます.これは,新しくプロジェクトを作った後にそのままデバイスの内部設定画面を開くかどうかの確認メッセージなので,そのまま[Yes]をクリックします.
“Pinout & Configuration”画面が表示される
プロジェクトのデータが作成されると,図23のような画面が表示されます.この“Pinout & Configuration”画面で,各ピンの用途や内部モジュールの詳細設定を行います.なお,この画面は左側に表示されているツリーの“test1.ioc”をダブル・クリックすればいつでも開けます.
NUCLEO-F446REボードにおけるピンの割り当て
今回は,NUCLEO-F446REボードを単独で使います.ボード上の各コンポーネントに接続されているピンの番号を表1に示します.“PA5”は「ポートAの5番ピン」を表します.
NUCLEOボードには,パソコンとUSB経由で接続できる“ST-Link”が搭載されています.“UART2”を使うと,このST-Linkを経由してパソコンとシリアル通信をすることができます.
また,NUCLEOボードにはクロック回路用の水晶発振子が取り付けられていません(リアルタイム・クロック用の32.768 kHzの振動子は実装されている).“STM32F446RET6”マイコンには,内部に16 MHzのRC発振回路があります.周波数の精度は1\%とのことなので,シビアなタイミング処理をしない限りはこの16 MHzのクロックを使うことにします.
ピンの機能を設定する
ここでは,NUCLEOボード上の緑色LEDを光らせるために“PA5”を出力ピンとして設定します.また,パソコンとシリアル通信をするために“PA2”をUARTのTX出力,“PA3”をUARTのRX入力に設定します.
“Pinout & Configuration”の画面で設定したいピンをクリックすると,そのピンで使用できる機能の一覧が表示されますPA5を選択した様子を図24に示します.今回はこの状態で“GPIO_Output”を選択します.同様にして,PA2を“USART2_TX”,PA3を“USART2_RX”に設定します.
UARTモジュールの設定をする
“Pinout & Configuration”画面の左側の周辺モジュール一覧から,“Connectivity”を展開します.この中から“USART2”をクリックして設定画面を開きます(図25).最初は“Mode”の欄が“Disable”になっているので,プルダウン・リストの中から“Asynchronous”(非同期モード)を選択してください.その他のプロパティはデフォルトのままで使いますが,念のため“Baud Rate”の欄が“115200 Bits/s”になっていることを確認してください.
クロックの設定をする
“Pinout & Configuration”の隣にある“Clock Configuration”のタブをクリックすると,クロック設定の画面が開きます(図26).
今回はマイコン内蔵の16 MHz発振回路である“HSI RC”(high-speed internal RC oscillator)を使用します.クロックをPLL(phase locked loop)の回路に入力して周波数を上げ下げすることもできますが,今回はデフォルトのままで使います.CPUのコア部分および周辺モジュールがすべて16 MHzで動作することになります.
設定を保存する
以上の設定が完了したら,キーボードで[Ctrl]+[s]を入力して設定を保存します.“Do you want generate Code?”とメッセージが出るので[Yes]をクリックします.続いて,ソース・コードの編集画面に移動しても良いか聞かれるので[Yes]をクリックします.これらの確認ウィンドウは毎回表示されますが,“Remember my decision”にチェックを付けておけば表示されなくなります.
水晶振動子を接続してクロックを生成する場合
今回は使いませんが,マイコンに対して水晶振動子を接続してクロックを生成する方法について触れておきます.“STM32F446RET6”の場合は“PH0”と“PH1”が水晶振動子を接続するピンとして割り当てられているので,“Pinout & Configuration”の画面でこれらのピンを“RCC_OSC_IN”および“RCC_OSC_OUT”に設定します.
続いて,“System Core”の設定メニューから“RCC”(reset and clock controller)の画面を開き,“High Speed Clock (HSE)”の欄を“Crystal/Ceramic Resonator”に設定します.
ここまでの設定をした後に“Clock Configuration”の画面を開くと,“HSE”(high-speed external clock)回路に印加する“Input frequency”の欄が入力できるようになっているので,自分が使う水晶振動子の周波数を入力します.もしPLLや分周期を使う場合は,適宜逓倍・分周の設定を行ってください.どこかの周波数が赤い表示になった場合は対応周波数外になっているので,エラーがなくなるように分周比などを調整してください.
プログラムを書いてコンパイルする
main.cのソース・コードを開く
ここまでの設定を保存すると,“main.c”のソース・コードが開いた状態になります.もし開かない場合は,左側のツリーの中から“Core”-“Src”-“main.c”をダブル・クリックして開いてください(図27).
先に“Pinout & Configuration”や“Clock Configuration”の画面で設定した内容は,このmain.cのソース・コードの終わりの方に記載されています.例えば,GPIOの設定内容は“MX_GPIO_Init()”という関数に記述されています.
また,main.cにコードを書くときは“USER CODE BEGIN”と“USER CODE END”というコメントの間に記述するようにします.これ以外の場所にコードを書くと,後で“Pinout & Configuration”などを変更したときに自動的に消去されてしまうので注意が必要です.
main.cの内容を記述する
“main.c”のソース・コードの中から,main()関数を探してください.66行目からmain()関数が始まっているはずです.main()関数の最初の部分では内部レジスタの初期設定をしているので,そのままにしておきます.
97行目からwhile()文によるループが始まるので,この中に動作テスト用のコードを記述することにします.while()文の内容を,次のリスト3のように書き換えてください.これは,LEDを点滅させながらUARTを使って“test”という文字列を送信するプログラムです.
|
---|
リスト3 “main.c”のwhile()文の中をこのように書き換える.NUCLEOボード上のLEDを点滅させ,UART経由で“test”という文字列を送信する |
ソース・コードの解説
PA5に接続されているLEDを点灯させるために,“GPIOA-$>$ODR”と記述してGPIOのポートAの“ODR”(output data register)にアクセスして内容を書き換えています.今回は他に接続している機器もないので,大雑把に“0xff”を書き込んでいます.LEDを消灯するときの処理も同様です.
UART経由でデータを送信するときは,“HAL_UART_Transmit()”関数を使います.第1引数は使用するUARTのインスタンス名,第2引数は送信するデータ,第3引数はデータの長さ,第4引数はタイムアウト時間で単位はmsecです.
“HAL_Delay()”関数は時間待ち用の関数で,引数の単位はmsecです.
コンパイルする
上記のコードを追記してから,キーボードで[Ctrl] + [b]を入力します.画面下部のコンソールに“Build Finished. 0 errors, …”と表示されれば成功です.
マイコンにプログラムを書き込んで動作確認する
STM32CubeProgramemrを起動する
NUCLEOボードをUSBケーブルでパソコンに接続した状態で,STM32CubeProgrammerを起動します.この状態で右上の“Connect”ボタンをクリックすると,マイコン内部のデータ読み込まれます(図28).
プログラムを書き込む
左側に並んでいるアイコンの中から,上から2番目の“Erasing & Programming”をクリックします(図29).“File path”の欄の“Browse”ボタンをクリックして,先ほど作っておいたバイナリ・ファイルを選択します.今回の場合はワークスペースのフォルダである“20201013test”の中に“test1”というプロジェクトのフォルダがあり,その中の“Debug”フォルダの中にある“test1.bin”というバイナリ・ファイルを選択します.
念のため,“Verify programming”にチェックを入れてベリファイ(マイコンに書き込んだプログラムを読み込んで内容が合致するかチェックすること)をするようにしておきます.
この状態で“Start Programming”ボタンをクリックすると書き込みが始まります.正常に書き込まれると“Download verified successfully”というメッセージに続いて“File download complete”というメッセージが出ます.両方とも[OK]をクリックしておきます.
書き込みが完了したら,ウィンドウ右上の“Disconnect”ボタンをクリックしてNUCLEOボードとの接続を切っておきます.
プログラムを実行する
プログラムを書き込んだ後にNUCLEOボード上の黒いリセット・ボタンを押すと,プログラムが実行されます.緑色のLEDが1秒周期で点滅すれば成功です.
この状態でTera Termを起動して「シリアル」を選択します.「ポート」の欄に“STLink Virtual COM Port”が表示されるので,これを選んで[OK]をクリックします(図30).[設定]-[シリアルポート]をクリックして,「スピード」の欄を“115200”に設定します.図31のように1秒間に1回“test”という文字列を受信できていれば,シリアル通信の実験も成功です.なお,[編集]-[バッファのクリア]をクリックすると受信した内容を消去することができます.
STM32CubeIDEでprintf()を使えるようにする
デバッグで便利な“printf()”関数
パソコン上で動作するプログラムを作る時は,変数の値などを画面に表示する“printf()”関数を使うとデバッグの際に便利です.これに対して,一般的なワンチップ・マイコンを扱う場合はパソコンの標準出力に相当する「画面」が無いので,デフォルトの状態ではprintf()関数が実装されていません.そこで,ここではUARTでパソコンに対して文字列を出力することを前提として,printf()関数を実装してみることにします.
“stdio.h”をインクルードする
printf()関数のプロトタイプ宣言が記述されているヘッダ・ファイルの“stdio.h”をインクルードしておきます.“main.c”の先頭部分に“USER CODE BEGIN Includes”というコメントがあるので,その部分にリスト4の内容を記述します.
|
---|
リスト4 プログラムの先頭部分で“stdio.h”をインクルードする |
_write()関数を記述する
printf()関数が標準出力に対してデータを出力する処理は,“_write()”関数として定義されています.この_write()関数を再定義すると,文字列をUART経由で出力することができます.main()関数の手前に“USER CODE BEGIN 0”というコメントがあるので,この部分にリスト5の内容を記述します.
文字列を送信する処理は“HAL_UART_Transmit()”関数を使っています.今回はNUCLEOボードをST-Link経由でパソコンに接続して使うことを想定しているので,使用するUARTのチャネルは“UART2”となります.そのため,第1引数は“&huart2”としています.もし他のUARTのチャネルを使う場合は,この部分を適宜書き換えてください.また,第4引数のタイムアウト時間は10msecとしていますが,この値も状況にあわせて適宜変更してください.
|
---|
リスト5 _write()関数の中でUARTを標準出力として定義する |
float型を扱えるようにする
STM32CubeIDEのメニュー・バーから,[Project]-[Properties]をクリックすると,プロジェクトのプロパティを設定する画面が開きます.この画面の左側のツリーの中から“C/C++ Build”を展開し,“Settings”をクリックします.ここで,図32に示すように“Tool Settings”タブの“Use float with printf from newlib-nano (-u_printf_float)”にチェックを付けます.
これで,printf()関数を使ってfloat型の変数を出力できるようになります.なお,double型には対応していないようです(double型の変数を出力してもエラーにならないがfloat型の桁数で切られる).
“printf()”関数の動作テスト
以上でprintf()関数を使う準備が整ったので,動作テストをしてみます.main()関数内のwhile(1)ループの部分をリスト6のように記述します.このプログラムをコンパイルしてマイコンに書き込みます.Tera Termを起動してからNUCLEOボード上のリセット・ボタン(黒)を押して,プログラムを走らせます.図33のように,1秒に1回ずつ変数“i”の値がインクリメントされる表示が出れば成功です.
|
---|
リスト6 main()関数のwhile(1)ループの中に処理を記述する |