サンプルプログラム F4xxxx_UART1 の説明
マスコット   UART(非同期シリアル通信)の
 サンプルプログラムです。

  STM32F4xxxx の USART1 を使用して、
 UARTの送受信を行うプログラムです。


  F4xxxx は、
  F405RG, F405VG, F446RE のいずれかです。

  それぞれの種類に応じて、F4xxxx の部分を読み代えてください。
  プログラムの内容は共通です。

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



UART(非同期シリアル通信)について
 以下のページでUARTについて簡単に説明しています。
 UART(非同期シリアル通信) の説明 をご覧ください。



目次

えがおのでんし製の評価用Base基板 Base-F4xxxx の説明
 1. Base-F405RG基板 の説明
 2. Base-F405VG基板 の説明
 3. Base-F446RE基板 の説明

えがおのでんし製の評価用IF基板 IF-F4xxxx-UART の説明
 1. IF-F4xxxx-UART-CMOS基板 の説明
 2. IF-F4xxxx-UART-RS232C基板 の説明

サンプルプログラム F4xxxx_UART1 のプロジェクト
 1. サンプルプログラム F405RG_UART1 のプロジェクト
 2. サンプルプログラム F405VG_UART1 のプロジェクト
 3. サンプルプログラム F446RE_UART1 のプロジェクト

 既存のプロジェクトを開く

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

 UARTx通信試験 Communication_Test_UARTx の説明

コマンド送信について



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


 1. Base-F405RG基板 の説明
Base_F405RG_Dim

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


 2. Base-F405VG基板 の説明
Base_F405VG_Dim

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


 3. Base-F446RE基板 の説明
Base_F446RE_Dim

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



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


 1. IF-F4xxxx-UART-CMOS基板 の説明
IF_F4xxxx_UART_CMOS_Dim

  IF-F4xxxx-UART-CMOS基板については、
 IF_F4xxxx_UART_CMOS基板 の説明 をご覧ください。


 2. IF-F4xxxx-UART-RS232C基板 の説明
IF_F4xxxx_UART_RS232C_Dim

  IF-F4xxxx-UART-RS232C基板については、
 IF_F4xxxx_UART_RS232C基板 の説明 をご覧ください。



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


1. サンプルプログラム F405RG_UART1 のプロジェクト
 ここからサンプルプログラム L_F405RG_UART1.zip をダウンロードしてください。

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

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


2. サンプルプログラム F405VG_UART1 のプロジェクト
 ここからサンプルプログラム L_F405VG_UART1.zip をダウンロードしてください。

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

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


3. サンプルプログラム F446RE_UART1 のプロジェクト
 ここからサンプルプログラム L_F446RE_UART1.zip をダウンロードしてください。

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

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



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



サンプルプログラム F4xxxx_UART1 の説明
  STM32F4xxxxのUSART1を使用してUART(非同期シリアル通信)の送受信を行うプログラムです。
  PCが送信したコマンドを受信して、コマンドに応じてLEDの点滅間隔を変化させます。
  受信データはエコーバックされます。

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

F405RG_UART1_Scrn_First

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



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

F405RG_UART1_Tree

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

F4xxxx_UART1
  |- Includes
  |
  |- 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
  |
  |- Periph_Lib : 周辺インターフェースのハンドラ
  |    |- H_Common_STM32F4 : 共通ハンドラ
  |    |    |- H_Common_STM32F4_UART : UARTの共通ハンドラ
  |    |         |- H_Common_STM32F4_UART.c
  |    |         |- H_Common_STM32F4_UART.h
  |    |
  |    |- H_STM32F4_UART_1 : UART1のハンドラ
  |         |- H_STM32F4_UART_1.c
  |         |- H_STM32F4_UART_1.h
  |
  |- Shared_Lib : 共有ライブラリ
  |    |- Handle_UI_Lib : ユーザーインターフェースのライブラリ
  |    |    |- Blink_LED_ST : ST LED点滅処理
  |    |         |-Blink_LED_ST.c
  |    |         |-Blink_LED_ST.h
  |    |
  |    |- Time_Interval : 時間待ち処理
  |         |- Time_Interval.c
  |         |- Time_Interval.h
  |
  |- UART1_Ope : UART1の操作
  |    |- Communication_Test_UARTx : UART通信試験
  |    |    |-Communication_Test_UARTx.c
  |    |    |-Communication_Test_UARTx.h
  |    |
  |    |- Execute_Command_LED : 受信したLEDコマンドの実行
  |    |    |-Execute_Command_LED.c
  |    |    |-Execute_Command_LED.h
  |    |
  |    |- F4xxxx_UART1_Config : 動作パラメータの定義
  |         |- Dev_Conf.h
  |
  |- F4xxxx_UART1.launch
  |- STM32F4xxxxTX_FLASH.ld
  |- STM32F4xxxxTX_RAM.ld



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

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



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

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

F405RG_UART1_main

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

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



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


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

  /* USER CODE BEGIN 1 */

  //-----------------------------------------------------------------
  // main関数内では、以下の処理番号の変数、
  // STC_uint8_JobNum_LED と
  // STC_uint8_JobNum_UART は

  // while(1){
  // }

  // の永久ループ内で使用しているので、
  // static宣言をする必要はない。

  // しかし、main関数以外の全ての関数内では
  // 処理番号をstatic宣言をする必要があるので、
  // 合わせるために、ここでも static宣言をしている。
  //-----------------------------------------------------------------
  static uint8_t STC_uint8_JobNum_LED;   // LED点滅処理番号
  static uint8_t STC_uint8_JobNum_UART;  // UART通信処理番号


  //------------------------------------------------------------
  // 呼び出す関数を case 0: から実行させるために
  // 処理番号に 0 をセットします。
  //------------------------------------------------------------
  STC_uint8_JobNum_LED = 0;   // LED点滅処理番号初期化
  STC_uint8_JobNum_UART = 0;  // UART通信処理番号初期化

  /* USER CODE END 1 */

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

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

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

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

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);



    //------------------------------------------------------------
    // UARTx通信試験
    //------------------------------------------------------------
    // 処理内容:

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

    // USART_TypeDef* USARTx :
    //    where x can be 1, 2, 3, 4, 5 or 6
    //    to select the USART or UART peripheral.

    // UART_HandleTypeDef *pHandle_UARTx :
    //  pointer to a UART_HandleTypeDef structure that contains
    //  the configuration information
    //                      for the specified UART module.

    // uint8_t *puint8_aTx_Buffer : 送信Bufferのポインタ
    // uint8_t *puint8_aRx_Buffer : 受信Bufferのポインタ

    //  uint8_t *puint8_aReceiveData_UART :
    //              UART通信処理用 受信データBufferのポインタ

    // volatile uint16_t uint16_vTx_Transfer : 送信Bufferサイズ
    // volatile uint16_t uint16_vRx_Receive : 受信Bufferサイズ

    // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
    //              Handle UART用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    Communication_Test_UARTx(&STC_uint8_JobNum_UART,
                             USART1,
                             &Handle_UART1,
                             GLB_uint8_aTx1_Buffer,
                             GLB_uint8_aRx1_Buffer,
                             GLB_uint8_aReceiveData_UART1,
                             (volatile uint16_t)def_Tx1_BufferSize,
                             (volatile uint16_t)def_Rx1_BufferSize,
                             &GLB_structParam_Handle_UART1);
  }
  /* 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点滅 と UARTx通信試験 の部分
   永久ループ部分の記述を以下に示します。


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

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

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);



    //------------------------------------------------------------
    // UARTx通信試験
    //------------------------------------------------------------
    // 処理内容:

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

    // USART_TypeDef* USARTx :
    //    where x can be 1, 2, 3, 4, 5 or 6
    //    to select the USART or UART peripheral.

    // UART_HandleTypeDef *pHandle_UARTx :
    //  pointer to a UART_HandleTypeDef structure that contains
    //  the configuration information
    //                      for the specified UART module.

    // uint8_t *puint8_aTx_Buffer : 送信Bufferのポインタ
    // uint8_t *puint8_aRx_Buffer : 受信Bufferのポインタ

    //  uint8_t *puint8_aReceiveData_UART :
    //              UART通信処理用 受信データBufferのポインタ

    // volatile uint16_t uint16_vTx_Transfer : 送信Bufferサイズ
    // volatile uint16_t uint16_vRx_Receive : 受信Bufferサイズ

    // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
    //              Handle UART用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    Communication_Test_UARTx(&STC_uint8_JobNum_UART,
                             USART1,
                             &Handle_UART1,
                             GLB_uint8_aTx1_Buffer,
                             GLB_uint8_aRx1_Buffer,
                             GLB_uint8_aReceiveData_UART1,
                             (volatile uint16_t)def_Tx1_BufferSize,
                             (volatile uint16_t)def_Rx1_BufferSize,
                             &GLB_structParam_Handle_UART1);
  }
  /* USER CODE END 3 */

  ST LED点滅処理 Blink_LED_ST と
  UARTx通信試験処理 Communication_Test_UARTx を呼び出しています。
  Communication_Test_UARTx では、コマンドを受信し、コマンドの内容に応じて
 LEDの点滅時間変更を行います。



 UARTx通信試験 Communication_Test_UARTx の説明
  データを受信して、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\n は 0x0D 0x0A を表します。


  以下に、Communication_Test_UARTx のコードを示します。
//----------------------------------------------------------
// UARTx通信試験
//----------------------------------------------------------
// 処理内容:

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

// USART_TypeDef* USARTx :
//    where x can be 1, 2, 3, 4, 5 or 6
//    to select the USART or UART peripheral.

// UART_HandleTypeDef *pHandle_UARTx :
//  pointer to a UART_HandleTypeDef structure that contains
//  the configuration information
//                      for the specified UART module.

// uint8_t *puint8_aTx_Buffer : 送信Bufferのポインタ
// uint8_t *puint8_aRx_Buffer : 受信Bufferのポインタ

//  uint8_t *puint8_aReceiveData_UART :
//              UART通信処理用 受信データBufferのポインタ

// volatile uint16_t uint16_vTx_Transfer : 送信Bufferサイズ
// volatile uint16_t uint16_vRx_Receive : 受信Bufferサイズ

// struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
//              Handle UART用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Communication_Test_UARTx(uint8_t *puint8_JobNum,
                        USART_TypeDef* USARTx,
                        UART_HandleTypeDef *pHandle_UARTx,
                        uint8_t *puint8_aTx_Buffer,
                        uint8_t *puint8_aRx_Buffer,
                        uint8_t *puint8_aReceiveData_UART,
                        volatile uint16_t uint16_vTx_Transfer,
                        volatile uint16_t uint16_vRx_Receive,
        struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_UART;  // UART処理番号


  int16_t int16_ReceiveLength;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    //--------------------------------------------------
    // 1回だけ case 0: を実行します。

    // その後は、case 1: ~ case 3: をループします。
    //--------------------------------------------------


    //----------------------------------------------------------
    // Handle UARTx用パラメータの構造体を初期化
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_aTx_Buffer : 送信Bufferのポインタ
    // uint8_t *puint8_aRx_Buffer : 受信Bufferのポインタ

    //  uint8_t *puint8_aReceiveData_UART :
    //                      UART通信処理用 受信データBuffer

    // volatile uint16_t uint16_vTx_Transfer : 送信Bufferサイズ
    // volatile uint16_t uint16_vRx_Receive : 受信Bufferサイズ

    // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
    //              Handle UART用パラメータの構造体のポインタ


    // 戻り値:
    //    なし
    //----------------------------------------------------------
    Initialize_Parameter_UARTx(puint8_aTx_Buffer,
                               puint8_aRx_Buffer,
                               puint8_aReceiveData_UART,
                               uint16_vTx_Transfer,
                               uint16_vRx_Receive,
                               pstructParam_Handle_UARTx);


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    if(pstructParam_Handle_UARTx->int16_vUART_InitDone == 0){
      //--------------------------------------------------------
      // UARTx通信パラメータ初期化
      //--------------------------------------------------------
      // 引数:
      // USART_TypeDef* USARTx :
      //    where x can be 1, 2, 3, 4, 5 or 6
      //    to select the USART or UART peripheral.

      // UART_HandleTypeDef *pHandle_UARTx :
      //  pointer to a UART_HandleTypeDef structure that contains
      //  the configuration information
      //                      for the specified UART module.

      // uint32_t uint32_BaudRate : 通信速度

      // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
      //              Handle UART用パラメータの構造体のポインタ


      // 戻り値:
      //    0 : OK
      //    1 : NG
      //--------------------------------------------------------
      Initialize_Communication_UARTx(USARTx,
                                     pHandle_UARTx,
                                     (uint32_t)115200,
                                     pstructParam_Handle_UARTx);
    }


    STC_uint8_JobNum_UART = 0;  // UART処理番号初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // UARTx 受信処理
    //----------------------------------------------------------
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint8_t *puint8_aReceiveBuffer :
    //                      受信データを格納するBufferのポインタ

    // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
    //              Handle UART用パラメータの構造体のポインタ


    // 戻り値:
    //    -2 : エラー発生
    //    -1 : 受信なし
    //     0 : 受信なし
    // 1以上 : 受信byte数
    //----------------------------------------------------------
    int16_ReceiveLength = Receive_UARTx(&STC_uint8_JobNum_UART,
                                        puint8_aReceiveData_UART,
                                        pstructParam_Handle_UARTx);
    if(int16_ReceiveLength <= 0){
      if(int16_ReceiveLength ==  -2){
        //--------------------------
        // エラー発生
        //--------------------------
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = -2;   // エラー発生
        break;  // エラー終了
      }

      //-------------------
      // 受信なし
      //-------------------
      int16_Return = -1;  // 処理継続 : 現在の処理番号をループ
      break;  // 処理番号維持
    }


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

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:応答送信データ数
    //----------------------------------------------------------
    pstructParam_Handle_UARTx->uint16_vTx_Transfer
        = Execute_Command_LED((uint16_t)int16_ReceiveLength,
                              puint8_aReceiveData_UART,
                    pstructParam_Handle_UARTx->puint8_aTx_Buffer,
                              &GLB_structParam_Blink_LED_ST);


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    // 応答データ送信
    //----------------------------------------------------------
    // UARTx 送信処理
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // UART_HandleTypeDef *pHandle_UARTx :
    //  pointer to a UART_HandleTypeDef structure that contains
    //  the configuration information
    //                      for the specified UART module.

    // struct sParam_Handle_UARTx  *pstructParam_Handle_UARTx :
    //              Handle UART用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : 送信終了
    //    1 : エラー
    //----------------------------------------------------------
    int16_Return = Send_UARTx(&STC_uint8_JobNum_UART,
                              pHandle_UARTx,
                              pstructParam_Handle_UARTx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    *puint8_JobNum = 1;  // 処理番号 1 に移行する。: case 1:
                         // case 1: ~ case 3: をループ
    // int16_Return : 結果
    break;

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

  return(int16_Return);
}

  以下に、Communication_Test_UARTx モジュールの説明を記します。

 1) case 0:
  a) Handle UARTx用パラメータの構造体を初期化します。

  b) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 1: にします。

 2) case 1:
  a) 初期化済みのフラグ pstructParam_Handle_UARTx->int16_vUART_InitDone を判定して
   0 の場合、UARTx の初期化を行います。

  b) UART処理番号を初期化します。

  b) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 2: にします。

 3) case 2:
  a) UARTx の受信処理を行います。

   i) エラーが発生した場合は、処理番号を 0 にして、エラー終了します。
     次にモジュールが呼び出されると、
    Communication_Test_UARTx は、case 0: から処理を実行します。

   ii) 受信がない場合、break します。
    *puint8_JobNumが 2 のまま抜けるので、次にモジュールが呼び出されると
    再び case 2: が実行されます。
    受信があるまで、case 2: を繰り返し実行します。
    受信があった場合、以下の処理を実行します。

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

  c) 受信コマンド実行 Execute_Command_LED に
   puint8_aReceiveData_UART を渡して実行します。

    受信コマンド実行結果に伴う送信データは
   pstructParam_Handle_UARTx->puint8_aTx_Buffer にセットされます。

  d) 処理番号 *puint8_JobNum をインクリメントして、次に実行する処理を case 3: にします。

 4) case 3:
  a) UARTx 送信処理 Send_UARTx を実行して、
   pstructParam_Handle_UARTx->puint8_aTx_Buffer のデータを送信します。

   i) 処理中の場合、break します。
    *puint8_JobNumが 3 のまま抜けるので、次にモジュールが呼び出されると
    再び case 3: が実行されます。
    処理中の間、case 2: を繰り返し実行します。
    処理中でなくなった場合、以下の処理を実行します。

  b) 処理番号に 1 をセットします。
   戻り値には処理結果がセットされます。

   Communication_Test_UARTx は再び、次に呼び出されると
  処理番号 1 : case 1: から実行されます。


   この後、プログラムは case 1: ~ case 3: を繰り返し実行します。



 コマンド送信について
  PCからBase-F4xxxx基板にコマンド送信を行うために、Tera Termを使用しました。

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

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



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




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

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

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