OpenEdv-开源电子网

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

探索者STM32F407,如何将SD卡全片擦除?

[复制链接]

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-11-6
在线时间
8 小时
发表于 2015-12-28 17:13:05 | 显示全部楼层 |阅读模式
2金钱
我现在使用的是探索者开发板STM32F407,想要实现SD卡的全片擦除,但是探索者没有相关的程序源码,我在论坛上只能找到MINI开发板的程序,如下:
void SD_Format()
{
    u8 r1;
    u32 sector;
    if(SD_Type!=SD_TYPE_V2HC)
        sector = sd_size * 512;//转换为字节地址
    if(SD_Type == SD_TYPE_MMC)
    {
        do
        {      
            r1=SD_SendCmd(CMD35,0,0X01);//设置擦除首地址
            r1=SD_SendCmd(CMD36,sector,0X01);//设置擦除最后地址
        }while(r1!=0 && sector--);
        while(1);
    }   
    else
    {
        r1=SD_SendCmd(CMD32,0,0X01);//
        r1=SD_SendCmd(CMD33,sector,0X01);//
    }

    r1=SD_SendCmd(CMD38,0,0x01);// 开始擦除
    if(r1 == 0)
    {
        ;
    }
}

在探索者开发板的资料中,我找不出与SD_SendCmd()函数功能相同的函数,特求助各位大神以及原子哥,多谢了!


最佳答案

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

[mw_shl_code=applescript,true]SD_Error SD_Erase(long long startaddr, long long endaddr) { SD_Error errorstatus = SD_OK; uint32_t delay = 0; __IO uint32_t maxdelay = 0; uint8_t cardstate = 0; /*!< Check if the card coomnd class supports erase command */ if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0) { errorst ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-12-28 17:13:06 | 显示全部楼层

自己测试一下

[mw_shl_code=applescript,true]SD_Error SD_Erase(long long startaddr, long long endaddr)
{
        SD_Error errorstatus = SD_OK;
        uint32_t delay = 0;
        __IO uint32_t maxdelay = 0;
        uint8_t cardstate = 0;
        
        /*!< Check if the card coomnd class supports erase command */
        if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0)
        {
                errorstatus = SD_REQUEST_NOT_APPLICABLE;
                return errorstatus;
        }
        
        maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2);
        
        if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED)
        {
                errorstatus = SD_LOCK_UNLOCK_FAILED;
                return errorstatus;
        }
        
        if (CardType == SDIO_HIGH_CAPACITY_SD_CARD)
        {
                startaddr /= 512;
                endaddr /= 512;
        }
        
        /*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */
        if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) ||\
                (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) ||\
            (SDIO_HIGH_CAPACITY_SD_CARD == CardType))
        {
                /*!< Send CMD32 SD_ERASE_GRP_START with argument as addr  */
                SDIO_CmdInitStructure.SDIO_Argument =(uint32_t)startaddr;
                SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START;
                SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
                SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
                SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
                SDIO_SendCommand(&SDIO_CmdInitStructure);
               
                errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START);
                if (errorstatus != SD_OK)  return errorstatus;
               
                /*!< Send CMD33 SD_ERASE_GRP_END with argument as addr  */
                SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)endaddr;
                SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END;
                SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
                SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
                SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
                SDIO_SendCommand(&SDIO_CmdInitStructure);
               
                errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END);
                if (errorstatus != SD_OK)  return errorstatus;
        }
        
        /*!< Send CMD38 ERASE */
        SDIO_CmdInitStructure.SDIO_Argument = 0;
        SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE;
        SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
        SDIO_CmdInitStructure.SDIO_Wait     = SDIO_Wait_No;
        SDIO_CmdInitStructure.SDIO_CPSM     = SDIO_CPSM_Enable;
        SDIO_SendCommand(&SDIO_CmdInitStructure);
        
        errorstatus = CmdResp1Error(SD_CMD_ERASE);
        if (errorstatus != SD_OK)  return errorstatus;
        
        for (delay = 0; delay < maxdelay; delay++)
        {}
        
        /*!< Wait till the card is in programming state */
        errorstatus = IsCardProgramming(&cardstate);
        delay = SD_DATATIMEOUT;
        while ((delay > 0) && (errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate)))
        {
                errorstatus = IsCardProgramming(&cardstate);
                delay--;
        }
        
        return errorstatus;
}[/mw_shl_code]
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-12-28 23:36:11 | 显示全部楼层
没有提供这个函数,你得去看看sd卡的白皮书,找下全片擦除的指令。
回复

使用道具 举报

7

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
311
金钱
311
注册时间
2015-8-18
在线时间
63 小时
发表于 2015-12-29 00:41:21 | 显示全部楼层
是不是格式化SD卡,如果是FATFS有函数可以直接格式化SD卡,那样基本空了。
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2015-12-29 08:42:08 | 显示全部楼层
按照mini板的程序和思路,移植啊
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-11-6
在线时间
8 小时
 楼主| 发表于 2015-12-31 16:12:09 | 显示全部楼层
八度空间 发表于 2015-12-28 17:13
[mw_shl_code=applescript,true]SD_Error SD_Erase(long long startaddr, long long endaddr)
{
         ...

多谢大神指导,待我前去测试一番。另外,估计这就是程序的魅力了。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 21:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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