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

  STMicroelectronics社製の
 評価用基板、NUCLEO-F446RE と
 freeの開発ツール、STM32CubeIDE
 使用しています。


目次

サンプルプログラム N446RE_LED_USW のソース

サンプルプログラム N446RE_LED_USW の説明
 N446RE_LED_USW の構成
 N446RE_LED_USW の動作パラメータの定義
 ユーザープログラムの実行開始位置
 N446RE_LED_USW の main() の説明
  1) 初期化の部分
  2) LED点滅 と User Switch入力検出 処理の部分
 各モジュールの説明
  1) Blk_LED_Stat
  2) Det_USW
  3) Renew_Flag_Blk_LED



サンプルプログラム N446RE_LED_USW のソース
 STM32CubeIDE 1.7.0 を使用して作成しました。

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



サンプルプログラム N446RE_LED_USW の説明
  NUCLEO-F446RE基板上のLED、LD2を点滅させます。
  NUCLEO-F446RE基板上のUSERスイッチを押すごとに点滅間隔を変化させます。

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

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

LED_USW_Scrn_First

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



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

N446RE_LED_USW_Tree

  サンプルプログラム N446RE_LED_USW の構成を以下に示します。
N446RE_LED_USW
  |
  |- Includes
  |
  |- Blk_LED_Stat : Status LED点滅処理
  |    |-Blk_LED_Stat.c
  |    |-Blk_LED_Stat.h
  |
  |- Core
  |    |- Inc
  |    |    |- main.h
  |    |    |- stm32f4xx_hal_conf.h
  |    |    |- stm32f4xx_it.h
  |    |
  |    |- Src
  |    |    |- main.c
  |    |    |- stm32f4xx_hal_msp.c
  |    |    |- stm32f4xx_it.c
  |    |    |- syscalls.c
  |    |    |- system.c
  |    |    |- system_stm32f4xx.c
  |    |
  |    |- Startup
  |
  |- Det_USW : User Switch入力検出処理
  |    |- Det_USW.c
  |    |- Det_USW.h
  |
  |- Drivers
  |
  |- N446RE_Config : 動作パラメータの定義
  |    |- Dev_Conf.h
  |
  |- Periph_F4 : 周辺インターフェース処理
  |    |- H_F4_GPIO.c
  |    |- H_F4_GPIO.h
  |
  |- Wait_Itvl : 時間待ち処理
  |    |- Wait_Itvl.c
  |    |- Wait_Itvl.h
  |
  |- N446RE_LED_USW.launch
  |- STM32F446RETX_FLASH.ld
  |- STM32F446RETX_RAM.ld



 N446RE_LED_USW の動作パラメータの定義
  サンプルプログラム N446RE_LED_USW の 動作パラメータの定義を
  N446RE_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) の先頭から実行されます。



 N446RE_LED_USW の main() の説明
  サンプルプログラム N446RE_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_USW = 0;  // USW検出処理番号

  //-------------------------------------
  // LED点滅フラグ
  //-------------------------------------
  //  0 : 点灯1000mSec / 消灯2000mSec
  //  1 : 点灯100mSec / 消灯100mSec
  //  2 : 点灯200mSec / 消灯200mSec
  //  3 : 点灯300mSec / 消灯300mSec
  //  4 : 点灯400mSec / 消灯400mSec
  //  5 : 点灯500mSec / 消灯500mSec
  //-------------------------------------
  int16_t int16_Flag_Blk_LED = 0;

  int16_t int16_Return;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/


  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 Switch入力ピン初期化
  //----------------------------------------------
  Init_USW();

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

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

  /* 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
    //------------------------------------------------------
    Blk_LED_Stat(&uint8_JobNum_LED,
                 GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);


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

    // 戻り値:
    //   -1 : 検出なし
    //    0 : 検出あり
    //-----------------------------------------------------------
    int16_Return = Det_USW(&uint8_JobNum_USW);
    if(int16_Return == 0){
      // 検出あり
      //---------------------------------------------------------
      // LED点滅フラグ更新
      //---------------------------------------------------------
      // 引数:
      // int16_t *pint16_Flag_Blk_LED : LED点滅フラグの変数のポインタ
      //---------------------------------------------------------
      Renew_Flag_Blk_LED(&int16_Flag_Blk_LED);
    }
  }
  /* 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)
{
         .
         .
         .
}
 の、すぐ下に記述されています。


  c) USERスイッチの初期化
    User Switch入力ピン初期化モジュール Init_USW(); を呼び出しています。

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

   USERスイッチが接続されているピンを入力に設定しています。

  d) LEDの初期化
   初期の点滅時間をセットした後、Init_LED_Stat(); を呼び出して
   LEDが接続されているピンを出力に設定しています。

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

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



 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
    //------------------------------------------------------
    Blk_LED_Stat(&uint8_JobNum_LED,
                 GLB_uint16_Time_LED_Stat_ON, GLB_uint16_Time_LED_Stat_OFF);


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

    // 戻り値:
    //   -1 : 検出なし
    //    0 : 検出あり
    //-----------------------------------------------------------
    int16_Return = Det_USW(&uint8_JobNum_USW);
    if(int16_Return == 0){
      // 検出あり
      //---------------------------------------------------------
      // LED点滅フラグ更新
      //---------------------------------------------------------
      // 引数:
      // int16_t *pint16_Flag_Blk_LED : LED点滅フラグの変数のポインタ
      //---------------------------------------------------------
      Renew_Flag_Blk_LED(&int16_Flag_Blk_LED);
    }
  }
  /* USER CODE END 3 */

  Status LED点滅処理 Blk_LED_Stat と User Switch入力検出処理 Det_USW を呼び出しています。
  Det_USW でスイッチの押下が検出された場合、LED点滅フラグ更新 Renew_Flag_Blk_LED を呼び出して
 LED点滅フラグ更新(点滅時間変更)を行います。



 各モジュールの説明



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

  Blk_LED_Stat のフォルダに記述されています。

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

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

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG
//------------------------------------------------------
int16_t Blk_LED_Stat(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_Stat == 1){
    // Status LED再起動フラグONの場合
    *puint8_JobNum = 0;  // 処理番号を 0 にする。

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


  switch(*puint8_JobNum)
  {
  case 0:
    //------------------------------------------------
    // Status LED点灯
    //------------------------------------------------
    Status_LED_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_mSec_Seq_Multi(&STC_uint8_JobNum_Wait,
                                       &STC_uint32_tikstart,
                                       STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : case 1: をループ
    }


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

  case 2:
    //------------------------------------------------
    // Status LED消灯
    //------------------------------------------------
    Status_LED_OFF();


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


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

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

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

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


    *puint8_JobNum = 0;   // 処理番号を 0 にして、case 0: に戻る。
    int16_Return = 0;     // OK終了 : 点滅動作が1回終了
    break;

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

  return(int16_Return);
}

  a) case 0: ではLEDを点灯します。

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

   時間が経過したとき、*puint8_JobNumがインクリメントされ、
   次の処理 case 2: に進みます。

  c) case 2: ではLEDを消灯し、case 3: に進みます。

  d) case 3: では時間待ちをします。
   時間が経過したら、処理番号を 0 にして、case 0:に戻ります。



 2) Det_USW
  User Switch の押下を検出します。

  Det_USW のフォルダに記述されています。

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

// 戻り値:
//   -1 : 検出なし
//    0 : 検出あり
//-----------------------------------------------------------
int16_t Det_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の状態を入力
    gpio_PinState = HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW);
    if(gpio_PinState == GPIO_PIN_SET){
      // Userスイッチは押されていない。
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : case 0: をループ
    }


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


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

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

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

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


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


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


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

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

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

    // 戻り値 :
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //------------------------------------------------------
    int16_Return = Wait_mSec_Seq_Multi(&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 == GPIO_PIN_SET){
      // Userスイッチは押されていない。
      *puint8_JobNum = 0;  // 処理番号初期化 : 先頭に戻る。 : case 0:
      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:  // チャタリング検出 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_mSec_Seq_Multi(&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 == GPIO_PIN_SET){
      // Userスイッチは押されていない。
      *puint8_JobNum = 0;  // 処理番号初期化 : 先頭に戻る。: case 0:
      int16_Return = -1;   // 処理継続
      break;
    }


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

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


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


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

  case 5:
    //--------------------------------------------------------------------
    // 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_mSec_Seq_Multi(&STC_uint8_JobNum_Wait,
                                       &STC_uint32_tikstart,
                                       STC_uint32_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間が経過していない。
      break;  // 処理番号維持 : 処理継続 : case 5: をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化 : 先頭の処理番号に戻す。 : case 0:
    int16_Return = 0;    // User Switch入力検出ありをセット
    break;

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

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

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



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

  Core/Src/main.c の void SystemClock_Config(void) の下に記述されています。

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

//---------------------------------------------------------
// LED点滅フラグ更新
//---------------------------------------------------------
// 引数:
// int16_t *pint16_Flag_Blk_LED : LED点滅フラグの変数のポインタ
//---------------------------------------------------------
void Renew_Flag_Blk_LED(int16_t *pint16_Flag_Blk_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点滅フラグ : 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;
    }

    GLB_int16_Restart_LED_Stat = 1;  // LED再起動フラグON
}

   a) 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点滅フラグ : 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
    GLB_int16_Restart_LED_Stat = 1;  // LED再起動フラグON
   ただちに、設定された点滅間隔で動作を開始します。



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




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

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

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