stm32读写SD卡(SDIO模式)

这篇具有很好参考价值的文章主要介绍了stm32读写SD卡(SDIO模式)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、SD卡简介

二、源码下载

三、移植条件

1、芯片参数

2、硬件连接

四、驱动代码

1、依赖宏如下

2、驱动代码实现

3、测试代码

4、运行截图

五、总结


一、SD卡简介

SD卡有SDIO驱动模式和SPI驱动模式,本例中使用SDIO模式驱动SD卡。

二、源码下载

https://download.csdn.net/download/qq_30095023/88702705https://download.csdn.net/download/qq_30095023/88702705

三、移植条件

1、芯片参数

芯片类型:STM32F407ZGT6。

flash大小为1024KB,RAM大小 128KB。

2、硬件连接

本例使用开发板上的SD卡插口,测试所用SD卡容量大小为8GB。

stm32读写SD卡(SDIO模式),stm32,嵌入式硬件,单片机

stm32读写SD卡(SDIO模式),stm32,嵌入式硬件,单片机

四、驱动代码

note: u8 、u16、u32等为自定义数据类型,编译报错请按需修改。LOG_XX为日志打印,请按需替换。

1、依赖宏如下

定义一些SD卡的类型

//SD卡类型
#define ERR         0x00
#define MMC         0x01
#define V1          0x02
#define V2          0x04
#define V2HC        0x06

2、驱动代码实现


1)、ENTER_SD_BLOCK_SIZE定义SD卡的物理扇区大小为512Byte。

2)、 函数b_sd_read_write_byte用来读写数据(兼容SPI模式,忽略)。

3)、函数b_sd_read_data用来从SD卡读取指定长度的数据。

4)、函数b_sd_send_block_data用来向SD卡写入数据。

5)、函数b_sd_init用来初始化SD卡,需要在使用SD卡前调用一次。

6)、函数b_sd_get_cid用来查询SD卡的CID。

7)、函数b_sd_get_csd用来查询SD卡的CSD。

8)、函数b_sd_read_sector用来读扇区数据,该接口一般用于FatFs文件系统。

9)、函数b_sd_write_sector用来写扇区数据,该接口一般用于FatFs文件系统。

FatFs文件系统移植请参考:FatFs移植到STM32(SD卡)_BIN-XYB的博客-CSDN博客

10)、函数b_sd_get_sector_number用来查询SD卡的扇区数量。

11)、函数b_sd_sync_data用来保存SD卡的数据。

完整源码如下:

#include "sd_driver.h"

static u8 sd_type = 0;
#define ENTER_SD_BLOCK_SIZE      (512)
#define ENTER_SD_SECTOR_SIZE     (ENTER_SD_BLOCK_SIZE)

inline void b_sd_set_speed(u32 speed)
{
    return;
}

u8 b_sd_init(void)
{
    if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    {
        HAL_SD_CardInfoTypeDef sdcard_info;
        HAL_SD_GetCardInfo(&hsd, &sdcard_info);
        sd_type = sdcard_info.CardType;
        return HAL_OK;
    }
    else
    {
        return HAL_ERROR;
    }
}

u8 b_sd_get_cid(u8* cid_data)
{
    if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    {
        HAL_SD_CardCIDTypeDef sdcard_cid;
        HAL_SD_GetCardCID(&hsd,&sdcard_cid);
        memcpy(cid_data, hsd.CID, 16);
    }
    else
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}

u8 b_sd_get_csd(u8 *csd_data)
{
    if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    {
        HAL_SD_CardCSDTypeDef sdcard_csd;
        HAL_SD_GetCardCSD(&hsd,&sdcard_csd);
        memcpy(csd_data, hsd.CSD, 16);
    }
    else
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}

s32 b_sd_read_sector(u32 sector, u8 number, u8*data, u32 timeout)
{
    sector <<= 9;
    if(HAL_SD_ReadBlocks(&hsd, data, sector, number, number * 10) == HAL_OK)
    {
        while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){};
    }
    else
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}


s32 b_sd_write_sector(u32 sector, u8 number, u8 *data, u32 timeout)
{
    sector <<= 9;
    if(HAL_SD_WriteBlocks(&hsd, data, sector, number, number * 10) == HAL_OK)
    {
        while(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER){};
    }
    else
    {
        return HAL_ERROR;
    }
    return HAL_OK;
}

u32 b_sd_get_sector_number(void)
{
    u32 capacity = 0;

    if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    {
        HAL_SD_CardInfoTypeDef sdcard_info;
        HAL_SD_GetCardInfo(&hsd, &sdcard_info);
        capacity = sdcard_info.BlockNbr;
    }
    else
    {
        return HAL_ERROR;
    }
    return capacity;
}

u32 b_sd_get_sector_size(void)
{
    return ENTER_SD_SECTOR_SIZE;
}

u32 b_sd_get_block_size(void)
{
    return ENTER_SD_BLOCK_SIZE;
}

u32 b_sd_sync_data(void)
{
    return 0;
}

u8 b_sd_read_write_byte(u8 tx_data)
{
    u8 rx_data = 0;
    return rx_data;
}

3、测试代码

void b_sd_test_demo(void)
{
    static u8 test_buffer[ENTER_SD_SECTOR_SIZE] = {0};
    LOG_INFO("start b_sd_init\r\n");
    u8 ret = b_sd_init();
    u8 *p = test_buffer;
    LOG_INFO("b_sd_init:%d\r\n", sd_type);
    
    memset(test_buffer, 0, ENTER_SD_SECTOR_SIZE);
    ret = b_sd_get_cid(test_buffer);
    LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[0],p[1],p[2],p[3]);
    LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[4],p[5],p[6],p[7]);
    LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[8],p[9],p[10],p[11]);
    LOG_INFO("cid:%02X,%02X,%02X,%02X\r\n", p[12],p[13],p[14],p[15]);
    LOG_INFO("b_sd_get_cid:%d\r\n", ret);
    
    memset(test_buffer, 0, ENTER_SD_SECTOR_SIZE);
    ret = b_sd_get_csd(test_buffer);
    LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[0],p[1],p[2],p[3]);
    LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[4],p[5],p[6],p[7]);
    LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[8],p[9],p[10],p[11]);
    LOG_INFO("csd:%02X,%02X,%02X,%02X\r\n", p[12],p[13],p[14],p[15]);
    LOG_INFO("b_sd_get_csd:%d\r\n", ret);

    u32 num = b_sd_get_sector_number();
    LOG_INFO("b_sd_get_sector_number:%d\r\n", num);
    LOG_INFO("sd_type:%d\r\n", sd_type);
}

4、运行截图

stm32读写SD卡(SDIO模式),stm32,嵌入式硬件,单片机

如上图所示,可以成功读取到SD卡cid和csd。

五、总结

如有问题请指出,感谢!文章来源地址https://www.toymoban.com/news/detail-821757.html

到了这里,关于stm32读写SD卡(SDIO模式)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 嵌入式硬件——stm32F103C8T6

    嵌入式硬件——stm32F103C8T6

    如下图:    处理器核心:STM32F103C8T6内置了ARM Cortex-M3处理器,这是一种高性能、低功耗的32位RISC处理器,适用于嵌入式系统。 时钟速度:它可以工作在不同的时钟速度,最高主频可达72 MHz。 存储器:包括64KB的Flash程序存储器用于存储程序代码,以及20KB的SRAM用于存储数据和

    2024年02月05日
    浏览(69)
  • 嵌入式毕设分享 stm32人脸识别快递柜系统(源码+硬件+论文)

    嵌入式毕设分享 stm32人脸识别快递柜系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年04月10日
    浏览(98)
  • 嵌入式毕设分享 stm32智能鱼缸监控投喂系统(源码+硬件+论文)

    嵌入式毕设分享 stm32智能鱼缸监控投喂系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年03月17日
    浏览(16)
  • 嵌入式毕设分享 stm32 RFID智能仓库管理系统(源码+硬件+论文)

    嵌入式毕设分享 stm32 RFID智能仓库管理系统(源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(45)
  • STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)

    STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)

    ==== 文章汇总(有代码汇总) ==== 准备看看这方面的知识,一时间还没不清有什么区别,先补补课,不需要的跳过。 参考文章(内容来源):http://www.360doc.com/content/21/1125/22/59057945_1005908465.shtml 主要写这两个:SD卡、TF卡 共同点:SD、TF、MMC都是在MMC基础上演化发展不同的规范,

    2024年02月09日
    浏览(13)
  • STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 SDIO使用FatFs中间件读写4线SD卡,并实现以轮询方式读写SD卡或以DMA方式读取SD卡 FatFs文件系统相关知识请读者

    2024年02月19日
    浏览(14)
  • 【嵌入式】STM32计时器编码器接口模式使用

    【嵌入式】STM32计时器编码器接口模式使用

    使用STM32调试电机或传感器时经常会使用到计数器的编码器接口模式,本文主要记录该模式的固件库配置方法,并给出使用该模式获取光栅测距值的实例。 硬件: STM32F103C8T6 光栅测距传感器 编码器接口模式为STM32计时器的一种特殊使用模式,该模式下可对编码器输出的脉冲信

    2024年02月20日
    浏览(12)
  • 嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

    嵌入式-Stm32-江科大基于标准库的GPIO的八种模式

    (推荐先看文章:《 嵌入式-32单片机-GPIO推挽输出和开漏输出》) 下文图都是从参考手册借阅:STM32F10xxx(中文),大概页数是110/775左右 GPIO (General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式 引脚电平:0V~3.3V,部分引脚可容忍5V(有FT标识) 输出模式 下可控

    2024年01月20日
    浏览(45)
  • stm32在SDIO模式下SD写入错误的问题

    stm32在SDIO模式下SD写入错误的问题

    1、问题描述 使用FAT32 f_write 多次执行写操作时,会报FR_DISK_ERR错误,而且是刚开始写不报错,写几次后会一直报错。 设断点跟踪到HAL_SD_WriteBlocks中,在调用SDMMC_CmdWriteMultiBlock时,会报SDMMC_ERROR_TX_UNDERRUN,意思 是Transmit FIFO underrun 2、原因分析 如下图所示,SDMMC开始写操作时,首

    2023年04月24日
    浏览(12)
  • STM32 PWM模式与输出比较模式的区别。PWM占空比不生效,在STM32CubeMX中配置PWM的两种模式——蓝桥杯嵌入式

    STM32 PWM模式与输出比较模式的区别。PWM占空比不生效,在STM32CubeMX中配置PWM的两种模式——蓝桥杯嵌入式

      🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届

    2023年04月15日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包