当前位置: 首页 > news >正文

STM32传感器模块编程实践(十二) micro SD卡模块简介及驱动源码

文章目录

    • 一.概要
    • 二.Micro SD卡模块主要特性
    • 三.Micro SD卡模块接线说明
    • 四.Micro SD卡模块参考原理图
    • 五.通讯协议介绍
    • 六.FATFS文件系统介绍
    • 七.STM32F030C8T6单片机与SD卡模块实现数据读写实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 八.源代码工程下载
    • 九.小结

一.概要

MicroSD卡是在数码相机,PDA等所用的Flash Memory Card(中文名:快闪存储卡)基础上发展出的一种更小更适合小型手机用的存储卡。尽管miniSD卡的外形大小及接口形状与原来的SD卡不同,但接口等电气标准相同,以确保兼容性。TF卡产品采用SD架构设计而成,SD协会于2004年年底正式将其更名为Micro SD,已成为SD产品中的一员。
在这里插入图片描述

二.Micro SD卡模块主要特性

该模块(MicroSD Card Adapter)是Micro SD卡读写模块,通过文件系统及SPI接口驱动程序,单片机系统即可完成MicroSD卡内的文件进行读写。用户可直接使用SD卡程序库即可完成卡的初始化和读写。

供电电压:4.5V-5.5V
接口:SPI接口
模块运行电流:0.2-200mA
接口电平:3.3V
支持卡类型:Micro SD卡(≤2G)、Micro SDHC卡(<32G)
产品重量:5g
定位孔:M2螺丝定位孔

三.Micro SD卡模块接线说明

在这里插入图片描述

控制接口:共6个引脚(GND、VCC、MISO、MOSI、SCK、CS),GND为地,VCC为供电电源一般接5V,MISO、MOSI、SCK为SPI总线,CS为片选信号脚;

四.Micro SD卡模块参考原理图

采用SPI接线方式
在这里插入图片描述

五.通讯协议介绍

读操作:
在这里插入图片描述

写操作:
在这里插入图片描述

主要寄存器

在这里插入图片描述

六.FATFS文件系统介绍

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统,要真正应用SD卡必须要使用文件系统。

FATFS是一个小型的文件系统,在小型的嵌入式系统中使用非常的广泛,我们通过简单的移植就能够使用,将前面的SD卡的读写操作进行修改,将文件系统挂载到SD卡进行操作。
我们无需理会FATFS的内容结构和复杂的FAT协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write和f_close等,就可以像在PC机上读/写文件。FATFS模块层是文件系统的实现层,它实现了FAT文件读写协议,提供ff.c和ff.h文件供用户使用。底层接口是FATFS与存储介质交互的部分,包括存储介质读写接口和提供文件创建、修改时间的实时时钟。移植FATFS模块时,通常只需修改两个文件:msd.c和diskio.c

FATFS主要函数说明:
1.注册工作区
FRESULT f_mount (
BYTE vol, /* Logical drive number to be mounted/unmounted /
FATFS fs / Pointer to new file system object (NULL for unmount)
/
)
函数说明:

1):该函数在 FatFs 模块上注册 / 注销一个工作区。在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。要注销一个工作区,只要指定 fs为 NULL 即可,然后该工作区可以被丢弃。
2):参数说明:
vol:盘符。
*fs:指向缓冲区的指针。
调用示例:f_mount(0,&fs);

2.打开/新建一个文件
FRESULT f_open (
FIL fp, / Pointer to the blank file object */
const TCHAR path, / Pointer to the file name /
BYTE mode /
Access mode and file open mode flags */
)
函数说明:

1):此函数可以打开,或新建一个文件
2):参数说明:
*fp:指向一个用来存储文件对象的空结构体指针
*path:指向文件名的指针
mode:打开方式,可以是以下几种或几种的组合(默认方式是FA_OPEN_EXISTING)
FA_CREATE_ALWAYS:新建文件,如果文件已存在,覆盖旧文知平
FA_WRITE:写模式(读写模式可同时生效)
FA_READ:读模式(读写模式可同时生效)
FA_OPEN_EXISTING:默认打开方式
调用示例:f_open(&fsrc,“a.txt”,FA_CREATE_ALWAYS | FA_WRITE|FA_READ);

3.读取文件
FRESULT f_read (
FIL fp, / Pointer to the file object */
void buff, / Pointer to data buffer /
UINT btr, /
Number of bytes to read */
UINT br / Pointer to number of bytes read */
)
函数说明:

1):这个函数可以读取文件内容
2):参数说明:
*fp:指向文件对象结构体的指针
*buff:指向存储读取到的数据的数据缓冲的指针
btr:准备读取的字节数
*br:每次f_read执行完之后,br的值等于本次读取到的字节数,若br<btr,即本次读取到的字节小于准备读取的字节,说明读指针已到达文件末尾。
调用示例:res=f_read(&fp,buff,sizeof(buff),&br);

4.写文件
FRESULT f_write (
FIL fp, / Pointer to the file object */
const void buff, / Pointer to the data to be written /
UINT btw, /
Number of bytes to write */
UINT bw / Pointer to number of bytes written */
)
函数说明:

1):此函数用来想文件中写入数据, 前提是以写文件的方式打开文件
2):参数说明:
*fp:指向文件对象结构体的指针
*buff:指向数据缓冲的指针
btw:准备写入的字节数
bw:记录已写入的字节数,用来检测是否写完
调用示例:res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer), &bw);

七.STM32F030C8T6单片机与SD卡模块实现数据读写实验

1.硬件准备

STLINK接STM32F030C8T6开发板,STLINK接电脑USB口。

模块与开发板相连:
在这里插入图片描述

模块GND <----->板子GND
模块VCC <----->板子5V
模块MISO <---->板子PA6
模块MOSI <---->板子PA7
模块SCK <------>板子PA5
模块CS <-------->板子PA4

由于SD卡模块需要5V供电,所以开发板的5V USB线需要连接给板子供电。

2.软件工程

在这里插入图片描述
Part Number处输入STM32F030C8,再双击就创建新的工程
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述

配置系统主频
在这里插入图片描述

PA5,PA6,PA7配置成SPI,PA4配置成输出
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

添加文件系统相关代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加相关应用代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.软件主要代码

#include "msd.h" 
#include "ff.h"
#include "stdio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
extern char file_num;//选中的文件标号
extern DIR start_dirs; //目录起点信息
extern uint8_t SD_Card_Ready;//SD卡初始化成功标志
FATFS fs; //FatFs文件系统对象           
FIL fsrc;  //文件对象
FRESULT res; //文件系统操作结果
UINT br, bw; // 文件 R/W 计数	static const uint8_t WirtBuff[10]="HELLOWORLD";
static       uint8_t ReadBuff[100];
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */
uint8_t ret = 1;	/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI1_Init();/* USER CODE BEGIN 2 */ret = MSD_Init();//初始化SD_Card_Ready = ret;//ret=0 ; 证明Readyres=f_mount(0, &fs);//挂载,res=0 ; 证明OK	res=f_open(&fsrc,"a.txt",FA_CREATE_ALWAYS | FA_WRITE|FA_READ);//res=0 ; 证明OKres = f_write(&fsrc, WirtBuff, 10, &bw);//写入HELLOWORLDf_close(&fsrc);//关闭文件res=f_open(&fsrc,"a.txt",FA_READ);//res=0 ; 证明OKres = f_read(&fsrc,ReadBuff,10,&br);//读取数据到ReadBufff_close(&fsrc);f_mount(0, NULL);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

4.实验效果

SD卡先格式化,再装入到SD卡模块
在这里插入图片描述
上电之后,进入调试模式,全速运行,能看到ReadBuff数组的值是HELLWORLD,就说明SD卡写进去读出来都正确了
在这里插入图片描述

八.源代码工程下载

CSDN链接

九.小结

在STM32单片机中,MicroSD卡常用于存储和读取数据。例如,可以通过MicroSD卡进行程序更新、数据备份等操作,此外,MicroSD卡还可以用于恢复单片机的出厂设置。

相关文章:

STM32传感器模块编程实践(十二) micro SD卡模块简介及驱动源码

文章目录 一.概要二.Micro SD卡模块主要特性三.Micro SD卡模块接线说明四.Micro SD卡模块参考原理图五.通讯协议介绍六.FATFS文件系统介绍七.STM32F030C8T6单片机与SD卡模块实现数据读写实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.源代码工程下载九.小结 一.概要 M…...

Linux debian系统安装ClamTk开源图形用户界面(GUI)杀毒软件

一、ClamTk简介 ClamTk 是一个基于 ClamAV 的开源图形用户界面&#xff08;GUI&#xff09;杀毒软件。它使用 GTK2-Perl 脚本构建而成&#xff0c;支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面&#xff0c;使得用户无需深入了解命令行即可完成大部分操作。它具备…...

RapidIO介绍

传统串行总线&#xff08;如 UART, SPI, I2C 等&#xff09; 特点&#xff1a; 接口简单&#xff1a;传统的串行总线设计相对简单&#xff0c;通常使用少量的引脚&#xff0c;因此硬件设计较为简洁。协议简单&#xff1a;这些协议设计简单&#xff0c;容易实现&#xff0c;因…...

用魔方做存储器

用魔方模拟存储器是一种形象化的方式&#xff0c;特别适合教学演示或帮助理解存储器结构。以下是如何将魔方作为存储器的设计思路和可能的实现&#xff1a; 基本思路 魔方的结构&#xff1a; 魔方有 (6) 个面&#xff0c;每面 (3 \times 3 9) 个方块&#xff0c;总共 (6 \time…...

动力商城-03 Idea集成apifox Mybatis-Plus字段策略

1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时&#xff0c;根据配置的策略判断是否对实体对…...

python如何使用Rabbitmq

目录 一、Rabbitmq介绍 二、Rabbitmq的使用场景 1、异步处理 2、服务解耦 3、流量削峰 4、日志收集 5、发布订阅 6、任务调度 三、python如何使用Rabbitmq 1、安装依赖 2、基础使用 3、消息确认 4、消息持久化 5、公平调度 6、发布订阅 7、关键字发布 一、Rabbi…...

分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign

想学习微服务SpringCloudAlibaba的小伙伴&#xff0c;可以观看视频 地址&#xff1a; https://www.bilibili.com/video/BV1cFDEYWEkY/?vd_source14d27ec13a4737c281b7c79463687112分布式架构和微服务是两个密切相关但又有所区别的概念。它们在现代软件工程中经常被提及&#…...

MySQL初学之旅(3)约束

目录 1.前言 2.正文 2.1约束类型 2.2NULL约束 2.3UNIQUE约束 2.4DEFAULT约束 2.5PRIMARY KEY主键约束 2.6FOREIGN KEY外键约束 2.7CHECK约束 3.小结 1.前言 哈喽大家好啊&#xff0c;今儿来继续给大家分享最近学习的MySQL和约束相关的知识点&#xff0c;希望大家一起…...

使用YOLOv9进行图像与视频检测

大家好&#xff0c;YOLOv9 与其前身v8一样&#xff0c;专注于识别和精确定位图像和视频中的对象。本文将介绍如何使用YOLOv9进行图像与视频检测&#xff0c;自动驾驶汽车、安全系统和高级图像搜索等应用在很大程度上依赖于此功能&#xff0c;YOLOv9 引入了比 YOLOv8 更令人印象…...

C# 中的 LINQ:轻松处理集合和数据

C#中的LINQ&#xff08;Language Integrated Query&#xff09;&#xff0c;这是一个非常强大且实用的功能&#xff0c;可以简化集合操作和数据查询。以下是一篇关于C#中LINQ使用的文章。 引言 LINQ&#xff08;Language Integrated Query&#xff09;是C#语言的一个重要特性…...

【征稿倒计时!华南理工大学主办 | IEEE出版 | EI检索稳定】2024智能机器人与自动控制国际学术会议 (IRAC 2024)

#华南理工大学主办&#xff01;#IEEE出版&#xff01;EI稳定检索&#xff01;#组委阵容强大&#xff01;IEEE Fellow、国家杰青等学术大咖领衔出席&#xff01;#会议设置“优秀论文”“优秀青年学者报告”“优秀海报”等评优奖项 2024智能机器人与自动控制国际学术会议 &#…...

RHCE的学习(20)

变量5种赋值方式 shell中变量赋值5种方式&#xff0c;其中采用name10的方法称A 直接赋值 nameB read命令 read v1C 使用命令行参数 &#xff08;$1 $2 $3 ..&#xff09; name$1D 使用命令的输入 username$(whoami)E 从文件读取 #cut -d : -f1 /etc/passwd > /user.listfor…...

控制器ThinkPHP6

五、控制器中对数组值的返回 在做接口服务时&#xff0c;很多时候回使用数组作为返回值&#xff0c;那么数组如何返回成 json呢&#xff1f; 在 tp6 中返回json 很简单&#xff0c;直接使用 json 进行返回即可&#xff0c;例如&#xff1a; public function index(){$resarra…...

1. Django中的URL调度器 (项目创建与简单测试)

1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目&#xff1a; django-admin startproject blog_project2. 创建博客应用 Django 中&#xff0c;项目可以包含多个应用。创建一个名为 blog 的应用&#xff1a; cd blog_project python manage.py …...

学习python的第十天之数据类型——dict字典

学习python的第十天之数据类型——dict字典 Python 中的字典&#xff08;Dictionary&#xff09;是一个非常强大的内置数据类型&#xff0c;它用来存储键值对&#xff08;key-value pairs&#xff09;信息。字典是无序的&#xff0c;这意味着它们不会记录你添加键值对的顺序&am…...

华为Mate 70临近上市:代理IP与抢购攻略

随着科技的飞速发展&#xff0c;智能手机已经成为我们日常生活中不可或缺的一部分。而在众多智能手机品牌中&#xff0c;华为一直以其卓越的技术和创新力引领着行业的发展。近日&#xff0c;华为Mate 70系列手机的发布会正式定档在11月26日&#xff0c;这一消息引发了众多科技爱…...

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…...

RT-DETR融合GhostModel V3及相关改进思路

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《GhostNetV3: Exploring the Training Strategies for Compact Models》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2404.11202v1 代码链接&#xff1a;https:…...

JVM有哪些垃圾回收器

Serial垃圾回收器&#xff1a;单线程收集器&#xff0c;适用于客户端模式下的小型应用。 使用复制算法回收新生代&#xff0c;使用标记-整理算法回收老年代。 在进行垃圾回收时&#xff0c;会停止所有用户线程&#xff08;Stop-The-World, STW&#xff09;。Serial Old垃圾回收…...

EWM 打印

目录 1 简介 2 后台配置 3 主数据 4 业务操作 1 简介 打印即输出管理&#xff08;output management&#xff09;利用“条件表”那一套理论实现。而当打印跟 EWM 集成到一起时&#xff0c;也需要利用 PPF&#xff08;Post Processing Framework&#xff09;那一套理论。而…...

前端文件优化

一、图片优化 计算图片大小 对于一张100*100像素的图片来说&#xff0c;图像上有 10000 个像素点&#xff0c;如果每个像素的值是 RGBA 存储的话&#xff0c;那么也就是说每个像素有 4 个通道&#xff0c;每个通道 1 个字节&#xff08;8 位 1个字 节&#xff09;&#xff0…...

电脑怎么自动切换IP地址

在现代网络环境中&#xff0c;电脑自动切换IP地址的需求日益增多。无论是出于网络安全、隐私保护&#xff0c;还是为了绕过地域限制&#xff0c;自动切换IP地址都成为了许多用户关注的焦点。本文将详细介绍几种实现电脑自动切换IP地址的方法&#xff0c;以满足不同用户的需求。…...

hbase集成phoenix

1.环境 环境准备 三台节点zookeeper三节点hadoop三节点hbase三节点 2.pheonix集成 官网下载地址&#xff0c;需挂梯子&#xff0c;使用官网推荐的对应hbase版本即可 https://phoenix.apache.org/download.html下载及解压 wget https://dlcdn.apache.org/phoenix/phoenix-…...

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…...

Git_2024/11/16

文章目录 前言Git是什么核心概念工作流程常见术语解读Git的优势 Git与SVN对比SVNGit总结 Git配置流程及指令环境配置获取Git仓库本地初始化远程克隆 工作目录、暂存区、版本库文件的两种状态本地仓库操作远程仓库操作Git分支Git标签IntelliJ IDEA使用Git回滚代码 GitHub配置流程…...

Java基础夯实——2.1Java常见的线程创建方式

在 Java 中&#xff0c;线程是实现并发编程的核心。主要有以下三种&#xff1a; 继承 Thread 类实现 Runnable 接口实现 Callable 接口并结合 Future 使用 1. 继承 Thread 类 继承 Thread 类是创建线程的最简单方式之一。通过扩展 Thread 类并重写其 run 方法&#xff0c;可…...

【Docker容器】一、一文了解docker

1、什么是docker&#xff1f; 1.1 docker概念 Docker是一种容器化平台&#xff0c;通过使用容器技术&#xff0c;Docker允许开发人员将应用程序和其依赖项打包到一个独立的、可移植的容器中。每个容器具有自己的文件系统、环境变量和资源隔离&#xff0c;从而使应用程序可以在…...

Spring:IOC实例化对象bean的方式

对象已经能交给Spring的IOC容器来创建了&#xff0c;但是容器是如何来创建对象的呢? 就需要研究下bean的实例化过程&#xff0c;在这块内容中主要解决两部分内容&#xff0c;分别是 bean是如何创建的实例化bean的三种方式&#xff0c;构造方法,静态工厂和实例工厂 在讲解这…...

深入解析生成对抗网络(GAN)

1. 引言 背景介绍 在过去的几十年中&#xff0c;深度学习在计算机视觉、自然语言处理和语音识别等领域取得了巨大的突破。然而&#xff0c;如何让机器生成高质量、逼真的数据一直是人工智能领域的挑战。传统的生成模型&#xff0c;如变分自编码器&#xff08;VAE&#xff09;…...

curl命令提交大json

有个客户需要提交一个4M左右的pdf&#xff0c;接口里传的是pdf字节流base64编码后的字符串。 直接curl -XPOST -d json串 api接口会报 参数过长报错Argument list too long 网上搜了下解决方案把json串放到文本里然后通过json.txt引入参数 这一试不要紧&#xff0c;差点儿导致…...