ねころこの備忘録

僕の開発の手順とか実験結果とか感想とかをつらつら書き込んでいくお墓.僕の魂を成仏させるためのお墓です.お経(コメント)待ってます

STM導入からLチカまで

 

1 STM32マイコンとは

STM32マイコンとは,ARMのコアを積んだとっても賢いマイコン.

また,ARM-Cortex-M3を積んでいて,自分たちに最も近いものがNucleoシリーズ.これが,STM32マイコン.今回は,NucleoをMbedとしての開発ではなくて,HALでSTM32としての開発をまとめる.エンコーダを読み,それをUARTで吐き出すなどである.

2 対象ソフトインストール

開発手順としては,STM32CubeMXというソフトで,対象マイコンとそのマイコンで使用するペリフェラルの設定を行い,そこからコードを排出する.そのコードの中をTrueStudioで編集・実行・デバッグをする.STMStudioというものも用いてデバッグを行う.



◆下記サイトより,STM32CubeMXをダウンロードする.

https://www.st.com/ja/development-tools/stm32cubemx.html

 

先に,ほかのソフトウェアもダウンロードしておく.

◆TrueStudioをダウンロード.

https://www.st.com/ja/development-tools/truestudio.html

 

◆STMStudioをダウンロード.

https://www.st.com/ja/development-tools/stm-studio-stm32.html

 

すべて要会員登録である.

インストールに際して,注意点などは特にない.

しいて言うならば,TrueStudioをインストール中に,ドライバのインストールが割り込んでくるので,OKしておくこと.

f:id:ryuga13tk:20190107091223p:plain

関連付けるかどうかは,任意でOK.

 

3 プロジェクトの作り方

STM32CubeMXとは,STM32はレジスタをユーザが操作して,制御することができるが,その設定部分を代わりにやってくれるもの.

STM32CubeMXを起動すれば”New Project”をクリックして,ウィンドウを呼び出す.その際に,初回もしくは環境によってはダウロードが発生する.

f:id:ryuga13tk:20190107091311p:plain

画面左上に”MCU Selector”と”Board Selector”があるので,”Board Selector”を選択.”MCU Selector”では,マイコンではなくCPU単体での開発になる.”Board Selector”であれば,ボードが使用しているST-LINKやLED,PCとのSerial部分のペリフェラルを事前に設定してくれているので,明示的にどのピンがデフォルトで使用中であるかがわかる.

今回は,諸事情によりNucle-F411REを用いた開発手順をまとめる.

まず,”Board Selector”で,F411REと入力.

f:id:ryuga13tk:20190107091322p:plain

出てきたボードをダブルクリックしてプロジェクトを作成する.その際に,ボードにデフォルトでついているペリフェラルを使うかどうかと聞かれるのでYesと回答しておく.

f:id:ryuga13tk:20190107091340p:plain

まずはLチカから.出てきた画面は,CPUの各ピンに役割を設定するためのツール.左側からいじれば,ペリフェラルごとに設定ができる.

それじゃ,まずは下のほうにあるPA5がGPIOに設定されていることを確認する.

f:id:ryuga13tk:20190107091353p:plain

普通にGPIOを設定するだけではなく,右クリックして”Enter user label”を選べば,ユーザでピンの名前を設定することができる.

なので今回は,以下のように設定してやってみる.

f:id:ryuga13tk:20190107091406p:plain

今回はボード上についているブルーボタンも使う.CPUの左側一番上にあるB!~~を使うが,GPIO_Inputに,名前もB1_Blueに変更しておく.

f:id:ryuga13tk:20190107091418p:plain

 

f:id:ryuga13tk:20190107091440p:plain

これは,CPUや各ペリフェラルのクロック数を設定する画面であるが,まあ,設定できるところは最大にしちゃってもいいが,大人になったら消費電力のことも考えて,最適な値になるようにしなくちゃいけない.今回はデフォルトのままで行う.

 

Configratinoでは,各ペリフェラルの詳細設定を行うが,今回は何もいじらないのでパスしておく.エンコーダを読むときになれば,設定することになるので,その時に細かく書いておく.

f:id:ryuga13tk:20190107091458p:plain

 

 

最後の画面である.ここでは,実際に生成するコードに関しての設定を行うことができる.

その前準備としてメニュータブのProjectから設定を呼び出す.

f:id:ryuga13tk:20190107091536p:plain

 

Project NameをEX1GPIOにしておく.Project Locationは任意の場所でOK.

Toolchain/IDEをTrueStudioで設定する.

f:id:ryuga13tk:20190107091601p:plain

 

ここで,もしもTrueStudio以外の状態でコードを生成した場合,不具合だと思うが,STM32CubeMXのプロジェクトも最初からやらないと行けなくなる.

f:id:ryuga13tk:20190107091620p:plain

 

Code Generationで.このようにチェックを付けておく(なんとなく便利だから).

こうすることで,本来だとmain.cに書かれるペリフェラルのinit関数をペリフェラルごとに分散してくれる.

f:id:ryuga13tk:20190107091639p:plain




最後にこれをクリックすることで,任意のディレクトリにコードを生成する.

 

そうしたら,TrueStudioを起動する.

 

 

4 コーディングの方法(Lチカを行う)

1 TrueStudioの使い方

TrueStudioを起動すれば,メニュータブのファイルをクリックして”Open project from filesystem”をクリックして,ディレクトリ-(D)をクリックして,STM32CubeMXで作成したプロジェクトのディレクトリへ移動する.

f:id:ryuga13tk:20190107091658p:plain

 

プロジェクトの名前がEX1GPIOなので,そのフォルダをクリックしてひらく.

この時にそのプロジェクトがあり,チェックが入っていることを確認したら終了をクリックする.

そしたら,プロジェクトが追加されるので,EX1GPIOの中のsrc直下のmain.cを開く.

f:id:ryuga13tk:20190107091718p:plain

 

あとは,whileの中のUSERCODEBEGIN~USERCODEENDまでにコードを書く.こういったものがいくつかあるが,範囲外に書くと,STM32CubeMXで再びコードを排出したときに,書いたコードが消えるので注意を.



main関数の外にグローバル関数として,ButtonStatusを宣言しておく.

/* USER CODE BEGIN 0*/
int ButtonStatus;
/* USER CODE END 0*/

 

while内にこのように書く.

 while (1)
 {
 /* USER CODE END WHILE */
 /* USER CODE BEGIN 3 */
 ButtonStatus = HAL_GPIO_ReadPin(B1_Blue_GPIO_Port, B1_Blue_Pin);
 }
 /* USER CODE END 3 */



実行してみる.

トンカチマークでBuildして,虫のマークでデバッグを開始できる.

f:id:ryuga13tk:20190107091745p:plain

デバッグを開始して,デバッグを切って.

デバッグを押して,次はSTMStudioを使う.

 

2 STMStudioの使い方

STMTStudioを起動して,下記マークをクリックして,プロジェクトの.elfファイルを読み込む.

任意のディレクトリの中のDebugフォルダに.elfがあるので,それを読み込む.

f:id:ryuga13tk:20190107091808p:plain

するとこのように,出てくるので,この中からButtonStatusを探し出す.

ButtonStatusを見つけたらクリックして,右側のImportをクリックする.

ここに表示される変数は,すべてグローバル変数なので,モニタリングしたい関数はグローバルで宣言すること.また,宣言時に以下のように宣言すると,アドレスがおかしくなる.

int a, b, c;
------------------
int a = 0;
int b = 0;

f:id:ryuga13tk:20190107091834p:plain

 

Importすると,このようにButtonStatusが移動する.

これを,ドラッグアンドドロップする.

f:id:ryuga13tk:20190107091848p:plain

すると下のほうにButtonStatusと出てくる.ここまで終われば,

f:id:ryuga13tk:20190107091903p:plain

これをクリックしてデバッグを開始する.

そして,ボードのボタンを押すと・・・

f:id:ryuga13tk:20190107091919p:plain

このように値が動いているのがわかる.



これで,STMStuioはいったん終了する.エンコーダを読むときにもう一度扱う.

f:id:ryuga13tk:20190107091932p:plain

また,ここのVar Viewew 1 asを設定すれば,Curb以外にbar graphとtableで値を視認することが可能である.

では次にGPIOをいじるので,TrueStudioに戻り,whileの中をこのようにする.

 

 while (1)
 {
 /* USER CODE END WHILE */

 /* USER CODE BEGIN 3 */
 ButtonStatus = HAL_GPIO_ReadPin(B1_Blue_GPIO_Port, B1_Blue_Pin);
 HAL_GPIO_WritePin(GreenLED_GPIO_Port, GreenLED_Pin, !ButtonStatus);
 }
 /* USER CODE END 3 */



もう一度Buildして実行をする.

これでボタンを押すとボード上のLD2がボタンに合わせて点滅することが分かる.