在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] = ''; // 添加字符串结束符
printf("Read: %s
", read_buffer);
}
fx_file_close(&file);}
SD卡无法挂载:
检查硬件连接和电源。
确认SD卡格式化为FAT32。
使用fx_media_format()
首次格式化(注意:会擦除数据)。
文件读写失败:
确保文件路径正确(根目录以/
开头,如/dir/file.txt
)。
检查缓冲区对齐(32字节对齐)。
DMA配置错误:
在CubeMX中确认DMA通道与SDMMC匹配。
启用DMA中断并实现IRQ处理函数。
void sd_thread_entry(ULONG thread_input) {
FX_MEDIA sd_card;
FX_FILE file;
UINT status;
CHAR buffer[64];
// 挂载SD卡
if (fx_media_open(&sd_card, "SD_CARD", fx_stm32_sd_driver, 0,
sd_buffer, sizeof(sd_buffer)) != FX_SUCCESS) {
Error_Handler();
}
// 写入文件
if (fx_file_open(&sd_card, &file, "/test.txt", FX_OPEN_FOR_WRITE | FX_OPEN_FOR_CREATE) == FX_SUCCESS) {
fx_file_write(&file, "Hello FileX!", 12, &bytes_written);
fx_file_close(&file);
}
// 读取文件
if (fx_file_open(&sd_card, &file, "/test.txt", FX_OPEN_FOR_READ) == FX_SUCCESS) {
fx_file_read(&file, buffer, sizeof(buffer), &bytes_read);
buffer[bytes_read] = '';
printf("Content: %s
", buffer);
fx_file_close(&file);
}
// 卸载媒体
fx_media_close(&sd_card);}
缓冲区对齐:确保读写缓冲区32字节对齐(使用__attribute__((aligned(32)))
)。
错误处理:始终检查函数返回值(FX_SUCCESS
)。
格式化SD卡:若首次使用,需调用fx_media_format()
。
通过以上步骤,您可以在STM32U5上实现SD卡的文件系统操作。
电话:176-6539-0767
Q Q:135-0379-986
邮箱:1350379986@qq.com
地址:深圳市南山区后海大道1021号C座