サンプルプログラム G431KB_CDC の説明
マスコット
  USBのCDCクラス
 (Communication Device Class)を使用して、
 VCP(仮想COMポート)による、
 非同期シリアル通信を行うプログラムです。


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


目次

概要

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

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

PCとのUSB接続


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

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

 G431KB_CDC のmain()の説明
  1) 初期化の部分
  2) LED点滅 と CDC通信処理 の部分

 CDC通信処理 Communication_CDC の説明

 モジュール Execute_Command_LED について

VCPドライバのインストール
  USBのCDC通信を行うためには、
 STMicroelectronics社が提供するVCP(仮想COMポート)ドライバを
 PCにインストールする必要があります。

コマンド送信について



概要
  サンプルプログラム G431KB_CDCは
 USBのCDCクラス(Communication Device Class)を使用して、
 非同期シリアル通信を行います。

  PCからデータを受信すると、データを判定してLED点滅コマンドなら、
 指定に従って点滅間隔を変更します。

  また、受信したデータをエコーバックします。



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

Base-N431KB-V2

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



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

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

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

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

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



PCとのUSB接続
  USBコネクタ部の回路を以下に示します。

USB_SCH

  これは、えがおのでんし製の試験基板 Base-N431KB に搭載されている
 USBコネクタ USB-1 部分の回路です。
  USBコネクタには Mini-B を使用しています。

  PCとBase-N431KBのUSB-1とを、USBケーブル(A - Mini B)で接続します。



サンプルプログラム G431KB_CDC の説明
  STM32G431KBのCDC通信を行うプログラムです。
  PCが送信したコマンドを受信して、コマンドに応じてLEDの点滅間隔を変化させます。

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

G431KB_CDC_Scrn_First

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



サンプルプログラムの構成
  STM32CubeIDEの画面左側、Project Explorerの
 G431KB_CDCを展開した画面は以下のようになります。

G431KB_CDC_Tree

  サンプルプログラム G431KB_CDC の構成を以下に示します。

G431KB_CDC
  |
  |- Includes
  |
  |- CDC_Ope
  |    |- Communication_CDC : CDC通信処理
  |    |    |- Communication_CDC.c
  |    |    |- Communication_CDC.h
  |    |
  |    |- Execute_Command_LED : LED点滅コマンド処理
  |    |    |- Execute_Command_LED.c
  |    |    |- Execute_Command_LED.h
  |    |
  |    |- G431KB_CDC_Config : 動作パラメータの定義
  |         |- Dev_Conf.h
  |
  |
  |- C_Lib
  |    |- User_IF_Lib
  |    |    |- Blink_LED_Status : Status LED点滅処理
  |    |         |- Blink_LED_Status.c
  |    |         |- Blink_LED_Status.h
  |    |
  |    |- Wait_Interval : 時間待ち処理
  |         |- Wait_Interval.c
  |         |- Wait_Interval.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
  |
  |- Middlewares
  |    |- ST
  |        |
  |        |- STM32_USB_Device_Library
  |              |- Class
  |              |    |- CDC
  |              |        |- Inc
  |              |        |   |- usbd_cdc.h
  |              |        |
  |              |        |- Src
  |              |            |- usbd_cdc.c
  |              |
  |              |
  |              |- Core
  |                  |- Inc
  |                  |   |- usbd_core.h
  |                  |   |- usbd_ctrreq.h
  |                  |   |- usbd_def.h
  |                  |   |- usbd_ioreq.h
  |                  |
  |                  |- Src
  |                      |- usbd_core.c
  |                      |- usbd_ctrreq.c
  |                      |- usbd_ioreq.c
  |
  |- USB_Device
  |    |- App
  |    |   |- usb_device.c
  |    |   |- usb_device.h
  |    |   |- usbd_cdc_if.c
  |    |   |- usbd_cdc_if.h
  |    |   |- usbd_desc.c
  |    |   |- usbd_desc.h
  |    |
  |    |- Target
  |        |- usbd_conf.c
  |        |- usbd_conf.h
  |
  |- G431KB_CDC.launch
  |- STM32G431KBTX_FLASH.ld



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

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



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

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

G431KB_CDC_main

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

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



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



int main(void)
{
  /* USER CODE BEGIN 1 */

  uint8_t uint8_JobNum_LED = 0;
  uint8_t uint8_JobNum_CDC = 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();
  MX_USB_Device_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);


    //------------------------------------------------------------
    // CDC通信処理
    //------------------------------------------------------------
    // 処理内容 :

    // 1. CDCの初期化がされていない場合、初期化します。
    // 2. 受信が発生するのを待ち、受信データを取得します。
    // 3. 受信データを判定して、内容に従い処理を行います。
    // 4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
    //------------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    Communication_CDC(&uint8_JobNum_CDC);
  }
  /* 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点滅 と CDC通信処理 の部分
   永久ループ部分の記述を以下に示します。


  /* 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);


    //------------------------------------------------------------
    // CDC通信処理
    //------------------------------------------------------------
    // 処理内容 :

    // 1. CDCの初期化がされていない場合、初期化します。
    // 2. 受信が発生するのを待ち、受信データを取得します。
    // 3. 受信データを判定して、内容に従い処理を行います。
    // 4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
    //------------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

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

  Status LED点滅処理 Blink_LED_Status と
  CDC通信処理 Communication_CDC を
 呼び出しています。

  Communication_CDC では、コマンドを受信して、コマンドの内容に応じて
 LEDの点滅時間変更を行います。

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



 CDC通信処理 Communication_CDC の説明
  データを受信して、LED点滅コマンドの場合、コマンドの内容に応じて、
 LEDの点滅間隔を変更します。
  受信したデータはエコーバックされます。

  LED点滅コマンドは以下の通りです。
LED1 B0\r\n : 1000mSec 点灯 / 2000mSec 消灯
LED1 B1\r\n : 100mSec 点灯 / 100mSec 消灯
LED1 B2\r\n : 200mSec 点灯 / 200mSec 消灯
LED1 B3\r\n : 300mSec 点灯 / 300mSec 消灯
LED1 B4\r\n : 400mSec 点灯 / 400mSec 消灯
LED1 B5\r\n : 500mSec 点灯 / 500mSec 消灯
  \r : CR : 0x0D
  \n : LF : 0x0A
 です。

  Communication_CDC は
 CDC_Ope/Communication_CDC/Communication_CDC.c 内にあります。

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


//------------------------------------------------------------
// CDC通信処理
//------------------------------------------------------------
// 処理内容 :

//  1. CDCの初期化がされていない場合、初期化します。
//  2. 受信が発生するのを待ち、受信データを取得します。
//  3. 受信データを判定して、内容に従い処理を行います。
//  4. 受信データによる処理の結果、送信データがセットされた場合、送信処理を行います。
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//------------------------------------------------------------
int16_t Communication_CDC(uint8_t *puint8_JobNum)
{
  static uint8_t STC_uint8_JobNum_CDC;

  int16_t int16_ReceiveLength;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    //-----------------------------------
    // 初期化フラグの判定
    //-----------------------------------
    if(GLB_int16_vCDC_Initialize <= 0){
      //---------------------------------------------------
      // 初期化済みでない場合、CDC通信パラメータ初期化 と CDC初期化を行います。
      //---------------------------------------------------
      Initialize_Communication_CDC();

      GLB_int16_vCDC_Initialize = 1;  // CDC初期化フラグON
    }

    GLB_uint16_vCDC_SendLength = 0;  // 送信データ長クリア

    STC_uint8_JobNum_CDC = 0;  // CDC通信処理番号初期化

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

  case 1:
    //--------------------------------------------------
    // CDCによるVCP受信処理
    //--------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // 戻り値:
    //   -1 : 受信なし
    //    0 : 受信なし
    //    1以上 : 受信byte数 : 受信終了
    //--------------------------------------------------
    int16_ReceiveLength = Receive_CDC(&STC_uint8_JobNum_CDC);
    if(int16_ReceiveLength <= 0){
      // 受信なしの場合
      int16_Return = -1;  // 処理継続
      break;  // 処理番号維持 : case 1: を繰り返し実行します。
    }
    //---------------------------------------------------
    // 受信を行うまで、この下に行きません。
    //---------------------------------------------------


    //-----------------------------------------------------------------
    // 受信コマンドを実行する。
    //-----------------------------------------------------------------
    // 引数 :
    // uint16_t uint16_ReceiveLength : 受信データ数
    // uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
    // uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ

    // 戻り値 : 応答送信データ数
    //-----------------------------------------------------------------
    GLB_uint16_vCDC_SendLength = Execute_Command_CDC((uint16_t)int16_ReceiveLength,
                                                    GLB_uint8_CDC_ReceiveData,
                                                    GLB_uint8_CDC_SendData);

    if(GLB_uint16_vCDC_SendLength == 0){
      //----------------------------------
      // 送信データなしの場合
      //----------------------------------
      *puint8_JobNum = 0;  // 処理番号初期化
      int16_Return = 0;    // OK終了
      break;
    }


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

  case 2:
    //-------------------------------------------------------
    // CDC送信セマフォチェック : 他のモジュールでCDC送信を実行していないかをチェックします。
    //-------------------------------------------------------
    if(GLB_int16_vSemaphore_CDC_Send != 0){
      // 使用中
      int16_Return = -1;  // 処理中
      break;  // 処理番号維持 : case 2: を繰り返し実行します。
    }
    //----------------------------------------------------
    // 他のモジュールが GLB_int16_vSemaphore_CDC_Send を開放するまで
    // この下に行きません。
    //----------------------------------------------------


    GLB_int16_vSemaphore_CDC_Send = 1;  // CDC送信セマフォ取得


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

  case 3:
    //-----------------------------------------------------------------
    // CDCによるVCP送信処理
    //-----------------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint16_t uint16_SendLength : 送信データ数
    // uint8_t *puint8_SendData : 送信データが格納されているBufferのポインタ

    // 戻り値:
    //   -1 : 送信中
    //    0 : 送信終了 : OK
    //    1 : エラー
    //-----------------------------------------------------------------
    int16_Return = Send_CDC(&STC_uint8_JobNum_CDC,
                            GLB_uint16_vCDC_SendLength, GLB_uint8_CDC_SendData);
    if(int16_Return == -1){
      // 送信中
      break;  // 処理番号維持 : 処理継続 : case 3: を繰り返し実行します。
    }
    //----------------------------------------------
    // 送信が終了するまで、この下に行きません。
    //----------------------------------------------


    GLB_uint16_vCDC_SendLength = 0;  // 送信データ長クリア

    GLB_int16_vSemaphore_CDC_Send = 0;  // CDC送信セマフォ解放


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 処理結果
    // 処理終了
    break;

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

  return(int16_Return);
}

 1) case 0:
   初期化の判定フラグ GLB_int16_vCDC_Initialize を判定して
  0 の場合、CDC の初期化を行います。

 2) case 1:
   CDC の受信処理を行います。
   受信が発生して、1回の受信が終了するまで、case 1: をループします。

  a) 1回の受信が終了した場合、
   受信データは GLB_uint8_CDC_ReceiveData にセットされています。

  b) 受信コマンド実行 Execute_Command_CDC に
   GLB_uint8_CDC_ReceiveData を渡して実行します。
   受信コマンド実行結果に伴う送信データは
  GLB_uint8_CDC_SendData にセットされます。

  c) Execute_Command_CDC を実行した結果、送信データなしの場合は
   処理番号を 0 にセットして、case 0: の処理に移行します。

  d) Execute_Command_CDC を実行した結果、送信データありの場合、
   処理番号をインクリメントします。
    処理は、case 2: に移行します。

 3) case 2:
  a) CDC送信セマフォチェックを行います。
   他のモジュールがCDC送信を実行していないかチェックます。

    実行している場合は、case 2: をループします。
    実行していなければセマフォを取得します。

  b) セマフォを取得したら、処理番号をインクリメントします。
    処理は、case 3: に移行します。

 4) case 3:
   CDCによるVCP送信処理 Send_CDC を実行して、
  GLB_uint8_CDC_SendData のデータを送信します。

  a) 送信が終了するまで、case 3: をループします。

  b) 送信が終了すると、処理番号を 0 に初期化して終了します。

  Communication_CDC は再び、処理番号 0 : case 0: から実行されます。



 モジュール Execute_Command_LED について

  モジュール Execute_Command_LED は、
 Execute_Command_LED/Execute_Command_LED.c 内にあるモジュール、
 Execute_Command_CDCから呼び出されています。

  サンプルプログラム G431KB_CDC では、PCからの受信があった場合、
 Execute_Command_CDC という名称で受信処理モジュールを
 呼び出すようにしています。

  フォルダ Communication_CDCにUSBのCDCクラスのための
 処理モジュール Execute_Command_CDC があります。

 他のサンプルプログラムで共通にモジュールを呼び出すために、
 ここからExecute_Command_CDCを呼び出すようにしています。


  Execute_Command_CDC 内に直接、処理を記述しても構いませんが、
 このサンプルプログラムでは、以下のようにして最終的な処理モジュール
 Execute_Command_LED を呼び出すようにしています。


  以下に、モジュールExecute_Command_CDCのコードを示します。


//-----------------------------------------------------------------------
// uint16_t Execute_Command_CDC は、CDC通信の受信が発生した場合、
// Communication_CDC/Communication_CDC.c 内の
// CDC通信処理 int16_t Communication_CDC の処理により呼び出されます。
//-----------------------------------------------------------------------
// 引数の uint8_t *puint8_SendData にデータをセットして、
// 戻り値に送信データ数を返すと、
// CDC通信処理 int16_t Communication_CDC の処理によりそのデータが送信されます。
//-----------------------------------------------------------------------



//-----------------------------------------------------------------------
// __weak が先頭に付いていない
// uint16_t Execute_Command_CDC の記述がない場合は、

// Communication_CDC/Communication_CDC.c 内の
// __weak uint16_t Execute_Command_CDC
// を実行します。
//-----------------------------------------------------------------------
// __weak が先頭に付いていない
// uint16_t Execute_Command_CDC の記述が他にある場合は、そちらを実行します。
//-----------------------------------------------------------------------
// よって、この例の場合は、下記の uint16_t Execute_Command_CDC を実行します。
//-----------------------------------------------------------------------


//----------------------------------------------------------------------
// 受信コマンドを実行する。
//----------------------------------------------------------------------
// 引数:
// uint16_t uint16_ReceiveLength : 受信データ数
// uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ

// 戻り値:応答送信データ数
//----------------------------------------------------------------------
uint16_t Execute_Command_CDC(uint16_t uint16_ReceiveLength,
                             uint8_t *puint8_ReceiveData,
                             uint8_t *puint8_SendData)
{
  uint16_t uint16_SendLength = 0;


  //----------------------------------------------------------------------
  // Command処理
  //----------------------------------------------------------------------
  //----------------------------------------------------------------------
  // 受信コマンドを実行する。 : LED点滅
  //----------------------------------------------------------------------
  // 引数:
  // uint16_t uint16_ReceiveLength : 受信データ数
  // uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
  // uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ

  // 戻り値:応答送信データ数
  //----------------------------------------------------------------------
  uint16_SendLength = Execute_Command_LED(uint16_ReceiveLength,
                                          puint8_ReceiveData,
                                          puint8_SendData);

  return(uint16_SendLength);
}



//----------------------------------------------------------------------
// 受信コマンドを実行する。 : LED点滅
//----------------------------------------------------------------------
// 引数:
// uint16_t uint16_ReceiveLength : 受信データ数
// uint8_t *puint8_ReceiveData : 受信データが格納されているBufferのポインタ
// uint8_t *puint8_SendData : 応答送信データを格納するBufferのポインタ

// 戻り値:応答送信データ数
//----------------------------------------------------------------------
uint16_t Execute_Command_LED(uint16_t uint16_ReceiveLength,
                             uint8_t *puint8_ReceiveData,
                             uint8_t *puint8_SendData)
{
  uint16_t uint16_I;
  uint16_t uint16_SendLength = 0;


  //----------------------------------------------------------------------
  // Command処理
  //----------------------------------------------------------------------

  //------------------------------------------------------------------
  // LED1(緑) 点滅間隔切り替え
  //------------------------------------------------------------------
  if(memcmp(puint8_ReceiveData, "LED1 B0\r\n", 9) == 0){
    // LED1(緑) : 点灯1000mSec / 消灯2000mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)1000;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)2000;

    GLB_int16_Restart_LED_Stat = 1;  // Status LED再起動フラグON
  }
  else if(memcmp(puint8_ReceiveData, "LED1 B1\r\n", 9) == 0){
    // LED1(緑) : 点灯100mSec / 消灯100mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)100;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)100;

    GLB_int16_Restart_LED_Stat = 1;  // Status LED再起動フラグON
  }
  else if(memcmp(puint8_ReceiveData, "LED1 B2\r\n", 9) == 0){
    // LED1(緑) : 点灯200mSec / 消灯200mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)200;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)200;

    GLB_int16_Restart_LED_Stat = 1;  // Status LED再起動フラグON
  }
  else if(memcmp(puint8_ReceiveData, "LED1 B3\r\n", 9) == 0){
    // LED1(緑) : 点灯300mSec / 消灯300mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)300;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)300;

    GLB_int16_Restart_LED_Stat = 1;  // Status LED再起動フラグON
  }
  else if(memcmp(puint8_ReceiveData, "LED1 B4\r\n", 9) == 0){
    // LED1(緑) : 点灯400mSec / 消灯400mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)400;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)400;

    GLB_int16_Restart_LED_Stat = 1;  // Status LED再起動フラグON
  }
  else if(memcmp(puint8_ReceiveData, "LED1 B5\r\n", 9) == 0){
    // LED1(緑) : 点灯500mSec / 消灯500mSec
    GLB_uint16_Time_LED_Stat_ON = (uint16_t)500;
    GLB_uint16_Time_LED_Stat_OFF = (uint16_t)500;

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


  // エコーバック
  for(uint16_I = 0; uint16_I < uint16_ReceiveLength; uint16_I++){
    puint8_SendData[uint16_I] = puint8_ReceiveData[uint16_I];
  }

  uint16_SendLength = uint16_ReceiveLength;

  return(uint16_SendLength);
}


VCPドライバのインストール
  USBのCDC通信を行うためには、
 STMicroelectronics社が提供するVCP(仮想COMポート)ドライバを
 PCにインストールする必要があります。

  開発ツールの STM32CubeIDE をインストールするときに、
 VCPドライバもインストールされます。

  もし、個別にVCPドライバをインストールする必要がある場合は、
 以下の要領でドライバを入手してインストールします。

 1) STMicroelectronics社のサイトにアクセスして、
  STM32 Virtual COM Port Driver の STSW-STM32102 をダウロードします。

   現在のバージョンは、1.5.0 です。
   en.stsw-stm32102_v1.5.0.zip がダウンロードされます。

 2) en.stsw-stm32102_v1.5.0.zip を解凍します。
  解凍されたファイルの中の VCP_V1.5.0_Setup_W7_x64_64bits.exe を実行して、
  VCPドライバをインストールします。



 コマンド送信について
  PCからBase-N431KB基板に搭載されているNUCLEO-G431KB基板にコマンド送信を
 行うために、Tera Termを使用しました。

  Tera Termのファイル送信により、コマンドを送信します。

  例えば、Textファイルに LED1 B1<改行> を記述し、
 Tera Termの端末の設定で、改行コードの送信に CR+LF を指定して、
 ファイル送信します。



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




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

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

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