サンプルプログラム F4xxxx_DFU_0x08010000 の説明
マスコット   USBを介してSTM32F405VGの
 Flash Memoryに、.binファイルを
 書き込むためのプログラムです。

  DFU : Download Firmware Update
  F4xxxx は、
  F405RG, F405VG, F446RE のいずれかです。

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

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



目次

概要

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

サンプルプログラム F4xxxx_DFU_0x08010000 のプロジェクト
 1. サンプルプログラム F405RG_DFU_0x08010000 のプロジェクト
 2. サンプルプログラム F405VG_DFU_0x08010000 のプロジェクト
 3. サンプルプログラム F446RE_DFU_0x08010000 のプロジェクト

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


ビルドのモードについて

F4xxxx_DFU_0x08010000_Release.bin
 1. F405RG_DFU_0x08010000_Release.bin
 2. F405VG_DFU_0x08010000_Release.bin
 3. F446RE_DFU_0x08010000_Release.bin

PCとのUSB接続

CPU動作クロックの設定について


サンプルプログラム F4xxxx_DFU_0x08010000 の説明
 F4xxxx_DFU_0x08010000 の構成
 ユーザープログラムの実行開始位置
 F4xxxx_DFU_0x08010000 の説明
  1) 初期化の部分
  2) 動作分岐の部分
  3) LED点滅の部分

PCアプリケーション STM32CubeProgrammer
 USBを介して、.bin ファイルをSTM32 CPUのFlash Memoryに書き込むためのPCアプリケーションです。



概要
  サンプルプログラム F4xxxx_DFU_0x08010000は、USBを介して
  STM32F405VGの Flash Memoryに、.binファイルを書き込むためのプログラムです。

  F4xxxx_DFU_0x08010000の .bin ファイル F4xxxx_DFU_0x08010000_Release.bin 自体は、
 STMicroelectronics社が提供しているPCアプリケーション STM32CubeProgrammer の
 ST-LINK/V2接続を使用して、0x08000000 番地に書き込みます。

  F4xxxx_DFU_0x08010000_Release.bin が書き込まれるエリアは以下の通りです。

sector 0 : 0x08000000 - 0x08003FFF : 16Kbytes
sector 1 : 0x08004000 - 0x08007FFF : 16Kbytes

  F4xxxx_DFU_0x08010000_Release.bin は、プロジェクト F4xxxx_DFU_0x08010000 を、
 Releaseモードでビルドして作成した F4xxxx_DFU_0x08010000.bin を
 リネームしたものです。



  USBを介しての .bin ファイルの書き込みには、
 STM32CubeProgrammer のUSB接続を使用します。

  書き込む .binファイルと書き込み開始アドレスを指定して、書き込みます。

  .binファイルがプログラム(Firmware)の場合は、開始番地 0x08010000 を指定して書き込みます。
  (sector 4 : 0x08010000 - 0x0801FFFF : 64Kbytes)
  書き込んだプログラム(Firmware)は、0x08010000番地から実行されます。
  また、そのプログラム(Firmware)は、0x08010000番地から実行するように設定しておく必要があります。


  USBを介して書き込むプログラムの実行開始番地を 0x08010000 にしているのには理由があります。
  STM32F4xxxxの Flash Memory のセクターとサイズを以下に示します。
sector  0 : 0x08000000 - 0x08003FFF :  16Kbytes
sector 1 : 0x08004000 - 0x08007FFF : 16Kbytes
sector 2 : 0x08008000 - 0x0800BFFF : 16Kbytes
sector 3 : 0x0800C000 - 0x0800FFFF : 16Kbytes
sector 4 : 0x08010000 - 0x0801FFFF : 64Kbytes
sector 5 : 0x08020000 - 0x0803FFFF : 128Kbytes
sector 6 : 0x08040000 - 0x0805FFFF : 128Kbytes
sector 7 : 0x08060000 - 0x0807FFFF : 128Kbytes
sector 8 : 0x08080000 - 0x0809FFFF : 128Kbytes
sector 9 : 0x080A0000 - 0x080BFFFF : 128Kbytes
sector 10 : 0x080C0000 - 0x080DFFFF : 128Kbytes
sector 11 : 0x080E0000 - 0x080FFFFF : 128Kbytes
  Flash Memoryのイレースはセクター単位で行われます。
  sector 4 からは、サイズが大きいため設定や動作パラメータを保存するのには
 適さないと思います。

  そこで、プログラムの実行開始番地を 0x08010000 にして、sector 2 と sector 3 を
 パラメータ保存領域として使用することにしました。

  1) STM32F405RG, STM32F405VG には、
   sector 0 ~ sector 11 があります。

  2) STM32F446RE は sector 0 ~ sector 7 までで、
   sector 8 ~ sector 11 はありません。



えがおのでんし製の評価用基板 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基板 の説明 をご覧ください。



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



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


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

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

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


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

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

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


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

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

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



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



ビルドのモードについて
  ビルドにより出力される .bin ファイルのサイズを、
 sector 0 と sector 1 の合計サイズ 32Kbytes 以内にするために
 Releaseモードでビルドします。

  なお、Releaseモードでビルドして作成された F4xxxx_DFU_0x08010000.bin を
 Release版であることを明示するために、F4xxxx_DFU_0x08010000_Release.bin
 リネームして使用しています。



  F4xxxx_DFU_0x08010000_Release.bin を使用したい方は、
 以下の中から目的の .bin ファイルをダウンロードしてください。


1. F405RG_DFU_0x08010000_Release.bin

 ここから F405RG_DFU_0x08010000_Release_bin.zip をダウンロードしてください。

 解凍すると F405RG_DFU_0x08010000_Release.bin になります。


2. F405VG_DFU_0x08010000_Release.bin

 ここから F405VG_DFU_0x08010000_Release_bin.zip をダウンロードしてください。

 解凍すると F405VG_DFU_0x08010000_Release.bin になります。


3. F446RE_DFU_0x08010000_Release.bin

 ここから F446RE_DFU_0x08010000_Release_bin.zip をダウンロードしてください。

 解凍すると F446RE_DFU_0x08010000_Release.bin になります。



PCとのUSB接続
  USBコネクタには Mini-B を使用します。

  1. Base-F405RG基板の場合
   PC と Base-F405RG の USB-1 とを、USBケーブル(A - Mini B)で接続します。

  2. Base-F405VG基板の場合
   PC と Base-F405VG に搭載されている tri-S CPU基板の P3 とを、
  USBケーブル(A - Mini B)で接続します。

  3. Base-F446RE基板の場合
   PC と Base-F446RE の USB-1 とを、USBケーブル(A - Mini B)で接続します。



CPU動作クロックの設定について
  サンプルプログラム F4xxxx_DFU_0x08010000 のCPU動作クロック設定と
 0x080010000番地に配置する、ユーザープログラムのCPU動作クロック設定は
 同一である必要があります。

  同一でない場合、ユーザープログラムが動作しません。

  サンプルプログラム F4xxxx_DFU_0x08010000 のフォルダ Core/Src/main の
  int main(void) に以下のCPU動作クロック設定の記述があります。
  /* Configure the system clock */
  SystemClock_Config();

   CPUの動作クロックとPeripheralの動作クロックを設定します。

   SystemClock_Config(); の設定内容は、

int main(void)
{
         .
         .
         .
}
 の、すぐ下に記述されています。



サンプルプログラム F4xxxx_DFU_0x08010000 の説明
  サンプルプログラム F4xxxx_DFU_0x08010000は、USBを介して
  STM32F4xxxxの Flash Memory に、.binファイルを書き込むためのプログラムです。

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

F405RG_DFU_0x08010000_Scrn_First

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



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

F405RG_DFU_0x08010000_Tree

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

F4xxxx_DFU_0x08010000
  |
  |- 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
  |
  |- DFU_Ope
  |    |- Blink_LED_DFU : LED点滅処理
  |    |    |- Blink_LED_DFU.c
  |    |    |- Blink_LED_DFU.h
  |    |
  |    |- F4xxxx_Config : 動作パラメータの定義
  |         |- Dev_Conf.h
  |
  |- Drivers
  |
  |- Middlewares
  |    |- ST
  |        |
  |        |- STM32_USB_Device_Library
  |              |- Class
  |              |    |- DFU
  |              |        |- Inc
  |              |        |   |- usbd_dfu.h
  |              |        |
  |              |        |- Src
  |              |            |- usbd_dfu.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_desc.c
  |    |   |- usbd_desc.h
  |    |   |- usbd_dfu_if.c
  |    |   |- usbd_dfu_if.h
  |    |
  |    |- Target
  |        |- usbd_conf.c
  |        |- usbd_conf.h
  |
  |- STM32F4xxxxTX_FLASH.ld
  |- STM32F4xxxxTX_RAM.ld



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

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

F405RG_DFU_0x08010000_main

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

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



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


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

  /* USER CODE BEGIN 1 */

  /* 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();
  /* USER CODE BEGIN 2 */

  //--------------------------------------------------
  // ST LED と USERスイッチ のGPIOを初期化
  //--------------------------------------------------
  // 引数:
  //    なし


  // 戻り値:
  //    なし
  //--------------------------------------------------
  Initialize_LED_USW();


  //------------------------------------------------
  // USERスイッチの状態チェック
  //------------------------------------------------
  if(HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW)
                                            == def_USW_OFF)
  {
    //----------------------------------------------
    // USERスイッチが押されていない場合
    //----------------------------------------------
    /* Test if user code is programmed
         starting from USBD_DFU_APP_DEFAULT_ADD address */
    if(((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFC0000 )
                                                    == 0x20000000)
    {
      //------------------------------------------------
      // 0x08010000番地にJump
      //------------------------------------------------
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
      JumpToApplication = (pFunction) JumpAddress;

      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD);
      JumpToApplication();
    }
  }


  //----------------------------------------
  // USERスイッチが押されている場合
  //----------------------------------------
  MX_USB_DEVICE_Init();

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
    Blink_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) GPIOの初期化
   MX_GPIO_Init(); を呼び出して
   Userスイッチ および LED が接続されているピンを初期化しています。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();



 2) 動作分岐の部分
   動作分岐を以下に示します。

  /* USER CODE BEGIN 2 */

  //--------------------------------------------------
  // ST LED と USERスイッチ のGPIOを初期化
  //--------------------------------------------------
  // 引数:
  //    なし


  // 戻り値:
  //    なし
  //--------------------------------------------------
  Initialize_LED_USW();


  //------------------------------------------------
  // USERスイッチの状態チェック
  //------------------------------------------------
  if(HAL_GPIO_ReadPin(def_GPIOx_USW, def_GPIO_PIN_x_USW)
                                            == def_USW_OFF)
  {
    //----------------------------------------------
    // USERスイッチが押されていない場合
    //----------------------------------------------
    /* Test if user code is programmed
         starting from USBD_DFU_APP_DEFAULT_ADD address */
    if(((*(__IO uint32_t*)USBD_DFU_APP_DEFAULT_ADD) & 0x2FFC0000 )
                                                    == 0x20000000)
    {
      //------------------------------------------------
      // 0x08010000番地にJump
      //------------------------------------------------
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (USBD_DFU_APP_DEFAULT_ADD + 4);
      JumpToApplication = (pFunction) JumpAddress;

      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) USBD_DFU_APP_DEFAULT_ADD);
      JumpToApplication();
    }
  }


  //----------------------------------------
  // USERスイッチが押されている場合
  //----------------------------------------
  MX_USB_DEVICE_Init();

  /* USER CODE END 2 */

  プログラム実行開始時のUserスイッチの状態をチェックして、
 0x08010000 番地に分岐するか、DFU(Download Firmware Update)動作を行うかを
 判断しています。

  Userスイッチが押されていなければ、0x08010000 番地に分岐して、
 0x08010000 番地に書き込まれている Firmware を実行します。

  Userスイッチが押されてる場合は、USBを初期化して、
 DFU(Download Firmware Update)動作を行います。

  Base-F4xxxx基板上のUserスイッチを押しながら、Resetスイッチを押すと、
 DFU(Download Firmware Update)動作を開始します。



 3) LED点滅の部分
   永久ループ部分の記述を以下に示します。

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

    /* USER CODE BEGIN 3 */
    Blink_LED();
  }
  /* USER CODE END 3 */

  LEDの 20mSec点灯 / 180mSec消灯 を繰り返します。

  DFU(Download Firmware Update)動作は、割り込み処理で行われます。



 PCアプリケーション STM32CubeProgrammer
  USBを介して、.bin ファイルをSTM32 CPUのFlash Memoryに書き込むためのPCアプリケーションです。

  STMicroelectronics社が提供しているアプリケーションです。

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



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




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

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

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