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 ; 证明Ready
res=f_mount(0, &fs);//挂载,res=0 ; 证明OK
res=f_open(&fsrc,"a.txt",FA_CREATE_ALWAYS | FA_WRITE|FA_READ);//res=0 ; 证明OK
res = f_write(&fsrc, WirtBuff, 10, &bw);//写入HELLOWORLD
f_close(&fsrc);//关闭文件
res=f_open(&fsrc,"a.txt",FA_READ);//res=0 ; 证明OK
res = f_read(&fsrc,ReadBuff,10,&br);//读取数据到ReadBuff
f_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卡还可以用于恢复单片机的出厂设置。