Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン20(割り込み処理部分を別ファイルに作成)

 

割り込み処理部分を別ファイルに作成

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) プログラムの説明
 (a) 基本は下記記事と同じ
   を参照
 
 (b) TIM_HandleTypeDef htim3; //htim3割り込み宣言
  これをファイル内で行い、htim3を使用できるようにした。
 
 (c)  HAL_TIM_Base_Start_IT(&htim3);
  これは、タイマ割り込みの開始の為、今回はメイン側に記載。
 
 
 

3.関連記事

関連記事一覧:
 
組み込みC言語