在STM32U5上使用STM32CubeMX配置FileX文件系统并通过SDMMC接口读写SD卡的步骤如下:
启用SDMMC控制器
在Connectivity
中选择SDMMC1
,模式设置为4-bit Wide bus
。
确认GPIO自动分配正确(CLK, CMD, D0-D3)。
配置时钟
SDMMC时钟源选择PLL(确保不超过SD卡最大频率,初始化阶段建议≤400kHz)。
在Clock Configuration
中设置SDMMC时钟分频。
启用DMA(可选但推荐)
为SDMMC添加DMA通道(TX/RX),模式设置为Circular
以提高效率。
启用FileX和ThreadX
在Middleware
中启用Azure RTOS
,添加FileX
和ThreadX
。
配置线程堆栈大小(建议≥1024字节)。
生成代码
生成代码前检查Project Manager
中的Linker Settings
,确保堆内存足够(≥4KB)。
FileX需要以下底层接口函数(通常由CubeMX自动生成,位于fx_stm32_sd_driver.c
):
fx_stm32_sd_init()
:初始化SD卡。
fx_stm32_sd_read()
:块读取。
fx_stm32_sd_write()
:块写入。
fx_stm32_sd_get_status()
:获取SD卡状态。
在ThreadX线程中初始化SD卡和FileX:
#define SD_BUFFER_SIZE 512static UCHAR sd_buffer[SD_BUFFER_SIZE] __attribute__((aligned(32))); // 对齐缓冲区void sd_thread_entry(ULONG thread_input) {
FX_MEDIA sd_card;
UINT status;
// 挂载SD卡
status = fx_media_open(&sd_card, "STM32_SD",
fx_stm32_sd_driver, // 驱动函数
(VOID*)0, // 驱动参数
sd_buffer, // 缓冲区
sizeof(sd_buffer));
if (status != FX_SUCCESS) {
// 处理错误:检查硬件连接或尝试格式化
Error_Handler();
}
// 文件操作代码...}
FX_FILE file;UINT status;const CHAR* data = "Hello, STM32U5 FileX!";ULONG bytes_written;// 打开文件(若不存在则创建)status = fx_file_open(&sd_card, &file, "test.txt",
FX_OPEN_FOR_WRITE | FX_OPEN_FOR_CREATE);if (status == FX_SUCCESS) {
// 写入数据
status = fx_file_write(&file, (VOID*)data, strlen(data), &bytes_written);
if (status != FX_SUCCESS || bytes_written != strlen(data)) {
// 写入失败
}
fx_file_close(&file); // 关闭文件}
CHAR read_buffer[64];ULONG bytes_read;status = fx_file_open(&sd_card, &file, "test.txt", FX_OPEN_FOR_READ);if (status == FX_SUCCESS) {
status = fx_file_read(&file, read_buffer, sizeof(read_buffer), &bytes_read);
if (status == FX_SUCCESS) {
read_buffer[bytes_read] = '