スイッチ入力と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でプログラム作成
・AtricTrueStdioを起動
・インポート元のディレクトリをクリック
・CubeMXで作成した場所を指定
・フォルダーにSW_LED4(作成したプロジェクトの名前)が表示
・チェックされているのを確認して、終了をクリック
・トンカチマークをクリックして、ビルドする。
・エラーが出ないことを確認する。
・下記プログラムを記載する。
/* 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が出力される。
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