当前位置: 首页 > 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;那一套理论。而…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...