LoginSignup
2
2

STM32マイコンのSDMMC機能でFileXミドルウェアを用いμSDカードにファイル書込みした時のスループットを計測してみました

Posted at

1.はじめに

この記事はSTM32マイコンのSDMMC機能(SPIモードでは無い)を使用して、FileXミドルウェア(FatFSでは無い)でμSDカードにファイル書込みした時のスループットを計測しましたので紹介いたします。
開発ボードに搭載されているマイコンは STM32H563ZIT6 でこのシリーズはSTM32CubeIDEから選択できるFatシステムがFatfsからFileXに変更されています。

2. 参考リンク

以下の記事を参考に開発しております。この場を借りてお礼申し上げます。

3.開発環境

開発環境は以下の通り。

No 品名 型式 web イメージ
1 マイコンボード NUCLEO-H563ZI https://www.st.com/ja/evaluation-tools/nucleo-h563zi.html image.png
2 μSDカードスロット AE-MICRO-SD-DIP https://akizukidenshi.com/catalog/g/gK-05488/ K-05488.png
3 μSDカード 各種
4 開発環境 STM32CubeIDE version:1.13.0

マイコンボードとμSDカードスロットの接続は以下の通り
image.png

4.STM32CubeIDEでの設定

STM32CubeIDEでの設定は以下の設定をすれば、恐らく上手くコードが生成されると思います。

Clock設定

メインクロックは240MHz
image.png

SDMMCクロックは48MHz
image.png

SDMMC1設定

4bitバス
clock divide = 2
image.png

GPIO割り当て
image.png

FILEX設定

FileX Core = チェック入れる

image.png
FX_ENABLE_EXFAT = Enabled
image.png

5.ユーザコード

/* USER CODE BEGIN PV */
#define FX_SD_VOLUME_NAME "STM32_SDIO_DISK"
FX_MEDIA        sdio_disk;
FX_FILE         fx_file;
ALIGN_32BYTES (uint32_t fx_sd_media_memory[FX_STM32_SD_DEFAULT_SECTOR_SIZE / sizeof(uint32_t)]);

int main(void)
{
  /* USER CODE BEGIN 1 */
 long cnt;
  /* 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_SDMMC1_SD_Init();
  MX_FileX_Init();
  /* USER CODE BEGIN 2 */

  UINT sd_status = FX_SUCCESS;

  int i;
  char c=21;

  char data[] = "This is FileX working on STM32";
  char data1[300];
  char data2[2048];
  
  for (i = 0;i<300;i++)
  {
	  data1[i] = c++;
	  if (c>=127){c=21;}
  }

  for (i = 0;i<2048;i++)
  {
	  data2[i] = c++;
	  if (c>=127){c=21;}
  }
  
  /********************************************/
  /* メディアオープン */
  /********************************************/
  	  sd_status =  fx_media_open(&sdio_disk,
		  FX_SD_VOLUME_NAME,
		  fx_stm32_sd_driver,
		  (VOID *)FX_NULL,
		  (VOID *) fx_sd_media_memory,
		  sizeof(fx_sd_media_memory));

  	  /* Check the media open sd_status */
  	  if (sd_status != FX_SUCCESS)
  	  {
		  Error_Handler();
  	  }

  /********************************************/
  /* メディアオープン */
  /********************************************/
	  sd_status =  fx_file_create(&sdio_disk, "STM32.TXT");

	  /* Check the create status.  */
	  if (sd_status != FX_SUCCESS)
	  {
	     /* Check for an already created status. This is expected on the
	     second pass of this loop!  */
	     if (sd_status != FX_ALREADY_CREATED)
	     {
		 /* Create error, call error handler.  */
	    	 Error_Handler();
	     }
	     else
	     {
	    	 fx_file_delete(&sdio_disk, "STM32.TXT");
	     }
	  }

  /********************************************/
  /* ファイルオープン */
  /********************************************/
	  if (fx_file_open(&sdio_disk, &fx_file, "STM32.TXT", FX_OPEN_FOR_WRITE) != FX_SUCCESS)
	  {
	     Error_Handler();
	  }

  /********************************************/
  /* ファイル書込み */
  /********************************************/
	  HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12, GPIO_PIN_SET);
	  HAL_GPIO_WritePin(LED1_GREEN_GPIO_Port, LED1_GREEN_Pin, GPIO_PIN_SET);
	    
	  cnt = 100000;
	  while(cnt--)
	  {
		if (fx_file_write(&fx_file, data, sizeof(data)) != FX_SUCCESS)
		{
			Error_Handler();
		}
	  }
	  HAL_GPIO_WritePin(LED1_GREEN_GPIO_Port, LED1_GREEN_Pin, GPIO_PIN_RESET);
	  HAL_GPIO_WritePin(GPIOG,GPIO_PIN_12, GPIO_PIN_RESET);

  /********************************************/
  /* ファイルクローズ */
  /********************************************/
	  if (fx_file_close(&fx_file) != FX_SUCCESS)
	  {
	     Error_Handler();
	  }

  /********************************************/
  /* メディアフラッシュ*/
  /********************************************/
	  if (fx_media_flush(&sdio_disk) != FX_SUCCESS)
	  {
	    Error_Handler();
	  }

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

6.結果

①クロックスピード調査

SDMMC1モジュールに与えるクロックは48MHzとし、プリスケーラ(ClockDiv)を変化させた時の書き込み可否を調べました。

※なおこの調査はマイコンボードとSDカードをジャンパワイヤ(線長約20cm)で接続しておりますので、高速通信を行うのには元々不適な環境で行っております。本来の性能を発揮させるので有ればインピーダンスマッチングされた基板設計を行うべきでありますが、このような悪環境での参考値として捉えて下さい。

× = 書き込み不可 , △ = 不安定 , 〇 = 安定して書込み可

No. メーカ(型式) 容量 スピードクラス ClockDiv = 0 ClockDiv = 1 ClockDiv = 2
1 KIOXIA EXCERIA 32GB Class10 ×
2 TOSHIBA M203 64GB Class10 × ×
3 TOSHIBA M203 16GB Class10 × ×
4 TOSHIBA M303 64GB Class10 ×

②3MByte書込み [30Byte × 100000回]

No. メーカ(型式) 容量 スピードクラス 書込み時間(秒) 書込み速度(Byte/sec) ClockDiv
1 KIOXIA EXCERIA 32GB Class10 5.69/6.31/6.32 491k 2
2 TOSHIBA M203 64GB Class10 14.87/14.95/14.96 201k 2
3 TOSHIBA M203 16GB Class10 6.03/6.15/6.51 481k 2
4 TOSHIBA M303 64GB Class10 13.33/13.8/14.21 217k 2

image.png

③3MByte書込み [300Byte × 10000回]

No. メーカ 容量 スピードクラス 書込み時間(秒) 書込み平均(Byte/sec) ClockDiv
1 KIOXIA EXCERIA 32GB Class10 6.17/6.19/6.04 489k 2
2 TOSHIBA M203 64GB Class10 13.96/15.1/15.09 203k 2
3 TOSHIBA M203 16GB Class10 6.01/5.99/5.99 500k 2
4 TOSHIBA M303 64GB Class10 15.51/11.49/11.79/11.74 237k 2

image.png

④5.12MByte書込み [512Byte × 10000回]

No. メーカ 容量 スピードクラス 書込み時間(秒) 書込み平均(Byte/sec) ClockDiv
1 KIOXIA EXCERIA 32GB Class10 7.24/6.86/6.86 733k 2
2 TOSHIBA M203 64GB Class10 15.28/15.3/16.9 313k 2
3 TOSHIBA M203 16GB Class10 6.86/6.86/6.85 746k 2
4 TOSHIBA M303 64GB Class10 14.2/14.19/14.05 362k 2

image.png

⑤5.12MByte書込み [2048Byte × 2500回]

No. メーカ 容量 スピードクラス 書込み時間(秒) 書込み平均(Byte/sec) ClockDiv
1 KIOXIA EXCERIA 32GB Class10 2.25/2.26/2.25 2276k 2
2 TOSHIBA M203 64GB Class10 6.25/4.36/4.36 1026k 2
3 TOSHIBA M203 16GB Class10 2.61/2.24/2.26 2160k 2
4 TOSHIBA M303 64GB Class10 4.68/4.68/6.3 980k 2

image.png

6.まとめ

・基板化しないと本来の性能が発揮できない
・32GBまではSDHC、32GBを超えるとSDXC規格になるためアクセス速度が倍程度違う
・セクタ単位(512Byte)未満の場合、バッファに貯めこんで一気に書込む方法と、都度書込む方法の差異は無い
・シングルセクタライト(512Byte)よりマルチセクタライト(2048Byte)の方が高速

image.png

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2