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


  STMicroelectronics社製の
 評価用基板、NUCLEO-F446RE と
 freeの開発ツール、STM32CubeIDE
 使用しています。
  えがおのでんし製の試験用基板 Base-N446RE を使用して動作を確認しています。

Base-N446RE-V1_Dim

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



目次

概要

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

PCとのUSB接続


サンプルプログラム N446RE_CDC の説明
 N446RE_CDC の構成
 N446RE_CDC の動作パラメータの定義
 ユーザープログラムの実行開始位置
 N446RE_CDC のmain()の説明
  1) 初期化の部分
  2) LED点滅 と CDC通信処理 の部分

 CDC通信処理 Communicate_CDC の説明

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

PCアプリケーション Access_UART
 サンプルプログラム N446RE_CDC を試験するためのPCアプリケーションです。



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

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

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



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

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



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

USB_SCH

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

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



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

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

N446RE_CDC_Scrn_First

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



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

N446RE_CDC_Tree

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

N446RE_CDC
  |
  |- Includes
  |
  |- Access_CDC_LED : LED点滅コマンド処理
  |    |- Access_CDC_LED.c
  |    |- Access_CDC_LED.h
  |
  |- Blink_LED_Stat : Status LED点滅処理
  |    |- Blink_LED_Stat.c
  |    |- Blink_LED_Stat.h
  |
  |- Commu_CDC : CDC通信処理
  |    |- Commu_CDC.c
  |    |- Commu_CDC.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
  |
  |- 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
  |
  |- N446RE_Config : 動作パラメータの定義
  |    |- Dev_Conf.h
  |
  |- 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
  |
  |- Wait_Itvl : 時間待ち処理
  |    |- Wait_Itvl.c
  |    |- Wait_Itvl.h
  |
  |- N446RE_CDC.launch
  |- STM32F446RETX_FLASH.ld
  |- STM32F446RETX_RAM.ld



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

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



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

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

N446RE_CDC_main

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

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



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


/**
  * @brief  The application entry point.
  * @retval int
  */
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 */

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


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

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

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    Communicate_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)
{
         .
         .
         .
}
 の、すぐ下に記述されています。


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


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

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

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

  Status LED点滅処理 Blk_LED_Stat と CDC通信処理 Communicate_CDC を呼び出しています。
  Communicate_CDC では、コマンドを受信して、コマンドの内容に応じて
 LEDの点滅時間変更を行います。



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

  LED点滅コマンドは以下の通りです。
LED1 B0%00 : 1000mSec 点灯 / 2000mSec 消灯
LED1 B1%00 : 100mSec 点灯 / 100mSec 消灯
LED1 B2%00 : 200mSec 点灯 / 200mSec 消灯
LED1 B3%00 : 300mSec 点灯 / 300mSec 消灯
LED1 B4%00 : 400mSec 点灯 / 400mSec 消灯
LED1 B5%00 : 500mSec 点灯 / 500mSec 消灯
  %00 は 0x00 を表します。

  Communicate_CDC は Commu_CDC/Commu_CDC.c 内にあります。

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


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

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

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//------------------------------------------------------------
int16_t Communicate_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_Communicate_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) 処理番号をインクリメントします。
    処理は、case 2: に移行します。

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

  b) 処理番号をインクリメントします。
    処理は、case 3: に移行します。

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

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

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

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



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

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

  フォルダ Access_CDCにUSBのCDCクラスのための処理モジュールがあります。
 他のサンプルプログラムで共通にモジュールを呼び出すために、
 ここからExecute_Command_CDCを呼び出すようにしています。


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


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


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



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

// Commu_CDC/Commu_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", 7) == 0)
     && (puint8_ReceiveData[7] == '\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", 7) == 0)
          && (puint8_ReceiveData[7] == '\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", 7) == 0)
          && (puint8_ReceiveData[7] == '\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", 7) == 0)
          && (puint8_ReceiveData[7] == '\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", 7) == 0)
          && (puint8_ReceiveData[7] == '\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", 7) == 0)
          && (puint8_ReceiveData[7] == '\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アプリケーション Access_UART
  サンプルプログラム N446RE_CDC を試験するためのPCアプリケーションです。

 PCアプリケーション Access_UART の説明 をご覧ください。



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




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

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

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