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 的开源图形用户界面(GUI)杀毒软件。它使用 GTK2-Perl 脚本构建而成,支持32位与64位操作系统。ClamTk 提供了一个直观的用户界面,使得用户无需深入了解命令行即可完成大部分操作。它具备…...

RapidIO介绍
传统串行总线(如 UART, SPI, I2C 等) 特点: 接口简单:传统的串行总线设计相对简单,通常使用少量的引脚,因此硬件设计较为简洁。协议简单:这些协议设计简单,容易实现,因…...
用魔方做存储器
用魔方模拟存储器是一种形象化的方式,特别适合教学演示或帮助理解存储器结构。以下是如何将魔方作为存储器的设计思路和可能的实现: 基本思路 魔方的结构: 魔方有 (6) 个面,每面 (3 \times 3 9) 个方块,总共 (6 \time…...

动力商城-03 Idea集成apifox Mybatis-Plus字段策略
1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时,根据配置的策略判断是否对实体对…...
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的小伙伴,可以观看视频 地址: 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.前言 哈喽大家好啊,今儿来继续给大家分享最近学习的MySQL和约束相关的知识点,希望大家一起…...
使用YOLOv9进行图像与视频检测
大家好,YOLOv9 与其前身v8一样,专注于识别和精确定位图像和视频中的对象。本文将介绍如何使用YOLOv9进行图像与视频检测,自动驾驶汽车、安全系统和高级图像搜索等应用在很大程度上依赖于此功能,YOLOv9 引入了比 YOLOv8 更令人印象…...
C# 中的 LINQ:轻松处理集合和数据
C#中的LINQ(Language Integrated Query),这是一个非常强大且实用的功能,可以简化集合操作和数据查询。以下是一篇关于C#中LINQ使用的文章。 引言 LINQ(Language Integrated Query)是C#语言的一个重要特性…...

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

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

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

1. Django中的URL调度器 (项目创建与简单测试)
1. 创建 Django 项目 运行以下命令创建一个名为 blog_project 的 Django 项目: django-admin startproject blog_project2. 创建博客应用 Django 中,项目可以包含多个应用。创建一个名为 blog 的应用: cd blog_project python manage.py …...
学习python的第十天之数据类型——dict字典
学习python的第十天之数据类型——dict字典 Python 中的字典(Dictionary)是一个非常强大的内置数据类型,它用来存储键值对(key-value pairs)信息。字典是无序的,这意味着它们不会记录你添加键值对的顺序&am…...

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

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

RT-DETR融合GhostModel V3及相关改进思路
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《GhostNetV3: Exploring the Training Strategies for Compact Models》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2404.11202v1 代码链接:https:…...
JVM有哪些垃圾回收器
Serial垃圾回收器:单线程收集器,适用于客户端模式下的小型应用。 使用复制算法回收新生代,使用标记-整理算法回收老年代。 在进行垃圾回收时,会停止所有用户线程(Stop-The-World, STW)。Serial Old垃圾回收…...

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

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...