Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_6(スイッチ入力(INT割り込み)とLED出力)

​​​​

スイッチ入力と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でプログラム作成
 (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにSW_LED3(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 

 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
 (c) プログラムの作成 
   ・下記プログラムを記載する。

 

/* 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) プログラムの説明
 (a)__IO uint8_t push;
   ・割り込み用変数
   ・割り込み処理発生時のフラグを格納する。
   ・割り込み処理で変更される場合、__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.関連記事

組み込みC言語