Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

ModusToolbox 2.0 を使用した PSoC 6 MCU の基本的な DFU アプリケーションの設定方法 - Community Translated (JA)

ModusToolbox 2.0 を使用した PSoC 6 MCU の基本的な DFU アプリケーションの設定方法 - Community Translated (JA)

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

Community Translated by  MoTa_728816          Version: **

このドキュメントは者が ModusToolbox™ の使用方法と デバイスファムウェアアップデ (DFU) についての知識があることを前提としています。以降は ModusToolbox 2.0 を使用して PSoC® 6 MCU の基本的な DFU とロダブルアプリケションを設定してビルドする手順です。使用する基板は CY8CKIT-062-WIFI-BT DVK で通信プロトコルには I2C を使用します。詳細についてはキットのガイドをご照ください。デバイスファムウェアアップデトのプロセスにする詳細についてAN213924 - PSoC 6 MCU Device Firmware Update Software Development Kit Guide をご照ください

注意:使用する基板のデバッガが KitProg3 になっていることをご確認ください。もしお使いの基板のデバッガが KitProg2 の場合、KitProg2 KitProg3 にアップデトする方法については KitProg3 User Guide Chapter 6 をご照ください

ステップ 1: プロジェクトの準

  1. CY8CKIT-WIFI-BT 用のプロジェクトを “Hello_World” アプリケションを使用して作成して

  “DFU_App0_I2C” という名前にしてください。これは DFU のロアプリケションとして使用します

 2. にして DFU ダブルアプリケションを作成して、“DFU_App1_Hello_World” という名前にしてください

 3. ModusToolbox Library Manager を使用して、それぞれのプロジェクトに DFU ミドルウェアを追加してください

  ライブラリを追加するのには、タゲットプロジェクトを右クリックしてModusToolbox > Library Manager を選します

  また、手動で GitHub からダウンロドして、プロジェクトにコピすることも可能です。 
         pastedImage_0.png

 4. DFU ライブラリの API を使用するに、main.c DFU ヘッダをインクルドします

include "cycfg.h"
include "cy_dfu.h"

ステップ 2: アプリケションの設定 (DFU_App0_I2C)

  1. 1. コンフィグレションファイル dfu_user.c dfu_user.h libs\dfu\config ディレクトリから

   コピてプロジェクトディレクトリに置きます

 2. トランスポトファイルを \config ディレクトリから、コピしてプロジェクトディレクトリに置きます

   今回の場合、I2C には transport_i2c.h transport_i2c.c が必要です

 3. app0 のリンカスクリプトファイルを libs\dfu\linker_scripts\TOOLCHAIN_<COMPILER>\ からプロジェクトのルトにコピしてください

   GCC ARM コンパイラ用には、libs\dfu\linker_scripts\TOOLCHAIN_GCC_ARM\dfu_cm4_app0.ld をコピしてください

 4. ModusToolbox Device Configurator を使用して、シリアルコミュニケションブロック (SCB) I2C コミュニケション用

   設定してください。CY8CKIT-062-WIFI-BT では、KitProg3 インタフェスに接されている SCB3 を使用してください

   SCB3 の設定方法は 1をご照ください

1.

pastedImage_23.png

ステップ 3: DFU_App0_I2C main.c をアップデトす

  1. 1. main.c のオリジナルコドを消して、main() の空ルプだけをします

 2. リセット後に適切なアプリケションを起動するために、main.c DFU リセットハンドラを追加します

/*******************************************************************************

* Function Name: Cy_OnResetUser

********************************************************************************

*

*  This function is called at the start of Reset_Handler().

*  DFU requires it to call Cy_DFU_OnResetApp0() in app#0.

*

*******************************************************************************/

void Cy_OnResetUser(void)

{

    Cy_DFU_OnResetApp0();

}

 3. 変数を初期化して、DFU の初期化関数 main() から呼ぶように、下記のコドを main.c に追加します

/*

* Used to count seconds

*/

uint32_t count = 0;

/* Status codes for DFU API */

cy_en_dfu_status_t status;

/*

* DFU state, one of the:

* - CY_DFU_STATE_NONE

* - CY_DFU_STATE_UPDATING

* - CY_DFU_STATE_FINISHED

* - CY_DFU_STATE_FAILED

*/

uint32_t state;

/* Timeout for Cy_DFU_Continue(), in milliseconds */

const uint32_t paramsTimeout = 20u;

/* Buffer to store DFU commands */

CY_ALIGN(4) static uint8_t buffer[CY_DFU_SIZEOF_DATA_BUFFER];

/* Buffer for DFU data packets for transport API */

CY_ALIGN(4) static uint8_t packet[CY_DFU_SIZEOF_CMD_BUFFER ];

/* DFU params, used to configure DFU */

cy_stc_dfu_params_t dfuParams;

/* Initialize dfuParams structure */

dfuParams.timeout          = paramsTimeout;

dfuParams.dataBuffer       = &buffer[0];

dfuParams.packetBuffer     = &packet[0];

status = Cy_DFU_Init(&state, &dfuParams);

/* Set up the device based on configurator selections */

init_cycfg_all();

/* enable interrupts */

__enable_irq();

/* Initialize DFU communication */

Cy_DFU_TransportStart();

 4. main() DFU トランスポトレイヤを初期化するように下記のコドを main.c に追加します

/* Initialize DFU communication */

Cy_DFU_TransportStart();

 5. メインルプを Host Common/Response プロトコル理でアップデトするように下記のコドを main.c に追加します

status = Cy_DFU_Continue(&state, &dfuParams);

++count;

if (state == CY_DFU_STATE_FINISHED)

{

/* Finished loading the application image */

/* Validate DFU application, if it is valid then switch to it */

status = Cy_DFU_ValidateApp(1u, &dfuParams);

if (status == CY_DFU_SUCCESS)

{

Cy_DFU_TransportStop();

Cy_DFU_ExecuteApp(1u);

}

else if (status == CY_DFU_ERROR_VERIFY)

{

/*

* Restarts loading, an alternatives are to Halt MCU here

* or switch to the other app if it is valid.

* Error code may be handled here, i.e. print to debug UART.

*/

status = Cy_DFU_Init(&state, &dfuParams);

Cy_DFU_TransportReset();

}

}

else if (state == CY_DFU_STATE_FAILED)

{

/* An error has happened during the loading process */

/* Handle it here */

/* In this Code Example just restart loading process */

status = Cy_DFU_Init(&state, &dfuParams);

Cy_DFU_TransportReset();

}

else if (state == CY_DFU_STATE_UPDATING)

{

uint32_t passed5seconds = (count >= (5000ul/paramsTimeout)) ? 1u : 0u;

/*

* if no command has been received during 5 seconds when the loading

* has started then restart loading.

*/

if (status == CY_DFU_SUCCESS)

{

count = 0u;

}

else if (status == CY_DFU_ERROR_TIMEOUT)

{

if (passed5seconds != 0u)

{

count = 0u;

Cy_DFU_Init(&state, &dfuParams);

Cy_DFU_TransportReset();

}

}

else

{

count = 0u;

/* Delay because Transport still may be sending error response to a host */

Cy_SysLib_Delay(paramsTimeout);

Cy_DFU_Init(&state, &dfuParams);

Cy_DFU_TransportReset();

}

}

 6. メインルプを DFU_App1_Hello_World アプリケションにスイッチするルチンで更します

   例えば CY8CKIT-062-WIFI-BT SW2 ボタンを押すとアプリケションを切り替えます

   このピンは基板上の SW2 に接されています

   a. Device Configurator Pin P0[4] を有にして、名前を “PIN_SW2” にします

   b. 2のようにピンの設定を行います

2

pastedImage_28.png

   c. メインルプに以下のルチンを追加します

/* If Button clicked - Switch to App1 if it is valid */

if (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{

/* 50 ms delay for button debounce on button press */

Cy_SysLib_Delay(50u);

if (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{

while (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{   /* 50 ms delay for button debounce on button release */

Cy_SysLib_Delay(50u);

}

/* Validate and switch to App1 */

status = Cy_DFU_ValidateApp(1u, &dfuParams);

if (status == CY_DFU_SUCCESS)

{

Cy_DFU_TransportStop();

Cy_DFU_ExecuteApp(1u);

}

}

}

ステップ 4: DFU_App0_I2C をビルドしてプログラムします

 1. プロジェクトの makefile dfu_cm4_app0 の適切なツルチェンで DFU リンカスクリプトを使用するように更します

  LINKER_SCRIPT をプロジェクトのルトにコピされたリンカスクリプトを指すようにします

LINKER_SCRIPT=dfu_cm4_app0.ld

 2. ELF ファイルにサインを行う post-build ステップを追加するか、ビルド後に手作業でサインを行ってください

<MCUELFTOOL> –sign <app>.elf –output <app_signed>.elf –hex <app_signed>.hex.

  macOS/Linux プラットフォ

POSTBUILD=$(CY_MCUELFTOOL_DIR)/bin/cymcuelftool --sign $(CY_CONFIG_DIR)/$(APPNAME).elf --hex $(CY_CONFIG_DIR)/$(APPNAME).hex

  Windows プラットフォ

          POSTBUILD="$(CY_MCUELFTOOL_DIR)/bin/cymcuelftool.exe" --sign $(CY_CONFIG_DIR)/$(APPNAME).elf --hex $(CY_CONFIG_DIR)/$(APPNAME).hex

 3. ビルドしてデバイスにプログラムします

ステップ 5: ダブル DFU_App1_Hello_World の設

 1. コンフィグレションファイル dfu_user.h libs\dfu\config ディレクトリからコピしてプロジェクトルトの main.c の付近に置きます

  注意:メタデタストラクチャの重複を避けるために dfu_user.c コピしないでください

 2. app1 のリンカスクリプトを \libs\dfu\linker_scripts\TOOLCHAIN_<COMPILER>\ からプロジェクトのルトのコピします

  GCC ARM コンパイラの場合、\libs\df\linker_scripts\TOOLCHAIN_GCC_ARM\dfu_cm4_app1.ld をコピします

ステップ 6: ダブル DFU_App1_Hello_World main.c 更する

 1. main.c .cy_app_signature セクションを追加します。その他の存のコドは更しません

CY_SECTION(".cy_app_signature") __USED static const uint32_t cy_dfu_appSignature[1];

 2. main 関数の中でペリフェラルの初期化を行います

init_cycfg_all();

 3. メインルプにロアプリケション DFU_App0_I2C に他のアプリケションをロドするように更します

  例えば、CY8CKIT-062-WIFI-BT 上の SW2 ボタンを押すとアプリケションを切り替えます

  a. Device Configurator でピン P0[4] を有にして、名前を "PIN_SW2" 更します

  b. ピンのコンフィグレションを App0 P0[4] と同に設定します

  c. メインルプに以下のルチンを追加します

/* If Button clicked and switch to App0 */

if (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{

/* 50 ms delay for button debounce on button press */

Cy_SysLib_Delay(50u);

if (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{

while (Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_PIN) == 0u)

{   /* 50 ms delay for button debounce on button release */

Cy_SysLib_Delay(50u);

}

Cy_DFU_ExecuteApp(0u);

}

}

ステップ 7:  ビルドとパッチのプログラ

 1. プロジェクトの makefile dfu_cm4_app1 の適切なツルチェンで DFU リンカスクリプトを使用するように更します

  LINKER_SCRIPT をコピされたリンカスクリプトを指すようにします

   LINKER_SCRIPT=dfu_cm4_app1.ld

 2.  パッチファイルを *.cyacd2 フォマットで生成するように CyMCUElfTool 行するpost-build ステップを追加します

  ( CyMCUElfTool User Guide ).

   macOS/Linux プラットフォ

POSTBUILD=$(CY_MCUELFTOOL_DIR)/bin/cymcuelftool --sign $(CY_CONFIG_DIR)/$(APPNAME).elf CRC --output $(APPNAME)_crc.elf && \ $(CY_MCUELFTOOL_DIR)/bin/cymcuelftool -P $(APPNAME)_crc.elf --output      $(APPNAME)_crc.cyacd2

   Windows プラットフォ

   POSTBUILD="$(CY_MCUELFTOOL_DIR)/bin/cymcuelftool.exe" --sign $(CY_CONFIG_DIR)/$(APPNAME).elf CRC --output $(APPNAME)_crc.elf && \ "$(CY_MCUELFTOOL_DIR)/bin/cymcuelftool.exe" -P $(APPNAME)_crc.elf --output $(APPNAME)_crc.cyacd2

 3. プロジェクトをビルドします

 4. Device Firmware Update Tool を起動します。(ModusToolbox のタゲットプロジェクトを右クリックして、 ModusToolbox > Device Firmware Update Tool を選)。 デバイスに接。プロジェクトルトにある生成された .cyacd2 ファイルを選して、デバイスのプログラムします

  このツルの詳細な使用方法について Help > View Help をクリックして ModusToolbox Device Firmware Update Host Tool ドキュメントを開いてください

3

pastedImage_31.png

正常にプログラムが終了すると “DFU_App1_Hello_World” アプリケションが起動します。Hello_World アプリケションのデフォルト設定では赤い LED が点滅します。基板上の SW2 を押して App0 App1 を切り替えてください

0 件の賞賛
294 件の閲覧回数
寄稿者