光怪鹿李 2024-02-26 16:02 采纳率: 88.9%
浏览 303
已结题

stm32fatfs文件系统,执行函数f_mount挂载设备时卡死

我用stm32f103c8t6的fatfs文件系统想挂载两个设备
1.一个是flash,一个是sd卡,
2.stm32fatfs文件系统f_mount挂载flash时卡死,用debug调试进入了HardFault_Handler函数里的死循环while(1)中.
3.但是我的minimum Stack Size已经设置了0x2800,栈空间已经足够大了,但是还是卡死了,4.用printf函数能打印运行f_mount之前的东西,但是运行到f_mount就卡死了,

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-26 16:04
    关注

    引自免费微信小程序:皆我百晓生

    针对STM32F103C8T6使用FatFs文件系统时,在执行f_mount挂载函数时出现卡死的问题,我们可以通过以下几个步骤来排查和解决:

    1. 硬件连接与初始化

    • 检查SD卡接口和SPI Flash硬件连接:确保所有引脚正确连接且配置正确,如SD卡的SPI模式或SDIO模式下的信号线、电源线、接地线等。
    • 设备驱动初始化:确保已经为SD卡和SPI Flash分别完成了初始化操作,例如SPI总线初始化、SD卡初始化(CMD0, CMD8, ACMD41等)以及SPI Flash芯片的读写时序初始化。

    2. FatFs配置与结构体

    • 分配并初始化FatFs工作区结构体:对于每个要挂载的设备,都需要创建一个FATFS结构体实例,并正确设置相关参数。例如:
      FATFS fs_flash, fs_sd;
      
      // 初始化Flash文件系统
      f_mount(&fs_flash, "0:", 0);
      
      // 初始化SD卡文件系统
      f_mount(&fs_sd, "1:", 0);
      
    • 检查设备驱动与FatFs对接:确认你已经在FatFs中正确配置了对应的驱动函数指针,如读写扇区、获取扇区数等。

    3. 查看f_mount调用细节

    • 分析HardFault_Handler调用原因:进入HardFault_Handler通常意味着发生了异常,可能是栈溢出、非法内存访问或其他硬件异常。检查f_mount函数内部调用过程,确保没有错误地访问未初始化的内存区域或资源冲突。
    • 增加日志输出:在关键点插入printf或其他调试信息,以确定程序运行到f_mount的具体哪一步出现了问题。

    4. 栈空间调整

    • 尽管你已将minimum Stack Size设置为0x2800,但依然要考虑在调用f_mount过程中是否有深度递归或者其他导致栈空间快速消耗的情况。
    • 检查其他中断服务程序或者同时运行的任务是否会影响当前任务栈。

    5. 示例代码简化与重现

    • 为了更准确地定位问题,尝试简化你的应用代码至最小可复现问题的版本,仅保留与f_mount相关的部分。
    • 在调试阶段暂时移除非必要的中断处理和其他任务,以便集中精力排查f_mount问题。

    由于无法直接提供完整代码示例,以下是一个简化的f_mount调用及初始化流程的伪代码示意:

    #include "ff.h"
    #include "diskio.h" // 针对特定硬件的磁盘I/O层实现
    
    // 设备驱动初始化
    void Init_SPI_Flash(void);
    void Init_SD_Card(void);
    
    int main(void)
    {
        uint8_t work_buf[FF_MAX_SS]; // 工作缓冲区大小根据实际需要调整
    
        // 初始化硬件设备
        Init_SPI_Flash();
        Init_SD_Card();
    
        // 初始化FatFs工作区
        FATFS fs_flash, fs_sd;
    
        // 分别挂载SPI Flash和SD卡
        f_mount(&fs_flash, "0:", 1); // 第三个参数设置为1,表示进行初始化
        f_mkfs("0:", 0, 0); // 可能需要先格式化FLASH分区
    
        f_mount(&fs_sd, "1:", 1);
        f_mkfs("1:", 0, 0); // 如果SD卡需要格式化,可以在这里做
    
        // ... 其他操作 ...
    
        while (1) {
            // 主循环
        }
    }
    
    // 注意:此处应包含diskio.c中的对应硬件驱动实现
    

    请结合上述指导检查你的项目代码和配置,并逐步排除可能的原因。若问题依旧存在,请进一步分享具体的硬件初始化和FatFs调用代码片段,以便进行深入分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 2月26日

悬赏问题

  • ¥15 基于ffmpeg 编码成yuv420p nv12的问题
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?
  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument