OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8191|回复: 14

文件系统FATFS 挂载SD卡,程序卡死问题

[复制链接]

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
发表于 2021-9-25 18:32:00 | 显示全部楼层 |阅读模式
1金钱
当我把SD卡插入卡槽,
程序执行以下语句
    exfuns_init();                      /* 为fatfs相关变量申请内存 */
    f_mount(fs[0], "0:", 1);            /* 挂载SD卡 */    //程序就卡在这

当拔下SD卡 便可执行过去
实在找不到原因所在 求解

最佳答案

查看完整内容[请看2#楼]

http://www.openedv.com/forum.php?mod=viewthread&tid=330730 解决方案
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2021-9-25 18:32:01 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-9-26 01:33:06 | 显示全部楼层
看返回值,根据返回值分析问题
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2021-9-26 23:21:42 | 显示全部楼层
正点原子 发表于 2021-9-26 01:33
看返回值,根据返回值分析问题

好的  我去试试
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2021-9-27 16:02:33 | 显示全部楼层
返回什么错误了?
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2021-9-27 23:33:07 | 显示全部楼层
在进一步调试中
当删除text_show_string_middle()函数的时候,
    exfuns_init();                              //为fatfs相关变量申请内存  
    f_mount(fs[0],"0:",1);                      //挂载SD卡
    res = f_mount(fs[1],"1:",1);              //挂载FLASH.
这三行代码能过运行

当加入
text_show_string_middle()函数的时候 ,程序会在    f_mount(fs[0],"0:",1);                      //在这里卡死

代码如下
/**
* @brief       在指定宽度的中间显示字符串
*   @note      如果字符长度超过了len,则用text_show_string_middle显示
* @param       x,y   : 起始坐标
* @param       str   : 字符串
* @param       size  : 字体大小
* @param       width : 显示区域宽度
* @param       color : 字体颜色
* @retval      无
*/
void text_show_string_middle(uint16_t x, uint16_t y, char *str, uint8_t size, uint16_t width, uint16_t color)
{
    uint16_t strlenth = 0;
    strlenth = strlen((const char *)str);
    strlenth *= size / 2;

    if (strlenth > width) /* 超过了, 不能居中显示 */
    {
        text_show_string(x, y, lcddev.width, lcddev.height, str, size, 1, color);
    }
    else
    {
        strlenth = (width - strlenth) / 2;
        text_show_string(strlenth + x, y, lcddev.width, lcddev.height, str, size, 1, color);
    }
}
我发现一个很神奇的点
当加入text_show_string()用来显示汉字 并不会卡死 这是为什么呢

前面测试返回值的
发现程序卡死在
    switch (pdrv)
    {
    case SD_CARD :
        res = sd_read_disk(buff, sector, count);

        while (res)                                                            //卡死在这
        {
            {
                sd_init();        //重新初始化SD卡
                res = sd_read_disk(buff,sector,count);
                printf("sd rd error:%d\r\n",res);                                          //错误值为1
            }
        }
     
u8 SD_GetCardState(void)
{
  return((HAL_SD_GetCardState(&SDCARD_Handler)==HAL_SD_CARD_TRANSFER )?SD_TRANSFER_OK:SD_TRANSFER_BUSY);
}
例程有段代码是这个 是不是 HAL_SD_CARD_TRANSFER 的问题 我修改为 HAL_SD_CARD_READY 程序 没有卡死在这了
但还是卡死在挂载函数中

回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2021-9-27 23:35:00 | 显示全部楼层
这个问题 有一个特点   就是拔下SD卡 程序是不会被卡死的
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2020-10-7
在线时间
61 小时
发表于 2021-10-28 15:41:54 | 显示全部楼层
我也在搞SD卡读写,稿好几天了没有搞定  f_mount(fs[0],"0:",1);                         //挂载SD卡 也是卡这里
回复

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2020-10-7
在线时间
61 小时
发表于 2021-10-28 15:43:49 | 显示全部楼层
你的SPI和CS有没有加电阻,我的就是这个问题。拔掉卡可以通过,插上不行。后面加了电阻好了。初始化可以通过,但加载文件不对。
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2019-7-15
在线时间
20 小时
发表于 2021-11-5 12:19:21 | 显示全部楼层
CJC529 发表于 2021-9-27 23:33
在进一步调试中
当删除text_show_string_middle()函数的时候,
    exfuns_init();                   ...

我调试也是发现问题卡死在这,我的读取返回状态时0x04,说是Data time out,楼主解决了吗?
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2021-11-5 22:15:23 | 显示全部楼层
MMagicLoren 发表于 2021-11-5 12:19
我调试也是发现问题卡死在这,我的读取返回状态时0x04,说是Data time out,楼主解决了吗?

我都读取不到返回状态,我是修改了延时函数改好的,我觉得应该是滴答定时器冲突了
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2022-4-27
在线时间
1 小时
发表于 2022-4-27 16:39:32 来自手机 | 显示全部楼层
修改一下delay.c文件就好了吗
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2022-4-27 22:59:40 | 显示全部楼层
lijy 发表于 2022-4-27 16:39
修改一下delay.c文件就好了吗

对,改了延时函数
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2023-7-28
在线时间
4 小时
发表于 2023-8-8 18:07:47 | 显示全部楼层
CJC529 发表于 2022-4-27 22:59
对,改了延时函数

哥 这个延时函数具体要修改哪里呀  谢谢
回复

使用道具 举报

61

主题

333

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1311
金钱
1311
注册时间
2021-4-28
在线时间
496 小时
 楼主| 发表于 2023-8-8 19:44:12 | 显示全部楼层
17519236237 发表于 2023-8-8 18:07
哥 这个延时函数具体要修改哪里呀  谢谢

http://www.openedv.com/forum.php?mod=viewthread&tid=330730 解决方案
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 04:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表