Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン19(LED制御用ソースファイル、ヘッダファイル作成)

 

LED制御用ファイルの作成

1.本日の内容

 (1) STM32マイコン(nucleof401RE)を使用しLEDの点灯/消灯を制御する。

 (2) 制御用のソースファイル、ヘッダファイルを作成する。

 (3) 今までは、main.cのUSER CODE部分に記載していた。

  LED制御用にled.c、led.hファイルを作成する。

  LED制御用以外に、基本的なON/OFFやture/falseを定義する

  typedef.hファイルを作成する。

 

・目次

 

2.内容

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

 ・LED制御用ファイル(led.c、led.h)を作成する。

 ・作成したファイルを使用して、STM32マイコン(nucleo f401RE)を使用して、

  ledの点灯/消灯を行う。

 ・PA_5のLEDの点灯/消灯を制御する。

 

(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	: 2022/07/30  $
 *
 */
/**	******************************************** */

///多重インクルード防止
#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 */
/* USER CODE BEGIN 4 */

//タイマー割り込み実行関数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim == &htim3){	//TIM3割り込み処理(1秒ごとに実行)
		//LED点滅処理
		Led1Blink();
	}
}
/* USER CODE END 4 */

 

(4) プログラムの説明
 (a) 構造体の作成
構造体名  構造体変数名 
LEDCTRL  ledctrl
 変数名 役割
bool  led1blif LED1点滅ON/OFF制御フラグ
USHORT  led1blitim LED1点滅ON/OFF時間(使っていない)
 
 (b) 関数の作成
関数名 役割 引数 返り値
Led1Blink LED1 ON/OFF反転関数 なし なし
LED1 LED1 ON/OFF関数:HIGHでLED ON、LOWでLED OFF  HIGH/LOW  なし
 
 (c) typedef enum{LOW=0
  enumにて、LOWを0、HIGHを1に設定
 
 (d) void Led1Blink()
   LED点滅用関数処理
  if(ledctrl.led1blif == true){  でled点滅フラグがtrueの時実行
  if(Led1State == HIGH){ でledがHighの時、LED OFFを実行している。
 
 (e) #define OutGPIOBit(port,pin,data) (port->ODR=*1|((data==0) ? 0 : (pin)))) ///GPIO設定
  GPIO設定のレジスタ設定
  #define Led1(dt) OutGPIOBit(LED1_GPIO_Port,LED1_Pin,dt)
  で、PA5のLED1のGPIOを設定している。
  詳細:
 
 (f) ソースファイルとヘッダファイルについては下記参照
 
 (g) 割り込み処理については下記参照
 
 (h) 構造体については下記参照
 

3.関連記事

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

 

*1:port->ODR&~(pin