项目中发现的SD卡部分的Bug

基于GD32H7的SDBootloader代码,以及BUG解决 目的是实现GD32H759系统板的SDbootloader,进行SD升级,思路可以参考硬汉哥的教学流程就是通过外部设备获取代码的二进制可执行文件,也就是bin文件,可以直接写入到内部Flash中执行.为此为了减少上位机的依赖,我选择使用SD存储bin文件,读取后写入Flash中,通过板载的按键来切换升级代码或者直接启动APP. 阅读详情

 最近项目中SD卡驱动出了些很奇怪的问题,客户那边的Map有个特点,在运行的过程中会始终维护文件系统的Handle,如果发现Handle出现错误那么就会提示说SD卡存在问题。而在驱动中在插,拔卡的时候都会发相关的消息给Map。在前面遇到说没有拔卡,而只是在系统经过Suspend/Resume之后,突然出现SD卡找不到的对话框提示。开始的时候经过简单的调试,发现实际卡是可以使用的,只是说在系统Suspend/Resume之后有了一次Unmount,Mount的动作导致文件系统重新加载了,这样之前的文件系统Handle自然就不存在了那么就自然会出现这个问题了。接下来分析什么情况会导致出现Unmount,Mount的动作。由于我们是需要支持文件续传的,那么自然文件系统的Handle也是需要保留的。能够导致文件系统重新加载要么是PnpDelayTimeOut的时间到了,要么是在Suspend的时候换卡了,导致后续判断卡的ID时出现错误从而重新给新的卡加载新的文件系统。

  根据上面的分析判断,在操作过程中没有换过卡,那么后一种情况不会发生了。那么一定是前一种情况了,那么在驱动部分和存储管理部分加入Celog信息去捕捉需要的信息,结果发现了一个情况:一只AP在系统启动的过程中去读取SD卡,而此时SD卡是不能够操作的,自然会导致读取出现Error。因为要支持续传,在系统Resume之后,驱动部分会去做拔卡然后插卡的动作,目的是让卡重新走一遍初始化过程(这里是卡的初始化,而不是SD Controller的初始化),那么在做了拔卡的动作后到Unload SDMemory之前对于文件系统来讲,SD卡这个设备是可以操作的(电源管理部分置为PowerOn)。等到Unload SDMemory之后,文件系统部分会把SD卡的文件系统的结构标记上Detached的flag,那么这时透过文件系统对SD卡的操作会被文件系统部分给保护起来(实际在这里发现flag为不能操作,那么会去Sleep一小段时间),仔细想下这部分的确是缺少保护,不过一般情况下AP的优先级达不到那么高,所以一般不会出问题。其实在这里可以在存储管理部分的Notify函数中去判断,如果是SD卡的文件系统,那么可以先把Flag置为Detached,之后置POWERON,随后在重新加载成功之后这个Detached标志会置~Detached。不过后来发现问题并不是由这里引起的。

  在后面的调试过程中发现,在过了800ms左右卡就被Unmount掉了,根本离Delaytime还早。那么只有后一种情况了,加入调试信息看果然是在读取StorageId的时候比较两次的Id不同导致的。但是对于同一张卡,Id怎么会不同?仔细看了Sdmemmain部分的代码发现在读取Id时候有问题,在最后的12个字节填充ID的时候,实际前10个Byte填进了Id,第11个Byte填字符串结束符'/0',而第12个Byte没受代码控制。那么这第12个Byte的值就随机了,根据申请到内存时上面的值决定,这样就会导致使用memcmp来比较时会出现错误。后来检查了存储管理部分,发现在这部分也没有做初始化动作,所以就导致了这个问题的产生。

STM32下对SD的写入 文章目录一、SD是什么?1.SD模块的概念2.SD管脚的定义3.SD相关操作命令二、实验过程1.代码2.读入数据总结 一、SD是什么? 1.SD模块的概念 SD读写是指单片机读写SD/TFSD是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。 SD是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多, 阅读详情

相关推荐

华为手机将微信聊天记录迁移到 SD

前言 公司销售的微信聊天记录很多 , 需要无损迁移到 sd 。 百度搜索的教程几乎没有卵用 , 什么 //switchard 现在都是没用的 ! 每个手机的微信聊天记录几乎是十几个G , 自己摸索了一段时间 , 成功迁移 , 特地记录 , 防止后人踩坑 。 首先声明微信版本 , 防止微信更新后 ,更改了备份设置 , 大家请注意 : 本人测试的手机微信版本 : 7.0.3 。 电脑...

我的博客 4万+

热拔插SD报I0错误

[ 472.159277] mmcblk0: unknown error -1 sending read/write command, card status 0xb00 [ 472.181708] end_request: I/O error, dev mmcblk0, sector 0 [ 472.188043] Buffer I/O error on device mmcblk0, l...

庄山浪水 2034

用STM32F103完成对SD的数据写入

一、SD协议原理 片初始化和识别流程 当总线被激合后,主机就开始处理的初始化和识别。在主机发送SD_SEND_OP_COND(ACMD41)命令开始处理SD初始化时,主机会在ACMD41的参数中设置它的操作条件和设置OCR中的HCS位。HCS位被设置为1表示主机支持SDHC或者SDXC。HCS被设置为0表示主机不支持SDHC和SDXC。 利用OCR里面的busy位来通知主机ACMD41的初始化已经完成。如果busy位为0,表示还在初始化,如果busy位为1,说明初始化已经完成。主机会在1

qq1742517469的博客 1882

SD中block和sector的含义

近期在写SD驱动程序。经查阅datasheet后,整理如下: 首先要了解的是: SD协议中 与 HardDisk(文件系统)的block和sector不一个意思。 SD可协议见《Part_1_Physical_Layer_Simplified_Specification_

软件开发、电子设计 1万+

Linux设备驱动子系统第二弹 - SD

1. 总论 2. 主控制器 3. 协议层 4. 块设备 1. 总论  1.1 概念 MMC - MultiMedia CardSD    - Secure Digital Card 1.2 分类 按存储大小,普通SD(2GB,按体积大小,普通SD,mini-SD,micro-SD(TF) 1.3 速度 默认模式: 12.5MB/s高速模式: 25MB/

我的嵌入式人生 1万+

SD存储结构

SDFAT32文件系统/*****************************************************************************************************************************************************************************一 通用概念(适用于硬盘、U...

coder 1万+

硬盘基本知识(磁头、磁道、扇区、柱面)

概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头 硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。 如

jijianshuai的专栏 8116

运用STM32对SD数据读取

文章目录一、利用Altium Designer 18绘制原理图1 Altium Designer 18的安装1.1 下载和破解1.2 添加元件库2 stm32最小系统的电路原理图3 STM32+SD 的系统原理图设计3.1 SD物理结构3.2 SD引脚定义3.3 STM32+SD 的系统原理图绘制二、SD的数据读取1 建立工程2 修改代码3 烧录运行4 结果展示三、总结四、参考资料 一、利用Altium Designer 18绘制原理图 1 Altium Designer 18的安装 1.1 下载

weixin_48912898的博客 5822

Android Q存储SD-Android29 存储外置SD

最近公司相机升级到AndroidQ 遇到无法存储SD,原来是Goole抛弃了原有的API(不是过时,是抛弃,导致之前的存储API不能用)查看Google API 进行了代码更换, 在在更换过程中遇到了比较多的坑,将部分关键代码记录下来,方便下次使用。 如果不使用外置可插拔SD的AndroidQ存储可以使用如下方法暂时不用 AndroidQ的存储方式 在AndroidManifest.xml...

小路塔的博客 5486

stm32 CubeMx 实现SD/sd nand FATFS读写测试

本文将主要分享关于使用 CubeMx 配置 stm32 的工程,通过SDIO总线完成 SD/SD nand 的读写,并配置FATFS,采用文件操作实现对 SD/SD nand 的读写操作;此外还将分享博主在调试过程中遇到的一些问题,比如CubeMx自动生成的驱动存在的bug等,以及分享关于驱动部分的代码分析!

爱出名的狗腿子 2447

【CubeMX+STM32】SD 文件系统读写 FatFs+SDIO+DMA

本篇,将使用CubeMX+Keil,创建一个SD的 SDIO+FatFS+DMA 文件系统读写工程。

qq_49053936的博客 6817

Keil MDK STM32系列(九) 基于HAL和FatFs的FAT格式SDTF读写

Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401开发 Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发 Keil MDK STM32系列(四) 基于抽象外设库HAL的STM32F401开发 Keil MDK ...

IOsetting的专栏 5691

stm32mp157存储数据到sd

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 722

【CubeMX+STM32】SD SDIO通信 DMA读写

本示例示范如何通过DMA读写SD。将通过CubeMX+Keil,创建一个SD的DMA读写工程。

qq_49053936的博客 3951

用STM32F103完成对SD的数据读取

一、SD简介 1、SDIO简介 SD (Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对 SD 进行 读写通信操作一般有两种通信接口可选,一种是 SPI 接口,另外一种就是 SDIO 接口。 SDIO 全称是安全数字输入/输出接口,多媒体(MMC)、SD SD I/O 都有 SDIO 接口。 STM32F10x 系列控制器有一个 SDIO 主机接口,它可以与 MMC SD SD I/O 以及 CE-ATA 设备进行数据传输。MMC 可以

XTF201029的博客 2577

关于SD挂载失败问题的解决方法

单片机为STM32F103RBT6,SD为金士顿8G。 在SD初始化通过后,在挂载SD时,遇到了问题,挂载部分代码如下: // exfuns_init(); //为fatfs相关变量申请内存 while(FR_OK != f_mount(pfs[0],"0:",1)) //挂载SD { printf("SD Mount Failed ! \r\n");...

液体海马的博客 1万+

android fatfs写sd报错,如何解决?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1104
上一篇: Wince5.0下如何将Public和Private下的代码移植到BSP下
下一篇: (转)windowsCE异常和中断服务程序初探 (转自 nasiry's blog)
gsymichael
博客等级 码龄19年 42粉丝 11原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值