恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

【HAL库】STM32CubeMX开发----STM32F407----SD卡存储 SDIO通信DMA读写

  • 首页
  • 资讯中心
  • /
  • 【HAL库】STM32CubeMX开发----STM32F407----SD卡存储 SDIO通信DMA读写

相关资讯

TI DRV2604触觉驱动评估板硬件设计全解析与实战指南 2026/8/2 18:53:52
程序员客栈适合什么样的开发者?接项前先做四项判断 2026/8/2 18:53:52
深入解析ADS7851EVM-PDK:高精度ADC评估套件的硬件设计与性能测试实战 2026/8/2 18:53:53

最新资讯

C2000实时控制入门:从DSP/MCU差异到Flash固化实战
从信息过载到决策支持:构建可持续的晨间简报体系
C#上位机开发实战:基于DMC2410A.dll的运动控制全链路指南
AI人声分离技术实战:从原理到工程化应用指南
MATLAB调用CPLEX求解机组组合:2变量模型实战解析
深入理解Shell核心原理:从命令解释器到高效配置与脚本编程

今日推荐

流式背压机制:避免前端渲染卡死与内存暴涨的滑动窗口限流
幂等性设计:在 Agent 自动重试与工具执行中的防重复扣费实战
向量检索与标量过滤混合查询:PostgreSQL pgvector 与 Milvus 的过滤下推实操

本周热门

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析
数字电路时序基石:深入理解建立时间与保持时间
蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

【HAL库】STM32CubeMX开发----STM32F407----SD卡存储 SDIO通信DMA读写

发布时间:2026/9/5 14:13:17
【HAL库】STM32CubeMX开发----STM32F407----SD卡存储 SDIO通信DMA读写 前言关于SDIO和SD卡的基础信息请参考【HAL库】STM32CubeMX开发----STM32F407----SD卡存储 SDIO基础通信本次主要介绍SDIO通过DMA读写SD卡数据不占用CPU的运行时间。一、使用STM32CubeMX----新建工程步骤1打开 STM32CubeMX 软件具体STM32CubeMX界面如下步骤2选择 从MCU开始我的项目步骤3选择MCU芯片我们本次实验选择STM32F407VET6芯片做MCU。进入工程编辑具体界面如下步骤4设置烧写方式为 SWD模式这一步必须选择一种烧写方式否则烧写一次程序后芯片中就没法再次烧写程序了。需要硬件重启才可以重新烧写程序。STM32烧写程序连接方式详解步骤5设置时钟源设置外部晶振为芯片系统时钟源。步骤6设置SDIOMode选择SD的四线模式即 SD 4 bits Wide bus.参数部分F4系列不用修改配置默认即可。F103系列需把时钟分频系数修改为 6即SDIOCLK Clock divide factor这一项由默认0改为6, 不然会通信失败。步骤7DMA配置Add添加SDIO_RXDMA功能参数默认。按照以上操作添加SDIO_TXDMA功能参数默认。勾选SDIO global interrupt修改SDIO中断优先级具体如下图步骤8时钟配置重点箭头所指的Q值它用于控制USB 、SDIO和随机数生成器的时钟必须为48M。步骤9项目编辑步骤10代码生成编辑步骤11点击 GENERATE CODE 生成代码新建的工程已经生成接下来就是对工程代码的编辑。二、使用keil5----编辑程序想要使用keil5打开工程需要电脑先安装 keil5编译环境具体操作流程。可以点击下方文章链接Keil5编译环境搭建流程----STM32和GD32步骤1使用keil5打开工程点击工程文件中的MDK-ARM文件打开keil5工程打开代码编译运行一下没有错误和告警为正常。步骤2用户代码 编辑位置用户代码要写在USER xxxx BEGIN xxx和USER xxxx END xxx之间。这样下次使用STM32CubeMX重新生成代码后自己写的代码不会被删除。步骤3修改代码CubeMX生成的SDIO初始化代码有一个bug需要手动修改操作如下编译后右击 main.c 文件中函数 MX_SDIO_SD_Init(),在弹出菜单中Go To Definition Of …; 将跳转到SD卡初始化函数;跳转到 sdio.c文件的 MX_SDIO_SD_Init()函数内部后把下图位置中的 4B改为 1B 重点每次重新生成后都要手动修改一次。如果不修改初始化过程会导致程序卡死。步骤4使用到的HAL库函数typedefstruct{uint32_tCardType;//SD卡类型uint32_tCardVersion;//SD卡版本uint32_tClass;//SD卡等级uint32_tRelCardAdd;//SD卡地址uint32_tBlockNbr;//SD卡容量(块)uint32_tBlockSize;//SD卡块大小(字节)}HAL_SD_CardInfoTypeDef;//SD卡信息结构体typedefuint32_tHAL_SD_CardStateTypeDef;//SD卡状态信息#defineHAL_SD_CARD_READY0x00000001U//SD卡状态准备就绪#defineHAL_SD_CARD_IDENTIFICATION0x00000002U//SD卡识别状态#defineHAL_SD_CARD_STANDBY0x00000003U//SD卡待机状态#defineHAL_SD_CARD_TRANSFER0x00000004U//SD卡传输状态#defineHAL_SD_CARD_SENDING0x00000005U//SD卡正在发送状态#defineHAL_SD_CARD_RECEIVING0x00000006U//SD卡正在接收状态#defineHAL_SD_CARD_PROGRAMMING0x00000007U//SD卡编程状态#defineHAL_SD_CARD_DISCONNECTED0x00000008U//SD卡断开连接状态#defineHAL_SD_CARD_ERROR0x000000FFU//SD卡响应状态// 1、获取 SD 卡的状态---参数SD卡的句柄HAL_SD_CardStateTypeDefHAL_SD_GetCardState(SD_HandleTypeDef*hsd);// 2、获取 SD 卡的信息---参数SD卡的句柄、SD卡信息HAL_StatusTypeDefHAL_SD_GetCardInfo(SD_HandleTypeDef*hsd,HAL_SD_CardInfoTypeDef*pCardInfo);//3、读数据---参数SD卡的句柄、数据、块地址、块数量、超时msHAL_StatusTypeDefHAL_SD_ReadBlocks(SD_HandleTypeDef*hsd,uint8_t*pData,uint32_tBlockAdd,uint32_tNumberOfBlocks,uint32_tTimeout);//4、写数据---参数SD卡的句柄、数据、块地址、块数量、超时msHAL_StatusTypeDefHAL_SD_WriteBlocks(SD_HandleTypeDef*hsd,uint8_t*pData,uint32_tBlockAdd,uint32_tNumberOfBlocks,uint32_tTimeout);//5、擦除数据---参数SD卡的句柄、块起始地址、块结束地址HAL_StatusTypeDefHAL_SD_Erase(SD_HandleTypeDef*hsd,uint32_tBlockStartAdd,uint32_tBlockEndAdd);//6、通过DMA读取数据---参数SD句柄、数据、块起始地址、需要读取的块数量;HAL_StatusTypeDefHAL_SD_ReadBlocks_DMA(SD_HandleTypeDef*hsd,uint8_t*pData,uint32_tBlockAdd,uint32_tNumberOfBlocks);//7、通过DMA写入数据---参数SD句柄、数据、块起始地址、需要写入的块数量;HAL_StatusTypeDefHAL_SD_WriteBlocks_DMA(SD_HandleTypeDef*hsd,uint8_t*pData,uint32_tBlockAdd,uint32_tNumberOfBlocks);//8、DMA Tx发送传输完成中断回调函数---参数SD句柄voidHAL_SD_TxCpltCallback(SD_HandleTypeDef*hsd);//9、DMA Rx接收传输完成中断回调函数---参数SD句柄voidHAL_SD_RxCpltCallback(SD_HandleTypeDef*hsd);三、使用keil5----调试和运行主要使用串口1通过printf函数打印运行数据这部分操作主要参考【HAL库】STM32CubeMX开发----STM32F407----Uart串口通信实验实验SD卡-DMA读写数据在初始化的时候调用SD卡-写数据写入数据到SD卡然后在运行时周期读取SD卡数据。SD卡-DMA收发中断回调函数volatileuint8_tmyFlagSDReadReady0;// 读取传输完成标志; 重要CubeMX生成的Keil工程编译优化等级默认是3如果变量没有标记为易变的volatile编译器可能会认为其值在循环中不会改变从而导致优化后的代码无法正确检测到变量值的变化特别是在空循环体中。volatileuint8_tmyFlagSDWriteReady0;// 写入传输完成标志; 重要CubeMX生成的Keil工程编译优化等级默认是3如果变量没有标记为易变的volatile编译器可能会认为其值在循环中不会改变从而导致优化后的代码无法正确检测到变量值的变化特别是在空循环体中。/*DMA Tx传输完成中断回调函数*/voidHAL_SD_TxCpltCallback(SD_HandleTypeDef*hsd){myFlagSDWriteReady1;// 写入传输完成标志; 重要CubeMX生成的Keil工程编译优化等级默认是3如果变量没有标记为易变的volatile编译器可能会认为其值在循环中不会改变从而导致优化后的代码无法正确检测到变量值的变化特别是在空循环体中。}/*DMA Rx传输完成中断回调函数*/voidHAL_SD_RxCpltCallback(SD_HandleTypeDef*hsd){myFlagSDReadReady1;// 读取传输完成标志; 重要CubeMX生成的Keil工程编译优化等级默认是3如果变量没有标记为易变的volatile编译器可能会认为其值在循环中不会改变从而导致优化后的代码无法正确检测到变量值的变化特别是在空循环体中。}SD卡-DMA读数据voidUser_SD_ReadData_DMA(void){/*读测试读出测试位置原数据保存在ReadData[] */uint8_tReadData[1024]{0};printf(\r读取测试块的原数据\r\n);myFlagSDReadReady0;HAL_SD_ReadBlocks_DMA(hsd,ReadData,8,2);// 读SD卡数据块; 参数SD结构体、数据、块起始地址、读的块数量;while(myFlagSDReadReady0);// 等待卡的读操作结束for(uint32_ti0;i1024;i)// 打印 原数据{printf(%X ,ReadData[i]);}printf(\r\n);}SD卡-DMA写数据voidUser_SD_WriteData_DMA(void){/* 写测试在测试的块上写入数据 */uint8_tWriteData[1024]{0};for(uint32_ti0;i1024;i){WriteData[i]1024-i;}printf(\rSD卡 写入测试\r\n);myFlagSDWriteReady0;HAL_SD_WriteBlocks_DMA(hsd,WriteData,8,2);// 向SD卡写入数据块; 参数SD结构体、数据地址、块起始地址、写入的块数量、超时时间;while(myFlagSDWriteReady0);// 等待卡的读写操作结束printf(对指定块写入结束! \r写入的数据是\n);for(uint32_ti0;i1024;i)// 打印 写入的数据{printf(%X ,WriteData[i]);}printf(\r\n);}运行结果

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号