【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作

有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32+HAL】CUBEMX初始化配置

二、所用工具


1、芯片: STM32F407ZGT6

2、IDE: MDK-Keil软件

3、库文件:STM32F4xxHAL库

三、实现功能

实现用SDIO+DMA读写SD卡内容

四、HAL库配置

1、开启SDIO

模式配置为1bit,开启DMA传输,开启中断

 Clock transition on which the bit capture is made (时钟跳变沿捕获数据配置):数据捕获边沿设置,可设置为上升沿/下降沿

 SDIO Clock divider bypass (时钟分频器旁路使能):使能该参数时,SDIO_CLK=SDIOCLK;否则SDIO_CLK频率由时钟分频因子决定

 SDIO Clock output enable when the bus is idle (空闲模式时钟输出使能):节能模式,此实验不使能

 SDIO hardware flow control (硬件流控):设置是否使能SDIO的硬件流控,此处不使能

 SDIOCLK clock divide factor (时钟分频因子):当不使能时钟分频器旁路时,SDIO_CLK=SDIOCLK / (2+时钟分频因子)

2、开启串口通信

至此,HAL库配置完毕 

五、Keil填写代码

1、SD.h
#ifndef __SD_H__
#define __SD_H__#include "sdio.h"
#include "stdio.h"void SDCard_TestRead(void);
void SDCard_TestWrite(void);
void SDCard_ShowInfo(void);
void SDCard_EraseBlocks(uint8_t BlockAddrStart,uint8_t BlockAddrEnd);void SDCard_Write_DMA(uint8_t *TX, uint32_t BlockCount, uint32_t BlockAddr);
void SDCard_Read_DMA(uint8_t *RX,uint32_t BlockCount,uint32_t BlockAddr);#endif

2、SD.c

篇幅有限,仅提供SD.c核心代码

/*** @brief  SD卡DMA写入函数* @param  uint8_t *TX: 写入数据数组(若要存入负数,需提前加一个数值,典型值为127,此时数据范围为-127 ~ 128)* @param  BlockCount:  写入的总片数* @param  BlockAddr:   起始写入的片数*/
void SDCard_Write_DMA(uint8_t *TX, uint32_t BlockCount, uint32_t BlockAddr)
{HAL_SD_WriteBlocks_DMA(&hsd, TX, BlockAddr, BlockCount);				//存入TX数组数据到sd卡
}/*** @brief  SD卡DMA读取函数* @param  uint8_t *RX: 读取数据数组(若已存入负数,需在打印时减一个数值,典型值为127,此时数据范围为-127 ~ 128)* @param  BlockCount:  读取的总片数* @param  BlockAddr:   起始读取的片数*/
void SDCard_Read_DMA(uint8_t *RX, uint32_t BlockCount, uint32_t BlockAddr)
{HAL_SD_ReadBlocks_DMA(&hsd, RX, BlockAddr, BlockCount);					//读取sd卡数据到RX数组
}/*** @brief  SD卡擦除函数* @param  BlockAddrStart: 擦除开始块数* @param  BlockAddrEnd:   擦除结束块数*/
void SDCard_EraseBlocks(uint8_t BlockAddrStart,uint8_t BlockAddrEnd)
{printf("\r\n*** Erasing blocks ***\r\n");if(HAL_SD_Erase(&hsd, BlockAddrStart, BlockAddrEnd)==HAL_OK)		//擦除数据printf("Erasing blocks,OK\r\n");elseprintf("Erasing blocks,fail\r\n");HAL_SD_CardStateTypeDef cardState=HAL_SD_GetCardState(&hsd);printf("GetCardState()= %d\r\n", cardState);						//打印当前sd卡数据状态while(cardState != HAL_SD_CARD_TRANSFER){HAL_Delay(1);cardState=HAL_SD_GetCardState(&hsd);}printf("Blocks %d-%d is erased.\r\n",BlockAddrStart, BlockAddrEnd);
}

3、main.c
 uint8_t rx[BLOCKSIZE],tx[BLOCKSIZE];/* USER CODE BEGIN 2 */printf("Hello World\r\n");HAL_Delay(500);SDCard_Write_DMA(tx,1,6);HAL_Delay(500);SDCard_Read_DMA(rx,1,6);HAL_Delay(500);SDCard_EraseBlocks(0,10);/* USER CODE END 2 */

六、巨人之肩

【STM32+HAL】利用SDIO将大量数据存入SD卡,并根据需要读出

STM32CubeMX教程27 SDIO - 读写SD卡

七、源码提供

资源【STM32+HAL】SDIO+DMA模式读写SD卡

八、更多DMA应用

详见【STM32+HAL】DMA应用

九、结语

本人能力有限,代码未必是最优解,若有可改进之处望在评论区留言,采纳有赏~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python网络编程:从基础到实践

Python 是一种广泛应用于网络编程的高级编程语言,它简单易学,功能强大,深受广大开发者的喜爱。本文将带你深入了解 Python 网络编程的基础知识,并通过实际案例,让你掌握如何使用 Python 进行网络编程。 第一部分&…

05_机器学习赛事_优惠券使用预测

1. 函数库导入 # import libraries necessary for this project import os, sys, pickleimport numpy as np import pandas as pdimport matplotlib.pyplot as plt import matplotlib.dates as mdatesimport seaborn as sns import datetime as dtfrom datetime import datefr…

如何删除BigKey

③第三方工具 利用第三方工具,如 Redis-Rdb-Tools 分析RDB快照文件,全面分析内存使用情况https://github.com/sripathikrishnan/redis-rdb-tools ④网络监控 自定义工具,监控进出Redis的网络数据,超出预警值时主动告警一般阿里…

MVCC如何根据read view结合行数据的undo log版本链过滤数据的?

先明确定义 行数据的最新undo log事务id 按顺序判断 比最小的小,一定读:行数据的最新undo log事务id比min_trx_id还小,说明这个产生这条undo log的事务在read view产生时刻已经被提交了。 如果行数据的最新undo log事务id和当前事务id相等&#xff0…

拼多多新店和老店哪个好做

拼多多新店和老店哪个好做 拼多多推广可以使用3an推客。3an推客(CPS模式)给商家提供的营销工具,由商家自主设置佣金比例,激励推广者去帮助商家推广商品链接,按最终有效交易金额支付佣金,不成交不扣费。是商…

Python基础学习之数据结构

在编程的世界里,数据结构是构建高效程序的关键基石。Python作为一种功能强大的编程语言,提供了多种内置的数据结构,使得我们能够以简洁、优雅的方式解决复杂的问题。在本文中,我们将深入探讨Python中几种常见的数据结构。 一、列…

php利用阿里云短信SDK实现短信发送功能

当使用PHP结合阿里云短信服务SDK来实现短信验证码登录时,你需要遵循以下步骤: 1. 注册阿里云账号并开通短信服务 首先,你需要有一个阿里云账号,并在阿里云控制台中开通短信服务(Dysmsapi)。 2. 获取Acce…

34.Docker基本操作

镜像相关的命令 镜像名称分为两部分组成:[repository]:[tag],tag就是镜像的版本。如果tag没有指定默认就是latest,表示最新版本的镜像。 查看docker命令的帮助信息 docker --help 具体某条命令的帮助信息 docker images --help 案例一:从DockerHub中…

5G赋能 扬帆未来|AGV无人仓成黑科技“顶流”

AGV 近年来,无人化这个概念逐渐被运用到了社会中的各个行业,而跟物流有关的就有无人分拣机器人、无人驾驶卡车、和无人叉车,越来越多的新装备也开始投入到实际运用中。 仓储管理在物流管理中占据着核心地位。传统的仓储管理中存在诸多的弊端…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板,最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U,教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

SQL数据库

一.什么是数据库 数据库:存储数据的仓库,数据是有组织的进行存储。(database 简称DB) 数据库管理系统:管理数据库的大型软禁(DataBase Management System 简称DBMS) SQL:操作关系…

flutter-解决AppBar背景色为白色带滚动时不生效的bug

作为初学flutter的小白来说,今天在模仿小米商城app的首页appbar的时候,遇到一个奇怪的问题,就是修改AppBar的backgroundColor,在首页上拉滚动时,设置的白色背景色不生效,背景色变成不是淡灰色,其他深色不影…

Golang | Leetcode Golang题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; func uniquePathsWithObstacles(obstacleGrid [][]int) int {n, m : len(obstacleGrid), len(obstacleGrid[0])f : make([]int, m)if obstacleGrid[0][0] 0 {f[0] 1}for i : 0; i < n; i {for j : 0; j < m; j {if obstacleGrid[i]…

《读懂财务报表》手绘版读书笔记:通过报表找好公司

通过财报的三张表判断好公司&#xff1a; 然后是在三表中&#xff0c;计算各个项目占总体的比例&#xff0c;以及做比率分析&#xff0c; 比率分析&#xff0c;从偿还能力&#xff0c;运营能力&#xff0c;盈利能力三方面分析&#xff1a; 1&#xff09; 偿还能力 2&#xff09…

【工具】--- Adobe Illustrator 下载-入门绘图

文章目录 软件下载入门项目可看课程 尝试使用Adobe Illustrator&#xff08;设计师常用软件&#xff09;进行科研绘图。 软件下载 阿里云盘下载 入门项目 绘制一个箭头并保持为SVG&#xff0c; 直线->画线->窗口->描边->选择想要的箭头样式->颜色->改为蓝…

Python量化炒股的获取数据函数—get_index_weights()

Python量化炒股的获取数据函数—get_index_weights() 获取指数成分股权重函数get_index_weights()可以获取一个指数给定日期在平台交易的成分股权重&#xff0c;其语法格式如下&#xff1a; get_index_weights(index_id, dateNone)该函数的参数与获取指数成分股代码函数get_i…

OpenGL 的内置矩阵种种

文章目录 一、说明二、glMatrixMode的三个选项三、OpenGL 矩阵操作四、入栈和弹出矩阵五、设置内置 OpenGL 矩阵六、矩阵设置异端七、正常矩阵 一、说明 内置 OpenGL有几个重要矩阵&#xff0c;围绕这几个矩阵&#xff0c;OpenGL 有一小组 矩阵操作。在本例中为 glMatrixMode&a…

人工智能|推荐系统——工业界的推荐系统之概要

以小红书为例的推荐系统的转化流程&#xff0c;用户看到内容就是曝光&#xff0c;可以点击进去&#xff0c;然后进行一些“交互”行为&#xff0c;比如评论、点赞、收藏、转发。 通常会考虑用户的一些消费指标 而从推荐系统的角度则会考虑一些北极星指标&#xff0c;也就是优化…

微信小程序demo-----制作文章专栏

前言&#xff1a;不管我们要做什么种类的小程序都涉及到宣传或者扩展其他业务&#xff0c;我们就可以制作一个文章专栏的页面&#xff0c;实现点击一个专栏跳转到相应的页面&#xff0c;页面可以有科普类的知识或者其他&#xff0c;然后页面下方可以自由发挥&#xff0c;添加联…

OBD读取车辆里程数

OBD(On-Board Diagnostics)系统可以通过车辆的OBD接口读取多种车辆数据,但关于里程数的读取,情况稍微复杂一些。以下是关于通过OBD读取车辆里程数的详细解释: OBD输出信息中与里程相关的数据: 在标准的OBD输出信息中,并不直接提供车辆的总里程数。它主要提供的是与故障相…