サンプルプログラム G431KB_LED_USW の説明
マスコット   LED点滅とスイッチ入力の処理を
 並列に動作させるプログラムです。

  スイッチを押すごとに、LEDの点滅間隔を
 変更します。

  サンプルプログラムの動作を確認するために
 STMicroelectronics社製の評価用基板 NUCLEO-G431KB と
 STMicroelectronics社のfreeの開発ツール、STM32CubeIDE
 および
 えがおのでんし製の動作試験用基板 Base-N431KB
 を使用しています。

目次

えがおのでんし製の動作試験用基板 Base-N431KB の説明

サンプルプログラム G431KB_LED_USW のプロジェクト

サンプルプログラム G431KB_LED_USW の説明
 G431KB_LED_USW の構成

 G431KB_LED_USW の動作パラメータの定義
 ユーザープログラムの実行開始位置

 G431KB_LED_USW の main() の説明
  1) 初期化の部分
  2) LED点滅 と User Switch入力検出 処理の部分

 各モジュールの説明
  1) Blink_LED_Status
  2) Change_Interval_Blink_LED
  3) Detect_USW
  4) Renew_Flag_Blink_LED



えがおのでんし製の動作試験用基板 Base-N431KB の説明
  このサンプルプログラムは、
  えがおのでんし製の動作試験用基板 Base-N431KB を使用して動作を確認しています。

Base-N431KB-V2

  基板については、
 Base-N431KB基板 の説明 をご覧ください。



サンプルプログラム G431KB_LED_USW のプロジェクト
 STM32CubeIDE 1.12.1 を使用して作成しました。

 ここからサンプルプログラム W_G431KB_LED_USW.zip をダウンロードしてください。

  プロジェクト W_G431KB_LED_USW は、
 フォルダ C:\Work_CubeIDE\W_G431KB\W_G431KB_LED_USW のように配置して作成しました。

  フォルダ C:\Work_CubeIDE\W_G431KB を作成して、
 そのフォルダに W_G431KB_LED_USW.zip を貼り付けて解凍し、
 プロジェクト作成時と同一に C:\Work_CubeIDE\W_G431KB\W_G431KB_LED_USW と
 配置した場合は、普通にプロジェクトを開くことができます。

  サンプルプログラムのプロジェクトを任意のフォルダに配置した場合に、
 STM32CubeIDEにより、そのプロジェクトを開く方法については
既存のプロジェクトを開く方法 をご覧ください。



サンプルプログラム G431KB_LED_USW の説明
  tri-S基板上のLED、LED1を点滅させます。
  tri-S基板上のUserスイッチを押すごとに点滅間隔を変化させます。

  LED点滅処理とスイッチ入力検出処理は並列に動作します。

 プロジェクトを最初に開いた画面は以下のようになります。

LED_USW_Scrn_First

 以下、サンプルプログラム G431KB_LED_USW について説明していきます。



 G431KB_LED_USW の構成
  STM32CubeIDEの画面左側、Project Explorerの
 G431KB_LED_USW を展開した画面は以下のようになります。

G431KB_LED_USW_Tree

  サンプルプログラム G431KB_LED_USW の構成を以下に示します。
G431KB_LED_USW
  |
  |- Includes
  |
  |- C_Lib
  |    |- User_IF_Lib
  |    |    |- Blink_LED_Status : Status LED点滅処理
  |    |    |   |-Blink_LED_Status.c
  |    |    |   |-Blink_LED_Status.h
  |    |    |
  |    |    |
  |    |    |- Detect_USW : User Switch入力検出処理
  |    |         |- Detect_USW.c
  |    |         |- Detect_USW.h
  |    |
  |    |
  |    |- Wait_Itvl : 時間待ち処理
  |        |- Wait_Itvl.c
  |        |- Wait_Itvl.h
  |
  |- Core
  |    |- Inc
  |    |    |- main.h
  |    |    |- stm32g4xx_hal_conf.h
  |    |    |- stm32g4xx_it.h
  |    |
  |    |- Src
  |    |    |- main.c
  |    |    |- stm32g4xx_hal_msp.c
  |    |    |- stm32g4xx_it.c
  |    |    |- syscalls.c
  |    |    |- system.c
  |    |    |- system_stm32g4xx.c
  |    |
  |    |- Startup
  |
  |- Drivers
  |
  |- LED_USW_Ope
  |    |- Change_Interval_Blink_LED : LED点滅インターバル変更
  |    |    |- Change_Interval_Blink_LED.c
  |    |    |- Change_Interval_Blink_LED.h
  |    |
  |    |- G431KB_Config : 動作パラメータの定義
  |        |- Dev_Conf.h
  |
  |- G431KB_LED_USW.launch
  |- STM32G431KBTX_FLASH.ld



 G431KB_LED_USW の動作パラメータの定義
  サンプルプログラム G431KB_LED_USW の動作パラメータの定義を
  LED_USW_Ope/G431KB_Config/Dev_Conf.h に記述しています。

  使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、
 などを記述しています。



 ユーザープログラムの実行開始位置
  プログラムは、int main(void) から実行開始します。

  int main(void) は、フォルダ Core/Src/main.c にあります。

LED_USW_main

  STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
 行った後、int main(void) を呼び出します。

  ユーザーコード(記述したプログラム)は、
 int main(void) の先頭から実行されます。



 G431KB_LED_USW の main() の説明
  サンプルプログラム G431KB_LED_USW の main() の記述は、
 以下のとおりです。


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  uint8_t uint8_JobNum_LED = 0;  // LED点滅処理番号
  uint8_t 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 */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // Status LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_Time_ON  : 点灯時間
    // uint16_t uint16_Time_OFF : 消灯時間

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_Status(&uint8_JobNum_LED,
                     GLB_uint16_Time_LED_Status_ON,
                     GLB_uint16_Time_LED_Status_OFF);


    //------------------------------------------------------
    // LED点滅インターバル変更。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Change_Interval_Blink_LED(&uint8_JobNum_CI);
  }
  /* 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) LED点滅 と User Switch入力検出 処理の部分
   永久ループ部分の記述を以下に示します。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // Status LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_Time_ON  : 点灯時間
    // uint16_t uint16_Time_OFF : 消灯時間

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_Status(&uint8_JobNum_LED,
                     GLB_uint16_Time_LED_Status_ON,
                     GLB_uint16_Time_LED_Status_OFF);


    //------------------------------------------------------
    // LED点滅インターバル変更。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Change_Interval_Blink_LED(&uint8_JobNum_CI);
  }
  /* USER CODE END 3 */


  Status LED点滅処理 Blink_LED_Status と
 LED点滅インターバル変更処理 Change_Interval_Blink_LED を
 呼び出しています。

  Change_Interval_Blink_LED では、
 Detect_USW でスイッチの押下が検出された場合、
 LED点滅フラグ更新 Renew_Flag_Blink_LED を呼び出して
 LED点滅フラグ更新(点滅時間変更)を行います。

  Blink_LED_Status と Change_Interval_Blink_LED は並列に実行されます。



 各モジュールの説明



 1) Blink_LED_Status
  Status LEDを点滅します。

  C_Lib/User_IF_Lib/Blink_LED_Status のフォルダに記述されています。

  以下に、Blink_LED_Statusのコードを示します。
//------------------------------------------------------
// Status LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// uint16_t uint16_Time_ON  : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG
//------------------------------------------------------
int16_t Blink_LED_Status(uint8_t *puint8_JobNum,
                         uint16_t uint16_Time_ON,
                         uint16_t uint16_Time_OFF)
{
  static uint8_t STC_uint8_JobNum_Wait;  // 時間待ちの処理番号
  static uint32_t STC_uint32_tikstart;   // 時間待ち開始時のカウント数
  static uint32_t STC_uint32_Interval;   // 待ち時間

  int16_t int16_Return;


  // Status LED再起動フラグチェック
  if(GLB_int16_Restart_LED_Status == 1){
    // Status LED再起動フラグONの場合
    *puint8_JobNum = 0;  // 処理番号を 0 にする。

    GLB_int16_Restart_LED_Status = 0;  // Status LED再起動フラグOFF
  }


  switch(*puint8_JobNum)
  {
  case 0:
    // Status LED 初期化済みフラグ判定
    if(GLB_int16_LED_Status_Init_Done != 1){
      // Status LED が初期化済みでない場合

      //------------------------------------------------
      // Status LEDのGPIO初期化
      //------------------------------------------------
      Init_LED_Status();


      GLB_int16_LED_Status_Init_Done = 1;  // Status LED 初期化済み をセット
    }


    //------------------------------------------------
    // Status LED点灯
    //------------------------------------------------
    LED_Status_ON();


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)uint16_Time_ON;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 1:
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : case 1: をループ
    }


    //------------------------------------------------
    // Status LED消灯
    //------------------------------------------------
    LED_Status_OFF();


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)uint16_Time_OFF;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 2:
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : case 2: をループ
    }


    //------------------------------------------------
    // Status LED点灯
    //------------------------------------------------
    LED_Status_ON();


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)uint16_Time_ON;  // 待ち時間


    *puint8_JobNum = 1;  // 処理番号 1 に移行する。: case 1:
    int16_Return = -1;   // 処理継続
    break;

  default:
    *puint8_JobNum = 0;   // 処理番号初期化
    int16_Return = 1;     // NG終了
    break;
  }

  return(int16_Return);
}

 a) case 0:
   初期化済みフラグ GLB_int16_LED_Status_Init_Done を判定して
  初期化済みでない場合は、モジュール Init_LED_Status を呼び出して
  LED接続ピンの初期化を行います。

   そしてLEDを点灯して点灯時間をセットします。

   *puint8_JobNumがインクリメントされ、次の処理 case 1: に進みます。

 b) case 1:
   時間待ちをしています。
   時間が経過するまで case 1: をループします。

   時間が経過していない場合、
  *puint8_JobNumが 1 のまま抜けるので、次にモジュールが呼び出されると
  switch case文で再び case 1: が実行されます。

   時間が経過したとき、LEDを消灯して消灯時間をセットします。

   *puint8_JobNumがインクリメントされ、次の処理 case 2: に進みます。

  c) case 2:
   時間待ちをします。
   時間が経過するまで case 2: をループします。
   時間が経過したら、LEDを点灯して点灯時間をセットします。

   処理番号を 1 にして、case 1:に処理を移行します。



 2) Change_Interval_Blink_LED
  User Switch の押下検出を行い、押下を検出した場合、
 LED点滅インターバルを変更します。

  LED_USW_Ope/Change_Interval_Blink_LED のフォルダに記述されています。

  以下に、Change_Interval_Blink_LEDのコードを示します。
//------------------------------------------------------
// LED点滅インターバル変更
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG
//------------------------------------------------------
int16_t Change_Interval_Blink_LED(uint8_t *puint8_JobNum)
{
  static uint8_t STC_uint8_JobNum_USW;  // User Switch検出処理番号

  int16_t int16_Return;


  switch(*puint8_JobNum){
  case 0:
    STC_uint8_JobNum_USW = 0;  // User Switch検出処理番号初期化


    //----------------------------------------------
    // User Switch入力ピン初期化
    //----------------------------------------------
    Init_USW();


    (*puint8_JobNum)++;  // 処理番号をインクリメント
                         // : 次の処理番号に移行する。 : case 1:
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //-----------------------------------------------------------
    // User Switch検出
    //-----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ

    // 戻り値:
    //   -1 : 検出なし
    //    0 : 検出あり
    //-----------------------------------------------------------
    int16_Return = def_M_Detect_USW(&STC_uint8_JobNum_USW);
    if(int16_Return == -1){
      // 検出なし
      break;  // 処理番号維持 : 処理継続 : case 1: をループ
    }


    (*puint8_JobNum)++;  // 処理番号をインクリメント
                         // : 次の処理番号に移行する。 : case 2:
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //---------------------------------------------------------
    // LED点滅フラグ更新
    //---------------------------------------------------------
    // 引数:
    // int16_t *pint16_Flag_Blink_LED : LED点滅フラグの変数のポインタ
    //---------------------------------------------------------
    Renew_Flag_Blink_LED(&GLB_int16_Flag_Blink_LED);


    *puint8_JobNum = 1;  // User Switch検出処理に移行する。: 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:
   User Switch入力ピンの初期化を行います。

   処理番号をインクリメントして、case 1: に移行します。

 b) case 1:
   User Switch の押下検出を行います。
   押下検出があるまで、case 1: をループします。

   押下検出があった場合、
  処理番号をインクリメントして、case 2: に移行します。

 c) case 2:
   LED点滅フラグの更新を行います。

   User Switch を押下するごとに、LED点滅フラグ GLB_int16_Flag_Blink_LED を
  順次更新します。

   以下のように、0 から 5 を繰り返します。
//-------------------------------------
// LED点滅フラグ
//-------------------------------------
//  0 : 点灯1000mSec / 消灯2000mSec
//  1 : 点灯100mSec / 消灯100mSec
//  2 : 点灯200mSec / 消灯200mSec
//  3 : 点灯300mSec / 消灯300mSec
//  4 : 点灯400mSec / 消灯400mSec
//  5 : 点灯500mSec / 消灯500mSec
//-------------------------------------


 3) Detect_USW
  User Switch の押下を検出します。

  User Switch が押下されたら、チャタリング防止処理を行って、
 チャタリングではないと判断した場合、User Switch入力検出ありをセットします。

  C_Lib/User_IF_Lib/Detect_USW のフォルダに記述されています。

  以下に、Detect_USWのコードを示します。
//-----------------------------------------------------------
// User Switch押下検出
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ

// 戻り値:
//   -1 : 検出なし
//    0 : 検出あり
//-----------------------------------------------------------
int16_t Detect_USW(uint8_t *puint8_JobNum)
{
  static uint8_t STC_uint8_JobNum_Wait;  // 時間待ちの処理番号
  static uint32_t STC_uint32_tikstart;   // 時間待ち開始時のカウント数
  static uint32_t STC_uint32_Interval;   // 待ち時間

  GPIO_PinState gpio_PinState;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    //----------------------------------------------
    // User Switch入力ピン初期化
    //----------------------------------------------
    def_M_Init_USW();


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 1:
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    // USER Switchの状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == def_USW_OFF){
      // Userスイッチは押されていない。
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : case 1: をループ
    }


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)def_Time_Cancel_Chatt;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 2:
    int16_Return = -1;   // 処理継続
    break;

  case 2:  // チャタリング検出 1回目
    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : case 2: をループ
    }


    // USER Switchの状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == def_USW_OFF){
      // Userスイッチは押されていない。
      *puint8_JobNum = 1;  // USER Switchの状態入力に戻る。 : case 1:
      int16_Return = -1;   // 処理継続
      break;
    }


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)def_Time_Cancel_Chatt;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 3:
    int16_Return = -1;   // 処理継続
    break;

  case 3:  // チャタリング検出 2回目
    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : case 3: をループ
    }


    // USER Switchの状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == def_USW_OFF){
      // Userスイッチは押されていない。
      *puint8_JobNum = 1;  // USER Switchの状態入力に戻る。 : case 1:
      int16_Return = -1;   // 処理継続
      break;
    }


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)def_Time_Cancel_Chatt;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 4:
    int16_Return = -1;   // 処理継続
    break;

  case 4:  // チャタリング検出 3回目
    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : case 4: をループ
    }


    // USER Switchの状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == def_USW_OFF){
      // Userスイッチは押されていない。
      *puint8_JobNum = 1;  // USER Switchの状態入力に戻る。: case 1:
      int16_Return = -1;   // 処理継続
      break;
    }


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 5:
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //--------------------------------------------------------------------
    // UserスイッチがOFFになるのを待つ。
    //--------------------------------------------------------------------
    // USER Switchの状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == def_USW_ON){
      // Userスイッチは押されている。
      int16_Return = -1;
      break;  // 処理番号維持 : 処理継続 : case 5: をループ
    }


    STC_uint8_JobNum_Wait = 0;  // 時間待ちの処理番号初期化
    STC_uint32_Interval = (uint32_t)def_Time_Release_SW;  // 待ち時間


    (*puint8_JobNum)++;  // 処理番号をインクリメント : 次の処理番号に移行する。 : case 6:
    int16_Return = -1;   // 処理継続
    break;

  case 6:
    //--------------------------------------------------------------------
    // UserスイッチがOFFになった後、少し待つ。
    //--------------------------------------------------------------------

    //------------------------------------------------------
    // 時間待ち : 単位 mSec
    //------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
    // uint32_t uint32_mSec : 待ち時間(mSec)

    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
                                 &STC_uint32_tikstart,
                                 STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : case 6: をループ
    }


    *puint8_JobNum = 1;  // USER Switchの状態入力に戻る。 : case 1:
    int16_Return = 0;    // User Switch入力検出ありをセット
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = -1;   // 処理継続
    break;
  }

  return(int16_Return);  // 処理状態(結果)を返す。
}

 a) case 0:
   User Switch の入力ピンを初期化します。

   処理番号をインクリメントして、case 1: に移行します。

 b) case 1:
   User Switch が押されるのを待ちます。

   User Switch が押されるまで、case 1: をループします。
   押されたら、チャタリング検出時間をセットし、
  処理番号をインクリメントして、case 2: に移行します。

 c) case 2:
   チャタリング検出を行います。

   指定されたチャタリング検出時間が経過するまで、case 2: をループします。
   時間が経過したら、User Switch の状態をみて、押されていない場合、
  処理番号を 1 にして、case 1: に戻ります。

   User Switch が押されたままなら、チャタリング検出時間をセットし、
  処理番号をインクリメントして、case 3: に移行します。

 d) case 3:
   チャタリング検出 2回目を行います。

 e) case 4:
   チャタリング検出 3回目を行います。

 f) case 5:
   User Switch がOFFになるまで、case 5: をループします。
   OFFになったら、OFF時間をセットし、
  処理番号をインクリメントして、case 6: に移行します。

 g) case 6:
   指定されたOFF時間が経過するまで、case 6: をループします。
   時間が経過したら、戻り値を User Switch 検出ありにし、
  処理番号を 1 にして、case 1: に戻ります。



 4) Renew_Flag_Blink_LED
  LED点滅フラグを更新します。これによりLEDの点滅間隔が変化します。
  User Switch入力が検出されたときに呼び出します。

  LED_USW_Ope/Change_Interval_Blink_LED/Change_Interval_Blink_LED.c に記述されています。

  以下に、Renew_Flag_Blink_LEDのコードを示します。

//---------------------------------------------------------
// LED点滅フラグ更新
//---------------------------------------------------------
// 引数:
// int16_t *pint16_Flag_Blink_LED : LED点滅フラグの変数のポインタ
//---------------------------------------------------------
void Renew_Flag_Blink_LED(int16_t *pint16_Flag_Blink_LED)
{
    //-------------------------------------
    // 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
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)1000;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)2000;
      //------------------------------------------------

      break;

    case 1:
      //------------------------------------------------
      // LED(緑) : 点灯100mSec / 消灯100mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)100;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)100;
      //------------------------------------------------

      break;

    case 2:
      //------------------------------------------------
      // LED(緑) : 点灯200mSec / 消灯200mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)200;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)200;
      //------------------------------------------------

      break;

    case 3:
      //------------------------------------------------
      // LED(緑) : 点灯300mSec / 消灯300mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)300;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)300;
      //------------------------------------------------

      break;

    case 4:
      //------------------------------------------------
      // LED(緑) : 点灯400mSec / 消灯400mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)400;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)400;
      //------------------------------------------------

      break;

    case 5:
      //------------------------------------------------
      // LED(緑) : 点灯500mSec / 消灯500mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)500;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)500;
      //------------------------------------------------

      break;

    default:
      //------------------------------------------------
      // LED(緑) : 点灯1000mSec / 消灯2000mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Status_ON = (uint16_t)1000;
      GLB_uint16_Time_LED_Status_OFF = (uint16_t)2000;
      //------------------------------------------------

      break;
    }

    GLB_int16_Restart_LED_Status = 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点滅フラグ : int16_Flag_Blink の値により点滅間隔を設定する。
    //-----------------------------------------------------
    switch(*pint16_Flag_Blk_LED)
    {
    case 0:
      //------------------------------------------------
      // LED(緑) : 点灯1000mSec / 消灯2000mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)1000;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)2000;
      //------------------------------------------------

      break;

    case 1:
      //------------------------------------------------
      // LED(緑) : 点灯100mSec / 消灯100mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)100;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)100;
      //------------------------------------------------

      break;

    case 2:
      //------------------------------------------------
      // LED(緑) : 点灯200mSec / 消灯200mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)200;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)200;
      //------------------------------------------------

      break;

    case 3:
      //------------------------------------------------
      // LED(緑) : 点灯300mSec / 消灯300mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)300;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)300;
      //------------------------------------------------

      break;

    case 4:
      //------------------------------------------------
      // LED(緑) : 点灯400mSec / 消灯400mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)400;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)400;
      //------------------------------------------------

      break;

    case 5:
      //------------------------------------------------
      // LED(緑) : 点灯500mSec / 消灯500mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)500;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)500;
      //------------------------------------------------

      break;

    default:
      //------------------------------------------------
      // LED(緑) : 点灯1000mSec / 消灯2000mSec
      //------------------------------------------------
      GLB_uint16_Time_LED_Stat_ON = (uint16_t)1000;
      GLB_uint16_Time_LED_Stat_OFF = (uint16_t)2000;
      //------------------------------------------------

      break;
    }

   LED点滅フラグの値に従って、点滅間隔を設定します。

 c) LED再起動フラグON
   LED再起動フラグONは以下の部分です。
    GLB_int16_Restart_LED_Status = 1;  // LED再起動フラグON
   LED再起動フラグをONにすることにより、
  ただちに、設定された点滅間隔で動作を開始します。



A+-2C (ええ加減にC) のページに戻る




 メールアドレス: apm2c.sumi@gmail.com

 なんでも、気軽に ご相談ください。
 担当:おの

マスコット
  えがおのでんし 案内