サンプルプログラム F4xxxx_LED_USW の説明
LED点滅とスイッチ入力の処理を
並列に動作させるプログラムです。
スイッチを押すごとに、LEDの点滅間隔を
変更します。
F4xxxx は、
F405RG, F405VG, F446RE のいずれかです。
それぞれの種類に応じて、F4xxxx の部分を読み代えてください。
プログラムの内容は共通です。
サンプルプログラムの動作を確認するために
えがおのでんし製の評価用基板 Base-F4xxxx と
STMicroelectronics社のfreeの開発ツール、
STM32CubeIDE を使用しています。
目次
えがおのでんし製の評価用基板 Base-F4xxxx の説明
1. Base-F405RG基板 の説明
2. Base-F405VG基板 の説明
3. Base-F446RE基板 の説明
サンプルプログラム F4xxxx_LED_USW のプロジェクト
1. サンプルプログラム F405RG_LED_USW のプロジェクト
2. サンプルプログラム F405VG_LED_USW のプロジェクト
3. サンプルプログラム F446RE_LED_USW のプロジェクト
既存のプロジェクトを開く
サンプルプログラム F4xxxx_LED_USW の説明
F4xxxx_LED_USW の構成
F4xxxx_LED_USW の動作パラメータの定義
ユーザープログラムの実行開始位置
F4xxxx_LED_USW の main() の説明
1) 初期化の部分
2) LED点滅 と USERスイッチ押下検出 処理の部分
各モジュールの説明
1) Blink_LED_ST
2) Change_Interval_Blink_LED_ST
3) Detects_Pressed_USW
4) Renew_Flag_Blink_LED_ST
えがおのでんし製の評価用基板 Base-F4xxxx の説明
このサンプルプログラムは、
えがおのでんし製の評価用基板 Base-F4xxxx を使用して動作を確認しています。
1. Base-F405RG基板 の説明
Base-F405RG基板については、
Base-F405RG基板 の説明 をご覧ください。
2. Base-F405VG基板 の説明
Base-F405VG基板については、
Base-F405VG基板 の説明 をご覧ください。
3. Base-F446RE基板 の説明
Base-F446RE基板については、
Base-F446RE基板 の説明 をご覧ください。
サンプルプログラム F4xxxx_LED_USW のプロジェクト
STM32CubeIDE 1.17.0 を使用して作成しました。
1. サンプルプログラム F405RG_LED_USW のプロジェクト
ここからサンプルプログラム L_F405RG_LED_USW.zip をダウンロードしてください。
プロジェクト L_F405RG_LED_USW は、
フォルダ C:\Project_CubeIDE\Launch_F405RG\L_F405RG_LED_USW のように配置して作成しました。
フォルダ C:\Project_CubeIDE\Launch_F405RG を作成して、
そのフォルダに L_F405RG_LED_USW.zip を貼り付けて解凍し、
プロジェクト作成時と同一に C:\Project_CubeIDE\Launch_F405RG\L_F405RG_LED_USW と
配置した場合は、普通にプロジェクトを開くことができます。
2. サンプルプログラム F405VG_LED_USW のプロジェクト
ここからサンプルプログラム L_F405VG_LED_USW.zip をダウンロードしてください。
プロジェクト L_F405VG_LED_USW は、
フォルダ C:\Project_CubeIDE\Launch_F405VG\L_F405VG_LED_USW のように配置して作成しました。
フォルダ C:\Project_CubeIDE\Launch_F405VG を作成して、
そのフォルダに L_F405VG_LED_USW.zip を貼り付けて解凍し、
プロジェクト作成時と同一に C:\Project_CubeIDE\Launch_F405VG\L_F405VG_LED_USW と
配置した場合は、普通にプロジェクトを開くことができます。
3. サンプルプログラム F446RE_LED_USW のプロジェクト
ここからサンプルプログラム L_F446RE_LED_USW.zip をダウンロードしてください。
プロジェクト L_F446RE_LED_USW は、
フォルダ C:\Project_CubeIDE\Launch_F446RE\L_F446RE_LED_USW のように配置して作成しました。
フォルダ C:\Project_CubeIDE\Launch_F446RE を作成して、
そのフォルダに L_F446RE_LED_USW.zip を貼り付けて解凍し、
プロジェクト作成時と同一に C:\Project_CubeIDE\Launch_F446RE\L_F446RE_LED_USW と
配置した場合は、普通にプロジェクトを開くことができます。
既存のプロジェクトを開く
サンプルプログラムのプロジェクトを任意のフォルダに配置した場合に、
STM32CubeIDEにより、そのプロジェクトを開く方法については
既存のプロジェクトを開く方法 をご覧ください。
サンプルプログラム F4xxxx_LED_USW の説明
Base-F4xxxx基板上のLED、ST1を点滅させます。
Base-F4xxxx基板上のUSERスイッチを押すごとに点滅間隔を変化させます。
LED点滅処理とスイッチ入力検出処理は並列に動作します。
プロジェクトを最初に開いた画面は以下のようになります。
以下に、F405RG の場合の画面を示します。
以下、サンプルプログラム F4xxxx_LED_USW について説明していきます。
F4xxxx は、F405RG, F405VG, F446RE のいずれかです。
F4xxxx_LED_USW の構成
STM32CubeIDEの画面左側、Project Explorerの
F4xxxx_LED_USW を展開した画面は以下のようになります。
F405RG_LED_USW の場合の画面を以下にしまします。
サンプルプログラム F4xxxx_LED_USW の構成を以下に示します。
F4xxxx_LED_USW
|
|- Includes
|
|- Core
| |- Inc
| | |- main.h
| | |- stm32f4xx_hal_conf.h
| | |- stm32f4xx_it.h
| |
| |- Src
| | |- main.c
| | |- stm32f4xx_hal_msp.c
| | |- stm32f4xx_it.c
| | |- syscalls.c
| | |- sysmem.c
| | |- system_stm32f4xx.c
| |
| |- Startup
|
|- Drivers
|
|- LED_USW_Ope
| |- Change_Interval_Blink_LED_ST : ST LED点滅インターバル変更処理
| | |- Change_Interval_Blink_LED_ST.c
| | |- Change_Interval_Blink_LED_ST.h
| |
| |- F4xxxx_LED_USW_Config : 動作パラメータの定義
| |- Dev_Conf.h
|
|- Shared_Lib
| |- Handle_UI_Lib
| | |- Blink_LED_ST : ST LED点滅処理
| | | |-Blink_LED_ST.c
| | | |-Blink_LED_ST.h
| | |
| | |
| | |- Detects_Pressed_USW : USERスイッチ押下検出処理
| | |- Detects_Pressed_USW.c
| | |- Detects_Pressed_USW.h
| |
| |
| |- Time_Interval : 時間待ち処理
| |- Time_Interval.c
| |- Time_Interval.h
|
|- F4xxxx_LED_USW.launch
|- STM32F4xxxxTX_FLASH.ld
|- STM32F4xxxxTX_RAM.ld
F4xxxx_LED_USW の動作パラメータの定義
サンプルプログラム F4xxxx_LED_USW の動作パラメータの定義を
LED_USW_Ope/F4xxxx_LED_USW_Config/Dev_Conf.h に記述しています。
使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、
などを記述しています。
ユーザープログラムの実行開始位置
プログラムは、int main(void) から実行開始します。
int main(void) は、フォルダ Core/Src/main.c にあります。
F405RG_LED_USW の場合の画面を以下にしまします。
STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
行った後、int main(void) を呼び出します。
ユーザーコード(記述したプログラム)は、
int main(void) の先頭から実行されます。
F4xxxx_LED_USW の main() の説明
サンプルプログラム F4xxxx_LED_USW の main() の記述は、
以下のとおりです。
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
//-----------------------------------------------------------------
// このmain関数内では、以下の処理番号の変数、
// STC_uint8_JobNum_LED と
// STC_uint8_JobNum_CI は
// while(1){
// }
// の永久ループ内で使用しているので、
// static宣言をする必要はない。
// しかし、main関数以外の全ての関数内では
// 処理番号をstatic宣言をする必要があるので、
// 合わせるために、ここでも static宣言をしている。
//-----------------------------------------------------------------
static uint8_t STC_uint8_JobNum_LED; // LED点滅処理番号
static uint8_t STC_uint8_JobNum_CI; // インターバル変更処理番号
//------------------------------------------------------------
// 呼び出す関数を case 0: から実行させるために
// 処理番号に 0 をセットします。
//------------------------------------------------------------
STC_uint8_JobNum_LED = 0; // LED点滅処理番号初期化
STC_uint8_JobNum_CI = 0; // インターバル変更処理番号初期化
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// ST LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_ST(&STC_uint8_JobNum_LED,
&GLB_structParam_Blink_LED_ST);
//------------------------------------------------------
// ST LED点滅インターバル変更。
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Change_Interval_Blink_LED_ST(&STC_uint8_JobNum_CI,
&GLB_structParam_Blink_LED_ST);
}
/* USER CODE END 3 */
}
1) 初期化の部分
a) CPUのPeripheral初期化
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
により、CPUのPeripheralなどの基本的な初期化を行います。
PeripheralとはCPUの周辺インターフェースなどのことを言います。
プロジェクト構築時に自動的に組み込まれる、
HAL Drivers(フォルダ Drivers/STM32F4xx_HAL_Drivers) 内に記述されています。
b) CPU動作クロックの設定
/* Configure the system clock */
SystemClock_Config();
CPUの動作クロックとPeripheralの動作クロックを設定します。
SystemClock_Config(); の設定内容は、
int main(void)
{
.
.
.
}
の、すぐ下に記述されています。
2) ST LED点滅 と USERスイッチ押下検出 処理の部分
永久ループ部分の記述を以下に示します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// ST LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_ST(&STC_uint8_JobNum_LED,
&GLB_structParam_Blink_LED_ST);
//------------------------------------------------------
// ST LED点滅インターバル変更。
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Change_Interval_Blink_LED_ST(&STC_uint8_JobNum_CI,
&GLB_structParam_Blink_LED_ST);
}
/* USER CODE END 3 */
ST LED点滅処理 Blink_LED_ST と
ST LED点滅インターバル変更処理 Change_Interval_Blink_LED_ST を
呼び出しています。
Change_Interval_Blink_LED_ST では、
Detects_Pressed_USW でスイッチの押下が検出された場合、
LED点滅フラグ更新 Renew_Flag_Blink_LED_ST を呼び出して
LED点滅フラグ更新(点滅時間変更)を行います。
Blink_LED_ST と Change_Interval_Blink_LED_ST は並列に実行されます。
各モジュールの説明
1) Blink_LED_ST
ST LEDを点滅します。
Shared_Lib/Handle_UI_Lib/Blink_LED_ST のフォルダに記述されています。
以下に、Blink_LED_STのコードを示します。
//----------------------------------------------------------
// ST LED点滅
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//----------------------------------------------------------
int16_t Blink_LED_ST(uint8_t *puint8_JobNum,
struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST)
{
//----------------------------------------------------
// 呼び出す関数の引数に使用する処理番号は、
// 必ず static の変数宣言をしてください。
//----------------------------------------------------
static uint8_t STC_uint8_JobNum_Time; // Time_Interval処理番号
//--------------------------------------------------------
// Time_Interval用パラメータの構造体の宣言は、
// 使用する関数内で、必ず static で宣言してください。
//--------------------------------------------------------
// Time_Interval用パラメータの構造体の宣言
//--------------------------------------------------------
static struct sParam_Time_Interval STC_structParam_Time_Interval;
int16_t int16_Return;
//--------------------------------------------------------
// ST LED再起動フラグチェック
//--------------------------------------------------------
if(pstructParam_Blink_LED_ST->int16_Restart_LED_ST == 1){
// ST LED再起動フラグONの場合
*puint8_JobNum = 1; // 処理番号を 1 にする。
pstructParam_Blink_LED_ST->int16_Restart_LED_ST = 0;
// ST LED再起動フラグOFF
}
//--------------------------------------------------------
switch(*puint8_JobNum)
{
case 0:
//--------------------------------------------------
// 1回だけ case 0: を実行します。
// その後は、case 1: を実行後、
// case 2: ~ case 3: をループします。
//--------------------------------------------------
//----------------------------------------------------------
// ST LED点滅処理用パラメータ初期化
//----------------------------------------------------------
pstructParam_Blink_LED_ST->int16_LED_ST_Init_Done = 0;
// ST LED 初期化済みフラグ
pstructParam_Blink_LED_ST->int16_Restart_LED_ST = 0;
// ST LED再起動フラグ
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = 1000;
// ST LED点灯時間(mSec)
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = 2000;
// ST LED消灯時間(mSec)
//----------------------------------------------------------
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 1:
//------------------------------------------------------
// 最初の 1回目は無条件で case 1: を実行します。
// その後は ST LED再起動フラグ が ON になった場合に
// 実行します。
//------------------------------------------------------
// ST LED 初期化済みフラグ判定
if(pstructParam_Blink_LED_ST->int16_LED_ST_Init_Done != 1){
// ST LED が初期化済みでない場合
//------------------------------------------------
// ST LEDのGPIO初期化
//------------------------------------------------
Initialize_LED_ST();
pstructParam_Blink_LED_ST->int16_LED_ST_Init_Done = 1;
// ST LED 初期化済み をセット
}
//----------------------------------------------
// ST LED点灯
//----------------------------------------------
LED_ST_ON();
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON;
// 待ち時間セット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 2:
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間未経過
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
//----------------------------------------------
// ST LED消灯
//----------------------------------------------
LED_ST_OFF();
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF;
// 待ち時間セット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 3:
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間未経過
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
//------------------------------------------------
// ST LED点灯
//------------------------------------------------
LED_ST_ON();
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON;
// 待ち時間セット
*puint8_JobNum = 2; // 処理番号 2 に移行する。: case 2:
// case 2: ~ case 3: をループ
int16_Return = -1; // 処理継続
break;
default:
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = 1; // NG終了
break;
}
return(int16_Return);
}
a) case 0:
i) ST LED点滅処理用パラメータを初期化します。
ii) 処理番号をインクリメントして次に実行する処理を case 1: にします。
b) case 1:
i) ST LED 初期化済みフラグを判定して、初期化済みでない場合、
ST LED接続ピンのGPIOを初期化します。
ii) ST LED を点灯します。
iii) 時間待ち処理モジュールのためのTime_Interval処理番号を初期化します。
iv) 点灯時間をセットします。
v) 処理番号 *puint8_JobNum をインクリメントして
次に実行する処理を case 2: にします。
c) case 2:
i) 時間待ちモジュール Time_Interval を呼び出し、
戻り値を判定します。
時間が経過していない場合、break します。
*puint8_JobNumが 2 のまま抜けるので、次にモジュールが呼び出されると
再び case 2: が実行されます。
時間が経過するまで case 2: を繰り返し実行します。
時間が経過したら以下の処理を実行します。
ii) ST LEDを消灯します。
iii) 時間待ち処理モジュールのためのTime_Interval処理番号を初期化します。
iv) 消灯時間をセットします。
v) 処理番号 *puint8_JobNum をインクリメントして
次に実行する処理を case 3: にします。
d) case 3:
i) 時間待ちモジュール Time_Interval を呼び出し、
戻り値を判定します。
時間が経過していない場合、break します。
*puint8_JobNumが 3 のまま抜けるので、次にモジュールが呼び出されると
再び case 3: が実行されます。
時間が経過するまで case 3: を繰り返し実行します。
時間が経過したら以下の処理を実行します。
ii) ST LEDを点灯します。
iii) 時間待ち処理モジュールのためのTime_Interval処理番号を初期化します。
iv) 点灯時間をセットします。
v) 処理番号 *puint8_JobNum に 2 をセットして
次に実行する処理を case 2: にします。
この後、プログラムは case 2: と case 3: を繰り返し実行します。
これにより、ST LEDは点滅します。
2) Change_Interval_Blink_LED_ST
USERスイッチの押下検出を行い、押下を検出した場合、
LED点滅インターバルを変更します。
LED_USW_Ope/Change_Interval_Blink_LED_ST のフォルダに記述されています。
以下に、Change_Interval_Blink_LED_STのコードを示します。
//---------------------------------------------------------
// ST LED点滅インターバル変更
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//----------------------------------------------------------
int16_t Change_Interval_Blink_LED_ST(uint8_t *puint8_JobNum,
struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST)
{
static uint8_t STC_uint8_JobNum_USW; // USERスイッチ検出処理番号
int16_t int16_Return;
switch(*puint8_JobNum){
case 0:
STC_uint8_JobNum_USW = 0; // USERスイッチ検出処理番号初期化
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 1:
//-----------------------------------------------------------
// USERスイッチ押下検出
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ
// 戻り値:
// -1 : 検出なし
// 0 : 検出あり
//-----------------------------------------------------------
int16_Return = def_M_Detect_USW(&STC_uint8_JobNum_USW);
if(int16_Return == -1){
// 検出なし
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 2:
//---------------------------------------------------------
// ST LED点滅フラグ更新
//---------------------------------------------------------
// 引数:
// int16_t *pint16_Flag_Blink_LED_ST : ST LED点滅フラグの変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// なし
//---------------------------------------------------------
Renew_Flag_Blink_LED_ST(&GLB_int16_Flag_Blink_LED_ST,
pstructParam_Blink_LED_ST);
*puint8_JobNum = 1; // USERスイッチ検出処理に移行する。: case 1:
int16_Return = 0; // OK : 処理が1回終了
break; // case 1: と case 2: を繰り返し実行する。
default:
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = 1; // NG終了
break;
}
return(int16_Return);
}
a) case 0:
i) USERスイッチ検出処理番号の初期化を行います。
ii) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 1: にします。
b) case 1:
i) USERスイッチ の押下検出を行います。
押下検出がない場合、break します。
*puint8_JobNumが 1 のまま抜けるので、次にモジュールが呼び出されると
再び case 1: が実行されます。
押下検出があるまで、case 1: を繰り返し実行します。
USERスイッチの押下を検出したら以下の処理を実行します。
ii) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 2: にします。
c) case 2:
i) ST LED点滅フラグの更新を行います。
ii) 処理番号 *puint8_JobNum に 1 をセットして
次に実行する処理を case 1: にします。
この後、プログラムは case 1: と case 2: を繰り返し実行します。
USERスイッチ を押下するごとに、
LED点滅フラグ GLB_int16_Flag_Blink_LED_ST を順次更新します。
以下のように、0 から 5 を繰り返します。
//-------------------------------------
// LED点滅フラグ
//-------------------------------------
// 0 : 点灯1000mSec / 消灯2000mSec
// 1 : 点灯100mSec / 消灯100mSec
// 2 : 点灯200mSec / 消灯200mSec
// 3 : 点灯300mSec / 消灯300mSec
// 4 : 点灯400mSec / 消灯400mSec
// 5 : 点灯500mSec / 消灯500mSec
//-------------------------------------
3) Detects_Pressed_USW
USERスイッチ の押下検出を行います。
USERスイッチ が押下されたら、チャタリング防止処理を行って、
チャタリングではないと判断した場合、USERスイッチ押下検出ありをセットします。
Shared_Lib/Handle_UI_Lib/Detects_Pressed_USW のフォルダに記述されています。
以下に、Detects_Pressed_USWのコードを示します。
//----------------------------------------------------------
// USERスイッチ押下検出
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値;
// -1 : 検出なし
// 0 : 検出あり
//----------------------------------------------------------
int16_t Detects_Pressed_USW(uint8_t *puint8_JobNum)
{
//----------------------------------------------------
// 呼び出す関数の引数に使用する処理番号は、
// 必ず static の変数宣言をしてください。
//----------------------------------------------------
static uint8_t STC_uint8_JobNum_Time; // Time_Interval処理番号
//------------------------------------------------------
// Time_Interval用パラメータの構造体の宣言は、
// 使用する関数内で、必ず static で宣言してください。
//------------------------------------------------------
// Time_Interval用パラメータの構造体の宣言
//------------------------------------------------------
static struct sParam_Time_Interval STC_structParam_Time_Interval;
GPIO_PinState gpio_PinState;
int16_t int16_Return;
switch(*puint8_JobNum)
{
case 0:
//--------------------------------------------------
// 1回だけ case 0: を実行します。
// その後は、case 1: を実行後、
// case 2: ~ case 7: をループします。
//--------------------------------------------------
GLB_int16_USW_Init_Done = 0; // USERスイッチ 初期化済みフラグ 初期化
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 1:
// USERスイッチ 初期化済みフラグ判定
if(GLB_int16_USW_Init_Done == 0){
// USERスイッチ 初期化済みフラグが OFF の場合
//----------------------------------------------
// USERスイッチ入力ピン初期化
//----------------------------------------------
def_M_Initialize_USW();
GLB_int16_USW_Init_Done = 1; // USERスイッチ 初期化済みフラグ ON
}
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 2:
// USERスイッチの状態を入力
gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW,
def_GPIO_PIN_x_USW);
if(gpio_PinState == def_USW_OFF){
// USERスイッチは押されていない。
int16_Return = -1; // 処理継続
break; // 処理番号維持 : 現在の処理番号をループ
}
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)def_Time_Cancel_Chatt; // 待ち時間をセット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 3: // チャタリング検出 1回目
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間が経過していない。
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
// USERスイッチの状態を入力
gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW,
def_GPIO_PIN_x_USW);
if(gpio_PinState == def_USW_OFF){
// USERスイッチは押されていない。
*puint8_JobNum = 2;
// USERスイッチの状態入力に戻る。 : case 2:
int16_Return = -1; // 処理継続
break;
}
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)def_Time_Cancel_Chatt; // 待ち時間をセット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 4: // チャタリング検出 2回目
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間が経過していない。
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
// USERスイッチの状態を入力
gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW,
def_GPIO_PIN_x_USW);
if(gpio_PinState == def_USW_OFF){
// USERスイッチは押されていない。
*puint8_JobNum = 2;
// USERスイッチの状態入力に戻る。 : case 2:
int16_Return = -1; // 処理継続
break;
}
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)def_Time_Cancel_Chatt; // 待ち時間をセット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 5: // チャタリング検出 3回目
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間が経過していない。
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
// USERスイッチの状態を入力
gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW,
def_GPIO_PIN_x_USW);
if(gpio_PinState == def_USW_OFF){
// USERスイッチは押されていない。
*puint8_JobNum = 2;
// USERスイッチの状態入力に戻る。: case 2:
int16_Return = -1; // 処理継続
break;
}
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 6:
//----------------------------------------------------------
// USERスイッチがOFFになるのを待つ。
//----------------------------------------------------------
// USERスイッチの状態を入力
gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW,
def_GPIO_PIN_x_USW);
if(gpio_PinState == def_USW_ON){
// USERスイッチは押されている。
int16_Return = -1;
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
STC_uint8_JobNum_Time = 0; // Time_Interval処理番号初期化
STC_structParam_Time_Interval.uint32_Interval
= (uint32_t)def_Time_Release_SW; // 待ち時間をセット
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 7:
//----------------------------------------------------------
// USERスイッチがOFFになった後、少し待つ。
//----------------------------------------------------------
//----------------------------------------------------------
// 時間待ち : 単位 mSec
//----------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// struct sParam_Time_Interval *pstructParam_Time_Interval :
// Time_Interval用パラメータの構造体のポインタ
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//----------------------------------------------------------
int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
&STC_structParam_Time_Interval);
if(int16_Return == -1){
// 処理中 : 時間が経過していない。
break; // 処理番号維持 : 処理継続 : 現在の処理番号をループ
}
*puint8_JobNum = 2; // 処理番号 2 に移行する。: case 2:
// case 2: ~ case 7: をループ
int16_Return = 0; // USERスイッチ押下検出ありをセット
break;
default:
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = -1; // 処理継続
break;
}
return(int16_Return);
}
a) case 0:
i) USERスイッチ 初期化済みフラグ を初期化します。
ii) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 1: にします。
b) case 1:
i) USERスイッチ 初期化済みフラグを判定して、初期化済みでない場合、
USERスイッチ接続ピンのGPIOを初期化します。
ii) 処理番号 *puint8_JobNum をインクリメントして次に実行する処理を case 2: にします。
c) case 2:
i) USERスイッチ が押されるのを待ちます。
USERスイッチ が押されていない場合、break します。
*puint8_JobNumが 2 のまま抜けるので、次にモジュールが呼び出されると
再び case 2: が実行されます。
USERスイッチ が押されるまで case 2: を繰り返し実行します。
USERスイッチ が押されたら以下の処理を実行します。
ii) チャタリング検出時間をセットします。
iii) 処理番号 *puint8_JobNum をインクリメントして
次に実行する処理を case 3: にします。
d) case 3:
チャタリング検出 1回目を行います。
i) 時間待ちモジュール Time_Interval を呼び出し、
戻り値を判定します。
時間が経過していない場合、break します。
*puint8_JobNum が 3 のまま抜けるので、次にモジュールが呼び出されると
再び case 3: が実行されます。
時間が経過するまで case 3: を繰り返し実行します。
時間が経過したら以下の処理を実行します。
ii) USERスイッチ の状態をみて、押されていない場合、
処理番号*puint8_JobNum を 2 にして、次に実行する処理を case 2: にします。
USERスイッチ が押されたままなら、チャタリング検出時間をセットします。
iii) 処理番号 *puint8_JobNum をインクリメントして
次に実行する処理を case 4: にします。
e) case 4:
チャタリング検出 2回目を行います。
f) case 5:
チャタリング検出 3回目を行います。
g) case 6:
i) USERスイッチ がOFFになるのを待ちます。
USERスイッチ が押されている場合、break します。
*puint8_JobNumが 6 のまま抜けるので、次にモジュールが呼び出されると
再び case 6: が実行されます。
USERスイッチ がOFFになるまで case 6: を繰り返し実行します。
USERスイッチ がOFFになったら以下の処理を実行します。
ii) OFF待ち時間をセットします。
iii) 処理番号 *puint8_JobNum をインクリメントして
次に実行する処理を case 7: にします。
h) case 7:
i) 時間待ちモジュール Time_Interval を呼び出し、
戻り値を判定します。
時間が経過していない場合、break します。
*puint8_JobNum が 7 のまま抜けるので、次にモジュールが呼び出されると
再び case 7: が実行されます。
時間が経過するまで case 7: を繰り返し実行します。
時間が経過したら以下の処理を実行します。
ii) 処理番号 *puint8_JobNum に 2 をセットして
次に実行する処理を case 2: にします。
iii) 戻り値を USERスイッチ 押下検出ありにします。
この後、プログラムは case 2: ~ case 7: を繰り返し実行します。
4) Renew_Flag_Blink_LED_ST
LED点滅フラグを更新します。これによりLEDの点滅間隔が変化します。
USERスイッチ入力が検出されたときに呼び出します。
LED_USW_Ope/Change_Interval_Blink_LED_ST/Change_Interval_Blink_LED_ST.c に記述されています。
以下に、Renew_Flag_Blink_LED_STのコードを示します。
//---------------------------------------------------------
// ST LED点滅フラグ更新
//---------------------------------------------------------
// 引数:
// int16_t *pint16_Flag_Blink_LED :
// LED点滅フラグの変数のポインタ
// struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
// ST LED点滅用パラメータの構造体のポインタ
// 戻り値:
// なし
//---------------------------------------------------------
void Renew_Flag_Blink_LED_ST(int16_t *pint16_Flag_Blink_LED,
struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST)
{
//-------------------------------------
// LED点滅フラグ
//-------------------------------------
// 0 : 点灯1000mSec / 消灯2000mSec
// 1 : 点灯100mSec / 消灯100mSec
// 2 : 点灯200mSec / 消灯200mSec
// 3 : 点灯300mSec / 消灯300mSec
// 4 : 点灯400mSec / 消灯400mSec
// 5 : 点灯500mSec / 消灯500mSec
//-------------------------------------
(*pint16_Flag_Blink_LED)++; // LED点滅フラグ + 1
if(*pint16_Flag_Blink_LED > 5){
// 5 を超えたら 0 にする。 : 0 ~ 5 の値を繰り返す。
*pint16_Flag_Blink_LED = 0; // LED点滅フラグに0をセット
}
//-----------------------------------------------------
// LED点滅フラグ : int16_Flag_Blink の値により点滅間隔を設定する。
//-----------------------------------------------------
switch(*pint16_Flag_Blink_LED)
{
case 0:
//------------------------------------------------
// LED(緑) : 点灯1000mSec / 消灯2000mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)1000;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)2000;
//------------------------------------------------
break;
case 1:
//------------------------------------------------
// LED(緑) : 点灯100mSec / 消灯100mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)100;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)100;
//------------------------------------------------
break;
case 2:
//------------------------------------------------
// LED(緑) : 点灯200mSec / 消灯200mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)200;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)200;
//------------------------------------------------
break;
case 3:
//------------------------------------------------
// LED(緑) : 点灯300mSec / 消灯300mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)300;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)300;
//------------------------------------------------
break;
case 4:
//------------------------------------------------
// LED(緑) : 点灯400mSec / 消灯400mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)400;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)400;
//------------------------------------------------
break;
case 5:
//------------------------------------------------
// LED(緑) : 点灯500mSec / 消灯500mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)500;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)500;
//------------------------------------------------
break;
default:
//------------------------------------------------
// LED(緑) : 点灯1000mSec / 消灯2000mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)1000;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)2000;
//------------------------------------------------
break;
}
pstructParam_Blink_LED_ST->int16_Restart_LED_ST = 1; // LED再起動フラグON
}
a) LED点滅フラグの更新
LED点滅フラグの更新は以下の部分です。
//-------------------------------------
// LED点滅フラグ
//-------------------------------------
// 0 : 点灯1000mSec / 消灯2000mSec
// 1 : 点灯100mSec / 消灯100mSec
// 2 : 点灯200mSec / 消灯200mSec
// 3 : 点灯300mSec / 消灯300mSec
// 4 : 点灯400mSec / 消灯400mSec
// 5 : 点灯500mSec / 消灯500mSec
//-------------------------------------
(*pint16_Flag_Blk_LED)++; // LED点滅フラグ + 1
if(*pint16_Flag_Blk_LED > 5){
// 5 を超えたら 0 にする。 : 0 ~ 5 の値を繰り返す。
*pint16_Flag_Blk_LED = 0;
}
LED点滅フラグをインクリメントして、5 を超えたら、0 に戻します。
LED点滅フラグを 0 - 5 の範囲で変化させます。
b) LED点滅間隔の更新
LED点滅間隔の更新は以下の部分です。
//-----------------------------------------------------
// LED点滅フラグ : *pint16_Flag_Blink_LED_ST の値により
// 点滅間隔を設定する。
//-----------------------------------------------------
switch(*pint16_Flag_Blink_LED_ST)
{
case 0:
//------------------------------------------------
// LED(緑) : 点灯1000mSec / 消灯2000mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)1000;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)2000;
//------------------------------------------------
break;
case 1:
//------------------------------------------------
// LED(緑) : 点灯100mSec / 消灯100mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)100;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)100;
//------------------------------------------------
break;
case 2:
//------------------------------------------------
// LED(緑) : 点灯200mSec / 消灯200mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)200;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)200;
//------------------------------------------------
break;
case 3:
//------------------------------------------------
// LED(緑) : 点灯300mSec / 消灯300mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)300;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)300;
//------------------------------------------------
break;
case 4:
//------------------------------------------------
// LED(緑) : 点灯400mSec / 消灯400mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)400;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)400;
//------------------------------------------------
break;
case 5:
//------------------------------------------------
// LED(緑) : 点灯500mSec / 消灯500mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)500;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)500;
//------------------------------------------------
break;
default:
//------------------------------------------------
// LED(緑) : 点灯1000mSec / 消灯2000mSec
//------------------------------------------------
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_ON = (uint16_t)1000;
pstructParam_Blink_LED_ST->uint16_Time_LED_ST_OFF = (uint16_t)2000;
//------------------------------------------------
break;
}
LED点滅フラグの値に従って、点滅間隔を設定します。
c) LED再起動フラグON
LED再起動フラグONは以下の部分です。
pstructParam_Blink_LED_ST->int16_Restart_LED_ST = 1; // LED再起動フラグON
LED再起動フラグをONにすることにより、
ただちに、設定された点滅間隔で動作を開始します。
A+-2C (ええ加減にC) のページに戻る
メールアドレス: apm2c.sumi@gmail.com
なんでも、気軽に ご相談ください。
担当:おの
えがおのでんし 案内