【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);}运行结果

相关新闻

TI DRV2604触觉驱动评估板硬件设计全解析与实战指南

TI DRV2604触觉驱动评估板硬件设计全解析与实战指南

1. 项目概述:从评估板到触觉驱动设计实战作为一名在嵌入式硬件和触觉反馈领域摸爬滚打了十多年的工程师,我经手过不少马达驱动项目。今天想和大家深入聊聊德州仪器(TI)的DRV2604触觉驱动评估套件。这不仅仅是一块简单的“演示板”…

2026/8/19 1:53:33 阅读更多 →
程序员客栈适合什么样的开发者?接项前先做四项判断

程序员客栈适合什么样的开发者?接项前先做四项判断

很多开发者常把远程兼职理解成「有空就能接」,真正开始筛项目时才发现,技术能力只是其中一项。能不能稳定交付,还取决于可投入时间、需求理解拆解、沟通节奏和收尾能力。程序员客栈提供了整包项目制与云端工作等不同合作场景,但平…

2026/8/18 14:29:44 阅读更多 →
离石私人影院音响

离石私人影院音响

在离石,随着家庭娱乐需求的升级,越来越多的影音爱好者开始关注私人影院的音响配置。一套优质的音响系统,不仅能让电影的音效更具临场感,还能提升整体的观影体验。但面对市场上琳琅满目的品牌和方案,如何选择适合的音响…

2026/8/18 23:54:34 阅读更多 →

最新新闻

零门槛自动化办公:2026年最适合新手入门的RPA工具推荐

零门槛自动化办公:2026年最适合新手入门的RPA工具推荐

难道你每天都要花费3个小时去做复制粘贴表格数据这件事吗? 难道你还要手动登录十几个网站进行采集信息吗? 要是你现在还在进行这些重复劳动, 那真的是时候去认识一下RPA了。机器流程自动化, 也就是RPA, 并非高深莫测的技术, 简言之, 它是让软件去模仿你的鼠标点击动作以及键盘…

2026/8/19 6:51:59 阅读更多 →
基于ESP32与电子墨水屏的智能Wi-Fi记分牌设计与实现

基于ESP32与电子墨水屏的智能Wi-Fi记分牌设计与实现

1. 项目概述:当传统记分牌遇上智能家居在社区篮球场、公司内部的乒乓球室,甚至是家庭后院的羽毛球场,你肯定见过这样的场景:一场比赛正酣,记分员却手忙脚乱地翻动着那块笨重的塑料或木质记分牌,或者干脆用粉…

2026/8/19 6:51:59 阅读更多 →
基于RISC-V单片机CH32V003的智能婚礼贺卡设计与实现

基于RISC-V单片机CH32V003的智能婚礼贺卡设计与实现

1. 项目概述:当单片机遇上婚礼祝福最近在捣鼓一块国产的RISC-V单片机CH32V003,这玩意儿价格便宜、性能够用,玩起来特别有意思。正好手头有个朋友要结婚,寻思着送点啥既有心意又能体现咱“技术宅”的浪漫。于是,一个想法…

2026/8/19 6:51:59 阅读更多 →
MASA全家桶汉化包完整指南:7大模组如何3步装好中文

MASA全家桶汉化包完整指南:7大模组如何3步装好中文

MASA全家桶汉化包完整指南:7大模组如何3步装好中文 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 玩 Minecraft 技术服(生存科技服)的玩家&#xff…

2026/8/19 6:51:59 阅读更多 →
利用USB转串口芯片实现PC虚拟GPIO:Python控制硬件引脚实战

利用USB转串口芯片实现PC虚拟GPIO:Python控制硬件引脚实战

1. 项目缘起:当通用计算机需要“感知”物理世界作为一名长期在嵌入式开发和自动化领域摸爬滚打的工程师,我经常遇到一个看似简单却令人头疼的需求:如何让我手头那台性能强大的笔记本电脑或台式机,也能像一块小小的单片机开发板&am…

2026/8/19 6:51:59 阅读更多 →
基于CH32V003 RISC-V MCU的创意婚礼贺卡设计与实现

基于CH32V003 RISC-V MCU的创意婚礼贺卡设计与实现

1. 项目缘起:当婚礼贺卡遇上开源MCU最近在筹备一个朋友的婚礼,想着送点不一样的。市面上那些会唱歌、会闪光的电子贺卡,要么太俗套,要么就是“一次性”的,用完就扔。作为一个常年和单片机打交道的人,我琢磨…

2026/8/19 6:50:59 阅读更多 →

日新闻

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

【单片机课程设计/毕业设计】基于 STM32 与 WiFi 模块的室内通风智能管控系统设计 基于 STM32 的人体存在感知自适应风扇控制系统设计(018503)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

2026/8/19 0:00:30 阅读更多 →
AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

AI如何驱动数学猜想生成:从大语言模型到自动化数学发现

1. 项目概述:当AI开始“猜”数学定理 最近在AI研究圈里,一个名为“Moonshine”的项目引起了不小的讨论。这名字本身就挺有意思,直译是“月光”,但在数学史上,它特指一个神秘而美丽的联系——魔群月光猜想,连…

2026/8/19 0:00:30 阅读更多 →
WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南

WarcraftHelper 魔兽争霸3优化实战指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 一台刚配的新电脑,跑《魔兽争霸3》却卡成 PPT——这…

2026/8/19 0:02:31 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/19 5:04:55 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →