/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file app_filex.c * @author MCD Application Team * @brief FileX applicative file ****************************************************************************** * @attention * * Copyright (c) 2024 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "app_filex.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "main.h" #include "stdio.h" #include "sdmmc.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ typedef enum { CARD_STATUS_CHANGED = 99, CARD_STATUS_DISCONNECTED = 88, CARD_STATUS_CONNECTED = 77 } SD_ConnectionStateTypeDef; #define MEDIA_CLOSED 1UL #define MEDIA_OPENED 0UL /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* Main thread stack size */ #define FX_APP_THREAD_STACK_SIZE 4096 /* Main thread priority */ #define FX_APP_THREAD_PRIO 10 /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* Main thread global data structures. */ TX_THREAD fx_app_thread; /* Buffer for FileX FX_MEDIA sector cache. */ ALIGN_32BYTES (uint32_t fx_sd_media_memory[FX_STM32_SD_DEFAULT_SECTOR_SIZE / sizeof(uint32_t)]); /* Define FileX global data structures. */ FX_MEDIA sdio_disk; /* USER CODE BEGIN PV */ static UINT media_status; FX_FILE fx_file; TX_QUEUE tx_msg_queue; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ /* Main thread entry function. */ void fx_app_thread_entry(ULONG thread_input); /* USER CODE BEGIN PFP */ static VOID media_close_callback (FX_MEDIA *media_ptr); /* USER CODE END PFP */ /** * @brief Application FileX Initialization. * @param memory_ptr: memory pointer * @retval int */ UINT MX_FileX_Init(VOID *memory_ptr) { UINT ret = FX_SUCCESS; TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr; VOID *pointer; /* USER CODE BEGIN MX_FileX_MEM_POOL */ /* USER CODE END MX_FileX_MEM_POOL */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ /*Allocate memory for the main thread's stack*/ ret = tx_byte_allocate(byte_pool, &pointer, FX_APP_THREAD_STACK_SIZE, TX_NO_WAIT); /* Check FX_APP_THREAD_STACK_SIZE allocation*/ if (ret != FX_SUCCESS) { return TX_POOL_ERROR; } /* Create the main thread. */ ret = tx_thread_create(&fx_app_thread, FX_APP_THREAD_NAME, fx_app_thread_entry, 0, pointer, FX_APP_THREAD_STACK_SIZE, FX_APP_THREAD_PRIO, FX_APP_PREEMPTION_THRESHOLD, FX_APP_THREAD_TIME_SLICE, FX_APP_THREAD_AUTO_START); /* Check main thread creation */ if (ret != FX_SUCCESS) { return TX_THREAD_ERROR; } /* USER CODE BEGIN MX_FileX_Init */ /* USER CODE END MX_FileX_Init */ /* Initialize FileX. */ fx_system_initialize(); /* USER CODE BEGIN MX_FileX_Init 1*/ /* USER CODE END MX_FileX_Init 1*/ return ret; } /** * @brief Main thread entry. * @param thread_input: ULONG user argument used by the thread entry * @retval none */ void fx_app_thread_entry(ULONG thread_input) { UINT sd_status = FX_SUCCESS; /* USER CODE BEGIN fx_app_thread_entry 0*/ ULONG r_msg; ULONG s_msg = CARD_STATUS_CHANGED; ULONG last_status = CARD_STATUS_DISCONNECTED; ULONG bytes_read; CHAR read_buffer[32]; CHAR data[] = "This is FileX working on STM32"; HAL_SD_GetCardInfo(&hsd1, &USBD_SD_CardInfo); /* USER CODE END fx_app_thread_entry 0*/ /* Open the SD disk driver */ 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) { /* USER CODE BEGIN SD DRIVER get info error */ //fx_fault_tolerant_enable printf("fx_media_open ret = %d\r\n", sd_status); // 调用 fx_media_format 格式-化 UINT format_ret = fx_media_format(&sdio_disk, // 媒体指针 fx_stm32_sd_driver, // 驱动程序入口 0, // 驱动程序信息指针 (VOID *) fx_sd_media_memory, // 媒体缓冲区 sizeof(fx_sd_media_memory), // 媒体缓冲区大小 FX_SD_VOLUME_NAME, // 卷名 1, // 分区数 32, // 目录数 0, // 隐藏扇区 USBD_SD_CardInfo.BlockNbr-2, // 总扇区数 (0 表示使用整个磁盘) USBD_SD_CardInfo.BlockSize, // 扇区大小 8, // 每簇+扇区数 1, // FAT 数 1); // 碎片扇区数 if (format_ret != FX_SUCCESS) { printf("fx_media_format failed with error code: %d\r\n", format_ret); Error_Handler(); } else { printf("SD card formatted successfully.\r\n"); // 格式化后重新打开媒体 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)); if (sd_status != FX_SUCCESS) { printf("fx_media_open after format failed with error code: %d\r\n", sd_status); Error_Handler(); } else { printf("Media opened successfully after format.\r\n"); } } // sd_status = fx_media_close(&sdio_disk); /* USER CODE END SD DRIVER get info error */ } /* USER CODE BEGIN fx_app_thread_entry 1*/ /* USER CODE END fx_app_thread_entry 1*/ } /* USER CODE BEGIN 1 */ /** * @brief Media close notify callback function. * @param media_ptr: Media control block pointer * @retval None */ static VOID media_close_callback(FX_MEDIA *media_ptr) { media_status = MEDIA_CLOSED; } /* USER CODE END 1 */