Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_7(スイッチ入力(INT割り込み)とUART通信)

​​​​

スイッチ入力とLED出力(INT割り込み)

1.本日の内容

(1) STM32マイコン(nucleo f401RE)を使用して、UART通信で

  スイッチを押したときのスイッチの入力値を確認する。

・目次

2.内容

​​(1) やる内容の詳細

  ・STM32マイコン(nucleo f401RE)を使用して、
    ・nucleof401についてる青ボタンを押した時
    ・スイッチの状態入力状態を取得
  ・100ms毎に、UARTを行い、スイッチの状態(値)を送信。

(2) 使用部品
個数 部品名 型番
1 USBケーブル USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE

​​​​

(3) STM32CubeMXの設定、プログラムを出力

  (a)使用ピンを設定

   ・PA2:USART2_TX
   ・PA3:USART2_RX

   ・PC13:GPIO_EXTI13
   ・PA5:GPIO_Output  (必要はないが確認用に一応入れとく)

 

  (b)使用するピンの名前を変更 

   ・PA2→右クリック→Enter Username→USART_TXとする。
   ・PA3→右クリック→Enter Username→USART_RXとする。
   ・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)Connectivity(USARTの基本設定)
   ・USART2を選択
   ・Mode:Asynchronous(非同期で行う)
   ・Hardware Flow Control :Disable (ハードウェアのフロー制御なし)
   ・NVIC Settingsを開く→USART2 global interruptのEnabledにチェックを入れる。
   ・Parameter Settings→今回はそのままで行う。
     ・Baud Rate  :115200Bits/s
      →通信速度、値が大きいほど1秒間に送るデータ数が多くなる。
       リアルタイムで数値を取得したい場合などの場合には、大きくする必要があるが、
       今回は、9600Bits/sでも良い。
     ・Word Length  :8Bits
     ・Parity       :None
     ・Stop Bits   :1

  (e)System Coreの設定
   ・NVICを選択
   ・USART2 global interrupt部分をクリック
   ・Preemption Priorityを0から1に変更
    これで、マイコンの設定は終了

  (d)プログラムの出力

   ・Project Maagerを選択
   ・Project Nameにプログラムの名前を入力:SW_LED4    
    ※スペース、空白文字、日本語を含めるとエラーになる場合があるので使用しない。

   ・Project Location:プロジェクトを保存する場所
   ・Application Structure:Advanced (出力するフォルダの構成を選択)
   ・Toolchain/IDE:TrueSTUDIO(今回は、AtoricTrueStdioを使用するため)

  (f)GENERATE CODEで、コードを出力
  (g)Open pROJECTをクリックすると、AtricTrueStdioが自動的に起動される。

(4) AtricTrueStdioでプログラム作成
 (a) AtricTrueStdioから開く場合(上記(g)をした場合は不要)
    ・AtricTrueStdioを起動
    ・インポート元のディレクトリをクリック
    ・CubeMXで作成した場所を指定
    ・フォルダーにSW_LED4(作成したプロジェクトの名前)が表示
    ・チェックされているのを確認して、終了をクリック 
 
 (b) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
 
 (c) プログラムの作成 
   ・下記プログラムを記載する。

 

/* USER CODE BEGIN 0 */
//スイッチ確認用変数
__IO uint8_t push;

/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
//変数の初期化
//スイッチ確認用変数の初期化
push = 0;
//送信用配列の宣言
uint8_t uartbuff[] ={push};
/* USER CODE END 2 */
 

while(1){
/* USER CODE BEGIN 3 */
   //ボタンが押されたとき(push = 1になった時
	if(push == 1){
   		uartbuff[0]=push;	//uartbuff[0]にpushの値を格納
   		//UART通信で送信
   		HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100);
               push = 0;
  }else//ボタンが押されていない時の処理   uartbuff[0] =push; //uartbuff[0]にpushの値を格納 //UART通信で送信   HAL_UART_Transmit(&huart2,uartbuff,sizeof(uartbuff),100);   HAL_Delay(100); //100ms待ち } }   /* 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)
UARTでスイッチの押した時の動作確認

 (a) 100ms毎に、0が出続け、スイッチを押したタイミングだけ1が出力される。

   この動作から分かるように、スイッチが押された瞬間だけ、
    void HAL_GPIO_EXTI_Callback(uint16_t SW){ が動作している。
 
 

3.関連記事

組み込みC言語: