硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3763|回复: 10
收起左侧

[有问必答] 关于F103的SD驱动卡死

[复制链接]

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2020-9-9 13:06:34 | 显示全部楼层 |阅读模式
目前的场景是传感器收集数据,数据会4秒一次保存到tf卡,然后数据会通过上位机轮询发送出去。用的freertos,这个分成2个任务。现在的问题的,一开始运行还可以,运行大约1个小时(不定)。tf卡保存不了了,卡死在读dma检测那里。求指教。
c0e15b61901e604df75dc3df4ce1e74.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-9-9 17:01:51 | 显示全部楼层
1、将你卡使用这个小工具格式化一下,这个是SD专用格式化工具

SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1
http://www.armbbs.cn/forum.php?mod=viewthread&tid=96181


2、然后软件实现你可以试试采用f_open后,再f_write + f_sync的方式。

3、驱动的话,你也可以试试我们的:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=17658&extra=page%3D1

QQ截图20200909170400.png

回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-9-10 16:22:12 | 显示全部楼层
eric2013 发表于 2020-9-9 17:01
1、将你卡使用这个小工具格式化一下,这个是SD专用格式化工具

SD卡联盟发布的SD/SDHC/SDXC格式化小软件V ...

发现个小bug,diskio文件的写文件函数里面的dma判断用了读的SD_WaitReadOperation的函数
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-9-10 16:28:27 | 显示全部楼层
叶子君 发表于 2020-9-10 16:22
发现个小bug,diskio文件的写文件函数里面的dma判断用了读的SD_WaitReadOperation的函数

对,这个要改,批量写入有影响,F1系列停止更新了,就没有再管了。

F4系列专门做了个更加稳定的版本,注意的问题略多

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)
http://www.armbbs.cn/forum.php?m ... 8560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-9-11 10:41:31 | 显示全部楼层
eric2013 发表于 2020-9-10 16:28
对,这个要改,批量写入有影响,F1系列停止更新了,就没有再管了。

F4系列专门做了个更加稳定的版本, ...

目前测试是没有死机的情况,看了下代码,是加了个超时时间退出来的。有个奇怪的问题,就是我写文件都是先建文件夹,然后在文件夹里面写文件数据。超过10个文件夹就删除旧文件夹。测试一天后,发现,文件夹没有删除,后面的文件夹只有文件夹,没有数据了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-9-11 11:15:44 | 显示全部楼层
叶子君 发表于 2020-9-11 10:41
目前测试是没有死机的情况,看了下代码,是加了个超时时间退出来的。有个奇怪的问题,就是我写文件都是先 ...

多找几个好用的SD卡测测,务必买正品。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-9-18 14:45:56 | 显示全部楼层
eric2013 发表于 2020-9-11 11:15
多找几个好用的SD卡测测,务必买正品。

写多块调用SD_WriteMultiBlocks写入9600个字节,随机性的前2-4个字节会写错误数据。目测是4字节对齐问题,目前修改如下,可以写正确了。
__align(4) uint8_t SDIO_DATA_BUFFER[512]; //定义一个4字节对齐的数组
                                else
                        {
                                /* 此处存在疑问: 扇区个数如果写 count ,将导致最后1个block无法写入 */
                                //Status = SD_WriteMultiBlocks((uint8_t *)buff, sector << 9 ,SECTOR_SIZE, count);
                               
                                //这里写入数据 有时候前2 - 4个字节会少数据
                                //Status = SD_WriteMultiBlocks((uint8_t *)buff, sector << 9 ,512, count + 1);
                               
                                for(n = 0;n < count; n++)
                                {
                                        memcpy(SDIO_DATA_BUFFER,buff+(n*512),512);
                                        Status = SD_WriteBlock(SDIO_DATA_BUFFER, (sector << 9) + n*512 , 512);
                                        /* SDIO工作在DMA模式,需要检查操作DMA传输是否完成 */
                                        Status = SD_WaitWriteOperation();
                                        if (Status != SD_OK)
                                        {
                                                return RES_ERROR;
                                        }
                                }
                        }
不知道版主你是怎么解决这个问题的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-9-18 15:09:15 | 显示全部楼层
叶子君 发表于 2020-9-18 14:45
写多块调用SD_WriteMultiBlocks写入9600个字节,随机性的前2-4个字节会写错误数据。目测是4字节对齐问题 ...

此贴第2条:

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)
http://www.armbbs.cn/forum.php?m ... 8560&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-9-18 15:52:28 | 显示全部楼层
eric2013 发表于 2020-9-18 15:09
此贴第2条:

继续提升STM32F4的4线SDIO DMA方式的读写稳定性,发布新版案例(2020-06-30)

F1和F4的dma配置不一样把。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106882
QQ
发表于 2020-9-18 16:00:03 | 显示全部楼层
叶子君 发表于 2020-9-18 15:52
F1和F4的dma配置不一样把。

F1系列的话,推荐每次读写不超过512字节,简单省事,有效避免DMA对齐问题。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2020-9-18 16:30:51 | 显示全部楼层
eric2013 发表于 2020-9-18 16:00
F1系列的话,推荐每次读写不超过512字节,简单省事,有效避免DMA对齐问题。

谢谢版主的解答。暂时先这样解决。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 19:31 , Processed in 0.359916 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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