スイッチ入力とLED出力(INT割り込み)
1.本日の内容
(1) STM32マイコン(nucleo f401RE)を使用して、スイッチを押したときに、LEDの点灯/消灯を行う。
(2) 割り込み処理を使用し、スイッチが押されたら処理を行うプログラムを作成する。
・目次
2.内容
(1) やる内容の詳細
・STM32マイコン(nucleo f401RE)を使用して、LEDの点灯/消灯を行う。
・nucleof401についてる青ボタンを押した時
・LEDが点灯していた場合は、LEDを消灯する。
・LEDが消灯していた場合は、LEDを点灯する。
・割り込み処理(INT割り込み)で、ボタンが押下された時に、プログラムを実行する。
(2) 使用部品
個数 | 部品名 | 型番 |
---|---|---|
1 | USBケーブル | USBミニBタイプ |
1 | mbed(マイコンボード) | nucleo f401RE |
(3) STM32CubeMXの設定、プログラムを出力
(a)使用ピンを設定
・PC13:GPIO_EXTI13
・PA5:GPIO_Output
(b)使用するピンの名前を変更
・PC13→右クリック→Enter Username→KEY1とする。
・PA5→右クリック→Enter Username→LED1とする。
(c) 割り込み設定
・System Core → GPIOをクリック
・PC13側をクリックし、GPIO modeを
External Interrupt Mode with Falling edge trigger detectionに変更する。
・NVICをクリックし、EXTI lin[15:10]のチェックを入れる。
・Preemption Priorityの値を1に変更する。
(d)プログラムの出力
・Project Maagerを選択
・Project Nameにプログラムの名前を入力:SW_LED3
※スペース、空白文字、日本語を含めるとエラーになる場合があるので使用しない。
・Project Location:プロジェクトを保存する場所
・Application Structure:Advanced (出力するフォルダの構成を選択)
・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)
(f)GENERATE CODEで、コードを出力
(g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。
(4) AtricTrueStdioでプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーにSW_LED3(作成したプロジェクトの名前)が表示
・チェックされているのを確認して、終了をクリック
(b) プログラムの書き込み
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載する。
/* USER CODE BEGIN 0 */ //スイッチ確認用変数 __IO uint8_t push; //LEDステート用変数 uint8_t led1; /* USER CODE END 0 */ /* USER CODE BEGIN 2 */ //変数の初期化 //スイッチ確認用変数の初期化 push = 0; //LEDステート変数の初期化 led1 = 0; /* USER CODE END 2 */ while(1){ /* USER CODE BEGIN 3 */ //ボタンが押されたとき(push = 1になった時 if(push == 1){ if(led1 == 0){ //ledの状態を確認 led = 0だったら消灯する。 //ledを消灯する。 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,RESET); led1 = 1; //次の状態に変数の値を変化 }else { //ledの状態を確認 led = 1だったら点灯する。 //ledを点灯する。 HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,SET); led1 = 0; //次の状態に変数の値を変化 } //pushの値を0にする。1のままだと、whileで無限に続いてしまう。 push = 0; }else{ //ボタンが押されていない時の処理 //何もしない。 } } /* USER CODE END 3 */ /* USER CODE BEGIN 4 */ //割り込みコールバック関数の追加 //スイッチの割り込み時の動作関数 //スイッチが押されたらpush = 1にする。 void HAL_GPIO_EXTI_Callback(uint16_t SW){ if(KEY1_Pin == SW){ //スイッチが押されたとき push = 1; //変数pushの値を1に変更 } } /* USER CODE END 4 */
(5) プログラムの説明
・割り込み用変数
・割り込み処理発生時のフラグを格納する。
・割り込み処理で変更される場合、__IOを付ける。
・__IOは、volatileの別名。
参考:
・https://scrapbox.io/ArduinoSTM32/__IO
・マイコン徹底入門
・volatileで最適化を抑制する
(b)HAL_GPIO_EXTI_Callback(uint16_t SW)
・HAL_GPIO_EXTI_Callbackで、スイッチの割り込み処理を呼び出し。
・ここでは、SWをこの関数の引数にしている。
・引数SWがKEY1_Pinの時(KEY1が押されたとき)、スイッチが動作
・今回は、if(KEY1_Pin == SW)は、無くても動作する。
・これは複数のスイッチがある場合などに、必要。
・参考:https://qiita.com/toshidln/items/496097ecc0f6a650a6eb
:UM1725データシート
(c) LEDの状態をled1に保存し、led1を変化させることにより、
LEDのON/OFFを行っている。
これは、LEDの状態が増えた時を想定して、記載している。
3.関連記事
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary
その他:
・CubeIDEの使い方(起動~デバック実行) - Project_OKI’s diary
・SPI通信とは - Project_OKI’s diary
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary