ST Microelectronicsが送る、STM3に開発エコーシステムによる開発実習第2弾、GPIO実習編です。マイコンのペリファラルの基礎となるGPIOのソフトア実装体験をしていただきます。それでは始めましょう。この実習ではGPIOの割り込み機能を使ったスイッチ入力の判定を実現いたします。また、スイッチ入力に合わせてGPIOの出力を制御し、エルチ化を行います。使用する機材は、ニュークレーボードとオードに実装されている青色のボタンのユーザースイッチと、図に示すあたりになります、緑色のLEDであるLED2を使用します。この先は実際に通路を動かしながら進めてまいりますので、随時が面を切り替えてご説明いたします。ビデオですので、皆様の都合の良いタイミングで止めたり進めたりしていただければと思います。では早速CubeMXを起動してみましょう。スタートメニューをクリックして開いた後、STM32と入力してみてください。CubeMXがスタートメニューに現れましたら、それをクリックして開きます。まずはじめにCubeMXのアップデートセッティングの変更を行います。CubeMXのHELPメニューを表示し、アップデートセッティングを開きます。ホップワックインドの株にあります。データオートリフレッシュの設定をオートリフレッシュから一つ上のノーオートリフレッシュに変更します。それでは実際の操作です。変更の理由ですが、CubeMXが起動する際にCubeMXが使うファイル等の更新確認を行います。毎回更新確認を行うため、皆様のインターネットファンクを考慮し、今回はアップデートの確認をハブく設定にして進めます。もしインターネットの環境が整っている場合には、音に戻してお使いください。最新の状態で作業を開始することができます。もしインターネットに直接接続されていない、企業ないネットワーク等につないでいる場合、プロギッシュサーバーなどの設定が必要となる場合があります。その場合、先ほど開いたアップデートセッティングインドのコネクションパラメータタブ内にありますと設定メニューを使って設定することで接続することが可能です。設定方、チェックコネクションのボタンをクリックしていただき、緑色のグリーンのマークが表示されていればOKです。それでは実際の実習に入ります。QMXはプロジェクトを作るにあたって3つのアプローチがあります。1つ目はSTM32デバイスを性能やペリファラル、パッケージの種類等のフィルタ機能を使って選択して始める方法です。2つ目はSTマイクロエレクトリニックスが販売しているSTM32評価ボードの中から選択して始める方法です。3つ目は共合多者のデバイスを比較して似た性能や機能を持つSTM32デバイスを検索し選択して始める方法です。今回のGPIO実習では1つ目のデバイスを選択して始める方法を使って進めます。QMXの初期画面からニュープロジェクトにある3つのボタンのうち1番上のアクセス2MCUセレクターをクリックしポップアップされたウインドウの左側のフレーム内になります。シリーズはSTM32F4O、ラインはSTM32F401をパッケージはLQFP645をそれぞれ選択します。そうしますと右側のフレームにフィルタによって絞られたデバイスの一覧を見ることができます。その中のSTM32F401REをダブルクリックします。デバイスを選択しますとずどいような画面が現れQFP64パッケージの字で示されたSTM32F401REが見えます。では実際に操作してデバイスを選択してみましょう。アクセス2MCUセレクターをクリックしますとこのようにウインドウが開きましてシリーズはF45をクリックします。続いてF401を探してクリックします。さらにパッケージをQFP64を選んでいただきますとデバイスが寄っちゃられます。ちょっと見にくいので広げてあげますと一番下に401REが見つけられますのでそれをダブルクリックするとこのような画面が開きます。次に画面にありますQFP64パッケージで示されたピンに直接ピンの設定をしていきます。今回使うピンは2つです。1つ目はボード上の青色のボタンのユーザースイッチにつながっているPC13と緑色のLEDのLED2につながっているPA5です。PC13のピンを探してクリックします。するとポップアップインドが現れPC13に割り当てることができる機能の一覧が現れます。今回PC13は割り込み入力として使えますので一番下のGPIO EXTI13を選択します。GPIO EXTI ホニャラはGPIO割り込みの機能を示しています。選択するとPC13のピンが緑色に変化します。同様にPA5のピンを探してクリックします。今回PA5はGPIOの出力として使えますので下から4つ目のGPIOアウトプットを選択します。選択するとPA5のピンも緑色に変化します。それぞれのピンをサイドクリックしますと選択された機能がハイライトされて確認することができます。それでは実際に操作して設定してみましょう。PC13は左上にありましてクリックしました。次にPA5を探すのですがちょっと見にくい場合は拡大をすることができます。ずらしたり拡大したりすることができますのでPA5をクリックしまして下から4つ目のGPIOアウトプットを選択しておきます。この後PC13をもう一回クリックしますとこの緑を深緑で設定されたのがわかります。ピン数が多いデバイスは検索テキストボックスからPC13とか入れて検索することもできます。続いてクロックの設定をしていきます。画面上部にありますクロックコンフィグレーションのタブをクリックして開きます。開いた画面ではコアクロックやPDEL、ペリファラに必要なクロックと全てのクロック設定がGUI上で行います。開いた画面の中央よりにHTLKの設定があります。デフォルトでは16MHzに設定されていますので最大周波数の84MHzに設定します。このクロックコンフィグレーションの優れているところは必要に応じて設定したい項目以外の設定も自動的に検討変更してくれる点です。例えば今回の例ですとデフォルトでは元クロックとして内蔵のHSI、ハイスピードインターナルクロックの16MHzを選択していますがこのままですと16MHz以上のHTLKの設定はできません。CubeMXはそれを考慮し、新たなクロックソースの選択を提案します。ユーザーがその提案に同意すると自動的にPDLを経由した設定に切り替え目的の周波数になるように設定します。では実際に設定してみましょう。クロックコンフィグレーションタブをクリックしてHTLKはこちらですね。16MHzを84MHzにしてエンタ押すとチェックが始まってポップアップができます。クロックソースを使えませんかってやつですね。元々HSI経由だったものをOKを押しますと自動的にPLKの設定に切り替えて84MHzが使えるようになります。次にサイドピンアウト&コンフィグレーションタブに戻りピンの詳細設定を行っていきます。画面左端のフレームにはコンフィグレーションカテゴリーが並んでいます。フレーム幅が小さいときにはグレーの境界線を回してドラックすることでサイズを変えることができます。GPIOはシステムコアのグループに含まれています。システムコアからGPIOを選択するとGPIOのモード&コンフィグレーションインドがいらきます。コンフィグレーションのリストには先に設定したPA5とPC13が並んでいます。それぞれクリックして詳細設定を行います。PA5はGPIOアウトプットの設定ですのでGPIO初期過時に設定される出力レベルを設定します。設定項目はGPIOアウトプットレベルです。フルダウンメニューからハイを選択します。これはPA5につながったLEDのLED2がハイアクティブで点灯する回路になっているので初期過時に点灯するように設定するためです。次にPC13はGPIOの外部割り込みとして機能させています。割り込みのモードを立ち下がりエッジで割り込みが発生するようモードを設定します。設定項目はGPIOモードでExternal Interrupt Mode with Falling Edge Trigger Detectionに設定します。これはPC13に接続されているユーザースイッチの一方がグランドに接続されておりスイッチがローアクティブで点灯する回路設計になっているためです。では実際に設定してみます。Pin Out & Confirmed Tabをクリックしてグレーのところをつまんでちょっと広げてあげます。システムコアの中にGPIOモードがありますのでクリックしますと先ほどのPA5とPC13が見えます。PA5はGPIO outputレベルをローからハイに切り替えましてPC13の方はGPIOのモードをインターフットモードを変えます。External Interrupt Mode with Falling Edge Trigger Detectionに変えます。次に割り込みに関する詳細設定を行います。STM32マイコンではこれらの設定をLVICと呼ばれる割り込みコントローの中で設定します。ちなみにLVICはNestoid Vectored Interrupt Controllerの略です。LVICもGPIOと同様システムコアのカテゴリに属します。システムコアからLVICを選択するとMode & Configuration Windowが開きます。開いたWindows内には全ての割り込みがリストされています。今回設定するGPIO割り込みは13ですのでリストの下から2番目にあります。EXTI Line 15-10 Interruptを選択しInable Roadにチェックを入れて有効化します。またこの後使用するSTM32ハルドライバではシスティックを呼び出すものも含まれております。そこでシスティック割り込みを優先させるためWindows株にあります。Preemption Priorityを1にセットします。この数字が大きいほど割り込み優先度が低くなり15が一番低く0が一番高い優先度となります。ちなみにGPIOによる割り込みのいくつかは内部で論理を追わされて一つの割り込みとして動作します。今回の場合GPIO外部割り込み13は10から15の6つのGPIO外部割り込みと共通の割り込みベクターを使って機能します。では実際に操作して設定してみましょう。NBICを選択しまして下から2番目の外部割り込みのところですね。チェックを入れます。で、Priorityのレベルを0から1に変えます。ここまでの設定で前後の設定は終了です。この後は生成するプロジェクトファイルに関する設定を行っていきます。画面上部にあります。まずプロジェクトマネージャーをクリックして開きます。まずはじめにプロジェクトの名前を設定します。プロジェクトネームにプロジェクトの名前を設定しプロジェクトロケーションにはプロジェクトを保存するルートディリクトリーを設定します。ここで重要な注意点です。プロジェクト名やプロジェクトを保存するフォルダのパスに全角半角スペース、漢字カダなどの2バイト文字を含めてはいけません。使うツールによってはパスが通らなくなりプロジェクトをビルドする際にエラーになることが報告されています。次にコード生成時の詳細設定を行います。画面左側の上から2番目にあります。コードジネータをクリックします。デフォルトではビルドに必要ない全てのファイルをプロジェクトフォルダにコピーする設定になっておりプロジェクトを作るたびに膨大な量のファイルが複製されPCのストレージをアパックすることになります。そこで最上段設定2番目のコピーオンリーネスサリーライバリーファイルズに変更し、不必要なファイルのコピーを防ぎます。では実際に設定してみましょう。続いてプロジェクトマネージャーをクリックしましてプロジェクトの名前を入れます。試しにSTM32F401REGPIOと入れて設定しました。アプリケーションストラクチャーでデフォルトのベーシックのままで設定ができるのですがデフォルトのベーシックのままでやります。ツールチェーンは今回イダルアームを使うのですが他のツールチェーンを使う方はこちらで切り替えていただくとコード生成時にそれぞれのツールチェーンIDに合わせたプロジェクトファイルを生成してくれます。またマイクのスタックやヒープのサイズをここで変更することができます。デフォルトのメニューに引き継がれるようになっています。コードジェネーターをクリックしましてこの設定ですね、一番上のデフォルトの設定ですとコピーするハルドライバーの方が全部コピーされてしまうので必要なものだけにします。これで初期化コードを生成する準備がすべて整いました。設定してこなかった細かな内容に関しましてはベッドキューブメックスのユーザーマニュアル等をクリックしますのでそちらを参考にしていろいろ試してみてください。では画面右上にありますGenerateコードをクリックします。しばらくしてコード生成が完了すると生成されたプロジェクトファイルを設定したツールチェーンで開くかフォルダを開くか一旦終了するかの選択肢を訪ねてきます。EWARMを使って開くのでオープンプロジェクトをクリックして開きます。では実際にコード生成をしてプロジェクトファイルをEWARMで開いてみましょう。画面右上のですねGenerateコードこちらになりますがこちらをクリックしますとコード生成が始まります。生成が完了しますとオープンプロジェクトこちらをクリックしまして自動的EWARMを立ち上がるようになっています。無事EWARMが開き動して生成されたプロジェクトファイルが開いたでしょうか。ここで念のためビルのが通ることを確認します。EWARMのプロジェクトメニューから全てを再ビルドを選択しビルドします。では実際にやってみます。EWARMですねプロジェクトメニューから真ん中たりの全てを再ビルドをクリックしてビルドします。ビルドが完了しますとメッセージが出てきます。エラーの合計数とワーニングの合計数がゼロであることを確認してください。ここで行動を追加する作業の前にEWARMのエディタに行番号が表示されるようあらかじめ設定しておきます。EWARMのツールメニューからオプション選びイライタウインドウのエディタを選びます。エディタメニューの右側にいくつかチェックボックスが並んでいますが上から3つ目の行番号の表示にチェックを入れます。実際の操作画面です。ツールメニューからオプション選びディタの中の行番号の表示ですね。こちらをクリックしてOKをします。GPIO実習では2つのプログラムを実装していきます。1つ目はユーザースイッチが押されたことを割り込みで監視する割り込み処理部で2つ目はユーザースイッチが押された時にLEDをオンオフするメイン関数処理部です。それぞれ詳しく見ていきましょう。まず割り込み処理です。PC-13を使った割り込みは先にご説明しましたとおりGPIO外部割り込み10から15と共有しています。なので割り込みが発生した際どの割り込みが発生したのか番号を確認する必要があります。その後プッシュドという変数に1を代入し割り込み処理を終了します。次にメイン関数処理です。メイン関数内ではマイコンのさまざまな初期化を行い2つのGPIOが目的の動作をするように設定します。その後プッシュド変数を0に初期化後割り込み処理によって1が代入されることをループ処理に似て監視します。プッシュド変数が1になった場合PA5のピンを途切るしLEの点とを切り替えます。続いて実際のコードを記入する際の重要な注意点をご説明いたします。CubeMXで生成されたコードにはユーザーコードビギンとユーザーコードエンドのコメントの記載がありこのコメント分の間にのみユーザーコードを追記することが可能です。このルールに乗っとって追記したユーザーコードはGPIOの設定等を変えたなどなどをして再度CubeMXにてコード生成した場合でも保護されます。逆にこのコメント分の範囲外の部分にユーザーコードを追加したりCubeMXで自動生成されたコードを編集しますと再度コードを生成した際に追記したコードは切り替え変更した部分は全て元に戻ってしまいます。なおユーザーがこのコメント分を模範して記入してもコード再生成時に消えてしまいますので必ず生成されたコード内のコメント分の間に追記するようお願いいたします。今回追記するのは3箇所です。では実際にメイントとCファイルにコードを追記していきます。お手元の資料からコピーをして入力すると簡単です。まず次箇所1箇所目です。ユーザーコードをビギンゼロとユーザーコードをエンドゼロの間に追記していきます。割り込み入力判定のための変数であるプッシュゾーを追記します。行動のアンダースコア2つですので気を付けてください。ダブルアンダースコアIOはボラタイル宣言のおまくろになっています。次に追記箇所2箇所目です。ユーザーコードをビギンゼロとユーザーコードをエンドゼロの間に記入していきます。プッシュゾー変数の初期方割り込み街の無限ループLEDをトグルする処理を追記します。春GPIをトグルピン関数によって設定したGPIのピンの状態をトグルすることができます。LEDのピンPA5をトグルさしたいので第一期数にGPIポートのAを表すGPIをAを第二期数にGPIのピン番号を表すGPIをピン5を設定します。最後に追記箇所3箇所目です。ユーザーコードをビギンゼロとユーザーコードエンドゼロの間に追記していきます。こちらには割り込みコールバック関数を追記していきます。こちらの関数は実際の割り込みベクタからコールされる関数から呼ばれ通りどのGPIをピンの割り込みだったのかGPIをピン引き数に値が渡されています。ですので追記した関数内でこの番号がGPI4の13番がどうかを確認するのに使うことができます。13番であればプッシュド変数に位置を代入して終了します。追記が終わりましたらプロジェクトメニューの中ほどにありますメイクを選択してビルドします。ビルド完了後エラーやワーニングないことを確認します。コペーをせずに追記を行うと多くの人が追記2箇所目の中核を消してしまったり追記する箇所が微妙にずれてしまってエラーになることがあります。よく確認してください。では実際の画面をご覧ください。お手元のPDFからコピー&ペーストをしていただくのが一番簡単です。まず追記箇所1箇所目の変数ですね。これをメインドとしてこちらになりますが開いていただいてコントローキーを押しながら回すホイール上下にするとホントのサイズを変えたりすることができます。拡大表示とかですね。こちらはユーザーコードビギンゼロなどに挿入してきます。続いて追記箇所2箇所目のこの部分ですね。PDFからコピーするとスペースがちょっとなくなってしまうので貼り付ける際にですねちょっと追記を押していただく必要が出てきます。ユーザーコードビギン3ですね。追記するときこの中核庫に地図をつけてください。こちらに貼り付けた後イネットを調整するためにサブとかですねスペース入れてちょっと見てくれを揃えてください。この中核ですね。右側に来ちゃってますけど開業してもともとのホワイル部分のところですね。これの中核を消さないようにしてください。最後追記箇所3番目はユーザーコードビギン4こちらですね。こちらのコードもスペース等が消えてしまうので貼り付けた後にですねタブとかスペースでインデントの調整をしてください。こちらですね。186業目あったりですね。こちらにペースとしていきます。見てくれを直すのでタブをちょいちょいと入れましてここで追記は終了です。上書き保存をしていただいてグーッと一通りですね見ていただいてその後プロジェクトメニューの方から中ほどにありますメイクをクリックしていただいてビルドを行います。こちらですね。そうするとエラーの合計数ワーニングの合計数が0になっているこちらを確認してください。ビルドが完了しましたらお手元のニュークレボードをPCと接続します。接続されるとボード右上にあるLD1が赤色に点灯しボード中ほどにあるLD3も赤色に点灯します。では実際にボードに書き込んでデバッグしましょう。プロジェクトメニューからダウンロードしてデバッグを選択しボードにデータをダウンロードします。ボードと通信中LD1が点滅します。ダウンロードが完了するとデバッグモードに切り替わります。ボードのLD1は緑色に点灯します。準備ができましたら実行しましょう。PCのキーボードのF5キーを押すかイラオレアームのデバッグメニューを開き一番上の実行をクリックします。正しく動いていればLD2が緑色に点灯していると思います。では実際の操作とボードの様子を見てみましょう。パスコーンボードにつなぎました。LD1が赤色に点灯しているのが見えますでしょうか?LD3も赤色に点灯しているのが見えると思います。イラオレアムのプロジェクトメニューからダウンロードしてデバッグをクリックしていただくとLD1が点滅しましてダウンロードが完了しました。完了しましたとLD1は緑色に変わります。その後イラオレアムのデバッグから実行をクリックしますとLD2が緑色に点灯します。ボードのスイッチを押していくとこのようにLD2がおスタビに点灯とショートを繰り返しています。では一旦ブレークをしてトルグールする関数のところにブレークポイントを貼って動かしてみます。ハルのトグル関数のところで止まります。ステップオーバーで実行していくとLDがついていたものが消えてファイル分の無限ループで割り込みを待っています。サイド実行してもう一度ユーザーボタンを押すとまたサイドをトグル関数のところで止まります。ブレークポイントを外してサイド実行します。ユーザーボタンをスタビにLD2が伝統とショートを繰り返しています。いかがでしたでしょうか?QMXが生成する初期化コードの影でユーザーアプリケーションの部分だけを追加することに集中して行うことができました。面倒なピンのモードや初期設定クロックの分収費などは全てQMXが自動生成したお影です。では実際にユーザーアプリケーションに追加した際に使ったハルドライバの何語説明をいたします。まず1つ目はハルGPIをトグルピンです。こちらの第1期数にはGPI用の報答を指定します。第2期数にはGPI用のピン番号を指定します。2つ目はハルGPIをEXTI callbackです。実際の割り込みベクタ関数からコールされるcallback関数です。第1期数の値を使うことでどのGPI番号の割り込みが出したのか判断ができます。実際のドライバのソースコードはプロジェクトを保存したフォルダにあるドライバーズディレクトリー内のSTMさんにF4XXハルドライバーフォルダにあります。ドライバーの使用方法に関しましては街頭のソースコードやヘッダやコメント分またはWebに公開しているユーザーマニュアル1000年約25番UM1725にてご確認ください。資料にはWebリンクを埋め込んでありますのでクリックして参照してください。では最後に動いたままの暴動を止めてデバッグを終了します。EWARMのデバッグメニューからデバッグの停止を選びデバッグモードを終了します。その後EWARMもCubeMXも終了させます。実習していただいた感想はいかがでしょうか?ステムさんにマイコンは各種のソフトウェアが準備されています。次のスライドにステムさんにマイコンのインターネットで入手可能な便利なリンクをまとめましたのでお活用ください。これでGPAを実習編を終了します。続いてユアット実習に入ります。ステムさんに開発エコシステムによる開発実習ユアット実習編を開いてください。