割り込み処理部分を別ファイルに作成
1.本日の内容
(1) STM32マイコン(nucleof401RE)を使用しLEDの点灯/消灯を制御する。
(2) STM32マイコン19(LED制御用ソースファイル、ヘッダファイル作成)
と基本同じ。
前回は割り込み処理部分はmain.cに記載した。
今回はinterrupt.c、interruput.hファイルを作成し、
割り込み処理部分を別ファイルで管理できるようにする。
・目次
2.内容
(1) やる内容の詳細
・STM32マイコン19(LED制御用ソースファイル、ヘッダファイル作成)で作成したファイル、led.c、led.h、typedef.hに加えて、
割り込み用ファイルinterrupt.c、interrupt.hを作成する。
・動作内容は同じ。
(2) CubeMXの設定
CubeMXの設定は、下記記事と同じ。
→STM32マイコン_9(タイマ割り込み:LED点滅) - Project_OKI’s diary
(3) プログラムの作成
typedef.hファイルの作成
/** * @file typedef.h * @brief 基本型変数定義 * @date 2023/01/10 */ #ifndef TYPEDEF_H #define TYPEDEF_H /** \mainpage * -#本プログラムについて<BR> * 本プログラムは、値が明示的に決まっているもの * (true/falseやON/OFFなど) * を基本的な型として定義する。 */ /* ***************************************** enum define ***************************************** */ #ifndef NULL #define NULL '\0' ///<NULLを'\0'と定義 #endif ///BOOL型(ない場合のみ) #undef false #undef true typedef enum{false=0 ///<為 ,true ///<真 }bool; ///ONOFF型 typedef enum{OFF=0 ///<OFF指定 ,ON ///<ON指定 }ONOFF; ///SIGNAL型 typedef enum{LOW=0 ///<信号をLOWにする ,HIGH ///<信号をHIGHにする。 }SIGNAL; ///UPDOWN型 typedef enum{UP=0 ///<UP指定 ,DOWN ///<DOWN指定 }UPDOWN; //INOUT型 typedef enum{INP=0 ///<IN指定 ,OUTP=1 ///<OUT指定 }INOUT; ///基本型定義 typedef signed char SCHAR; ///<8bit変数 符号有り typedef unsigned char UCHAR; ///<8bit変数 符号無し typedef signed short SSHORT; ///<16bit変数 符号有り typedef unsigned short USHORT; ///<16bit変数 符号無し typedef signed int SINT; ///<int型 符号有り(8bitサイズ) typedef unsigned int UINT; ///<int型 符号無し(8bitサイズ) typedef signed long SLONG; ///<32bit変数 符号有り typedef unsigned long ULONG; ///<32bit変数 符号無し typedef float SFLOAT; ///<32bit浮動小数点変数 typedef double SDOUBLE; ///<64bit浮動小数点変数 #endif
led.cファイルの作成
/** ******************************************************* */ /** * @file led.c * @brief LED制御処理 * @brief Compiler : Atollic True Studio for STM32 9.0.0 * @brief CPU : STM32F401 * @date $LastChangedDate : 2023/01/12 $ */ /** ******************************************************* */ /* ************************************************************ */ // インクルード ファイル /* ************************************************************* */ #include "main.h" #include "led.h" //LED制御ヘッダファイルのインクルード /** ************************************************************ */ /** 外部定義変数 */ /** ************************************************************ */ LEDCTRL ledctrl; //LED制御構造体 /** ******************************************************* */ // 関数の作成 /** *************************************************** */ /** *********************************************** */ /** * MODE1 LED点灯/消灯処理(LED1を点灯/消灯(反転)する処理) * @param void : none * @return void : none
*/ /** ************************************************ */ void Led1Blink() { ///LED点滅フラグ確認 if(ledctrl.led1blif == true){ if(Led1State == HIGH){ ///LEDがHIGHの時 Led1(LOW); ///LED1をON }else{ ///LED1がLOWの時 Led1(HIGH); ///LED1をOFF } } } /* **** ファイルの最後 ( led.c ) ******************************** */
led.hファイルの作成
/** ******************************************** */ /** * @file led.h * @brief LED制御ヘッダ * @brief Compiler : Atollic True Studio for STM32 9.0.0 * @brief CPU : STM32F401RE * @date $LastChangedDate : 2023/01/12 $ * */ /** ******************************************** */ ///多重インクルード防止 #ifndef LED_H ///<LED未定義? #define LED_H ///<LED_H 定義済み!! /* ****************************************************** */ // インクルード ファイル /**************************************************** */ #include "typedef.h" //基本型変数定義ヘッダファイルのインクルード /* **************************************************** */ // 定数値の定義 /* **************************************************** */ /* ************************************************** */ // 式、関数の置き換え /* **************************************************** */ ///Bit変換:出力 #define OutGPIOBit(port,pin,data) (port->ODR=((port->ODR&~(pin))|((data==0) ? 0 : (pin)))) ///GPIO設定 ///Bit変換:入力 #define InGPIO(port,pin) ((((port->IDR)&(pin))==0)?0:1) ///LED ON/OFF関数の作成 #define Led1(dt) OutGPIOBit(LED1_GPIO_Port,LED1_Pin,dt) ///LEDステート確認用変数 #define Led1State InGPIO(LED1_GPIO_Port,LED1_Pin) /* ****************************************************** */ // 構造体の定義 /* ************************************************ */ //MODE LEDステート管理用構造体 typedef struct{ //LED動作ステート USHORT led1blicout;///LED点滅時間カウント用変数 bool led1blif; ///LED1点滅ステート:true:LED点滅 false:LED点滅しない } LEDCTRL; /* **************************************************** */ // 外部変数の定義 /* ********************************************* */ extern LEDCTRL ledctrl; ///LED制御構造体 /* ********************************************** */ // 関数のプロトタイプ宣言 /* ********************************************* */ extern void Led1Blink(); ///LED1を点灯/消灯(反転)関数 #endif ///<LED_H 未定義 End /* **** ファイルの最後 ( led.h ) ************************* */
main.cファイルの作成
/* USER CODE BEGIN Includes */ #include "typedef.h" #include "led.h" /* USER CODE END Includes */
/* USER CODE BEGIN 2 */ //TIM3開始 HAL_TIM_Base_Start_IT(&htim3); //LED点滅開始 ledctrl.led1blif = true; /* USER CODE END 2 */
interrupt.cファイルの作成
/** ********************************************************* */ /** * @file interrupt.c * @brief 割り込み処理制御 * @brief Compiler : Atollic True Studio for STM32 9.0.0 * @brief CPU : STM32F401 * @date $LastChangedDate : 2023/01/15 $ */ /** ********************************************************* */ /** ********************************************************* */ // インクルード ファイル /** ********************************************************* */ #include "main.h" //mbedヘッダファイル #include "led.h" //LED制御ヘッダファイル #include "interrupt.h" //割り込み処理ヘッダファイル /** ********************************************************* */ // 外部定義変数 /** ********************************************************* */ /** ********************************************************* */ // 内部定義変数 /** ********************************************************* */ LEDCTRL ledctrl; //LED制御構造体 TIM_HandleTypeDef htim3; //htim3割り込み宣言 /** ********************************************************* */ // 関数の作成 /** ********************************************************* */ /** ********************************************************** */ /** * 割り込み処理 * @param void : none * @return void : none */ /** ********************************************************** */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim == &htim3){ //TIM3割り込み処理 ledctrl.led1blicout++; //LED点滅時間カウント+1 if(ledctrl.led1blicout == LEDTIME){ //ledカウントになった時 ledctrl.led1blicout = 0; //LEDカウントクリア Led1Blink(); //LED反転処理 } } } /* **** ファイルの最後 ( interrupt.c ) ********************** */
interrupt.hファイルの作成
/** ************************************************************ */ /** * @file mode.h * @brief Mode制御ヘッダ * @brief Compiler : Atollic True Studio for STM32 9.0.0 * @brief CPU : STM32F401RE * @date $LastChangedDate : 2021/11/14 $ * @version $Revision : 1.00 $ * */ /** ************************************************************ */ #ifndef INTERRUPT_H ///<LED未定義? #define INTERRUPT_H ///<LED_H 定義済み!! /* ************************************************************ */ // 定数値の定義 /* ************************************************************ */ //LED点滅時間設定 #define LEDTIME 1 //1秒に1回 LEDON/OFFに設定 /* ************************************************************ */ // 式、関数の置き換え /* ************************************************************ */ /* ************************************************************ */ // 構造体定義 /* ************************************************************ */ /* ************************************************************ */ // 外部変数の定義 /* ************************************************************ */ /* ************************************************************ */ // 関数のプロトタイプ宣言 /* ************************************************************ */ #endif ///<INTERRUPT_H 未定義 End /* **** ファイルの最後 ( interrupt.h ) ************************* */
(4) プログラムの説明
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
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary