STM32单片机基本原理与应用(九)

SDIO/SD卡实验

实验内容

将SD卡插入实训平台并烧写程序,开机后TFTLCD屏幕上会显示是否成功初始化SD卡并显示SD卡容量。

电路原理图

在这里插入图片描述

实验原理

SD卡的通信方式有两种:SPI和SDIO。SD卡有五种寄存器,如下表
在这里插入图片描述
SD 卡的指令由 6 个字节组成,字节 1 的最高 2 位固定为 01,低 6 位为命令号字节 2~5 为命令参数,有些命令是没有参数的。字节 6 的高七位为 CRC 值,最低位恒定为 1。每发送一个命令,SD卡都会给出一个应答,以告知主机该命令的执行情况,或者返回主机需要获取的数据。

程序源码

首先要对SD卡进行初始化,在主函数中进行调用,这里仅展示主函数。

int main(void){	 u8 key;		 u32 sd_size;u8 t=0;	u8 *buf=0;delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200LED_Init();		  			//初始化与LED连接的硬件接口
//	KEY_Init();					//初始化按键LCD_Init();			   		//初始化LCD   my_mem_init(SRAMIN);		//初始化内部内存池POINT_COLOR=RED;			//设置字体为红色 LCD_ShowString(30,50,200,16,16,"WarShip STM32");	LCD_ShowString(30,70,200,16,16,"SD CARD TEST");	LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");LCD_ShowString(30,110,200,16,16,"2015/1/20"); LCD_ShowString(30,130,200,16,16,"KEY0:Read Sector 0");	   while(SD_Init())//检测不到SD卡{LCD_ShowString(30,150,200,16,16,"SD Card Error!");delay_ms(500);					LCD_ShowString(30,150,200,16,16,"Please Check! ");delay_ms(500);LED0=!LED0;//DS0闪烁}show_sdcard_info();	//打印SD卡相关信息POINT_COLOR=BLUE;	//设置字体为蓝色 //检测SD卡成功 											    LCD_ShowString(30,150,200,16,16,"SD Card OK    ");LCD_ShowString(30,170,200,16,16,"SD Card Size:     MB");LCD_ShowNum(30+13*8,170,SDCardInfo.CardCapacity>>20,5,16);//显示SD卡容量while(1){
//		key=KEY_Scan(0);
//		if(key==KEY0_PRES)//KEY0按下了{buf=mymalloc(0,512);		//申请内存if(buf==0){printf("failed\r\n");continue;}if(SD_ReadDisk(buf,0,1)==0)	//读取0扇区的内容{	LCD_ShowString(30,190,200,16,16,"USART1 Sending Data...");printf("SECTOR 0 DATA:\r\n");for(sd_size=0;sd_size<512;sd_size++)printf("%x ",buf[sd_size]);//打印0扇区数据    	   printf("\r\nDATA ENDED\r\n");LCD_ShowString(30,190,200,16,16,"USART1 Send Data Over!");}myfree(0,buf);//释放内存	   		while(1);  //!!!!		}t++;delay_ms(10);if(t==20){LED0=!LED0;t=0;}}   
}

FATFS实验

实验内容

将Fatfs文件系统移植到SD卡中并利用Fatfs相关函数获取SD卡的总容量和剩余容量,最后在TFTLCD屏幕上显示。

FATFS

FATFS 是一个完全免费开源的 FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完全用标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到 8051、PIC、AVR、SH、Z80、H8、ARM 等系列单片机上而只需做简单的修改。它支持FATl2、FATl6 和 FAT32,支持多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对 8 位单片机和 16 位单片机做了优化。
FATFS 的特点有:
• Windows 兼容的FAT 文件系统(支持FAT12/FAT16/FAT32)
• 与平台无关,移植简单
• 代码量少、效率高
• 多种配置选项
(1)支持多卷(物理驱动器或分区,最多 10 个卷)
(2)多个ANSI/OEM 代码页包括 DBCS
(3)支持长文件名、ANSI/OEM 或Unicode
(4)支持RTOS
(5)支持多种扇区大小
(6)只读、最小化的 API 和 I/O 缓冲区等

程序源码
int main(void){	 u32 total,free;u8 t=0;	u8 res=0;	    	    delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200usmart_dev.init(72);		//初始化USMART		LED_Init();		  			//初始化与LED连接的硬件接口KEY_Init();					//初始化按键LCD_Init();			   		//初始化LCD   
//	W25QXX_Init();				//初始化W25Q128my_mem_init(SRAMIN);		//初始化内部内存池POINT_COLOR=RED;			//设置字体为红色 LCD_ShowString(30,50,200,16,16,"STM32");	LCD_ShowString(30,70,200,16,16,"FATFS TEST");	LCD_ShowString(30,90,200,16,16,"STM32F103ZET6");LCD_ShowString(30,110,200,16,16,"2015/1/20"); LCD_ShowString(30,130,200,16,16,"Use USMART for test");   while(SD_Init())//检测不到SD卡{LCD_ShowString(30,150,200,16,16,"SD Card Error!");delay_ms(500);					LCD_ShowString(30,150,200,16,16,"Please Check! ");delay_ms(500);LED0=!LED0;//DS0闪烁}exfuns_init();							//为fatfs相关变量申请内存				 f_mount(fs[0],"0:",1); 					//挂载SD卡 
// 	res=f_mount(fs[1],"1:",1); 				//挂载FLASH.	
//	if(res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
//	{
//		LCD_ShowString(30,150,200,16,16,"Flash Disk Formatting...");	//格式化FLASH
//		res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
//		if(res==0)
//		{
//			f_setlabel((const TCHAR *)"1:ALIENTEK");	//设置Flash磁盘的名字为:ALIENTEK
//			LCD_ShowString(30,150,200,16,16,"Flash Disk Format Finish");	//格式化完成
//		}else LCD_ShowString(30,150,200,16,16,"Flash Disk Format Error ");	//格式化失败
//		delay_ms(1000);
//	}													    LCD_Fill(30,150,240,150+16,WHITE);		//清除显示			  while(exf_getfree("0",&total,&free))	//得到SD卡的总容量和剩余容量{LCD_ShowString(30,150,200,16,16,"SD Card Fatfs Error!");delay_ms(200);LCD_Fill(30,150,240,150+16,WHITE);	//清除显示			  delay_ms(200);LED0=!LED0;//DS0闪烁}													  			    POINT_COLOR=BLUE;//设置字体为蓝色	   LCD_ShowString(30,150,200,16,16,"FATFS OK!");	 LCD_ShowString(30,170,200,16,16,"SD Total Size:     MB");	 LCD_ShowString(30,190,200,16,16,"SD  Free Size:     MB"); 	    LCD_ShowNum(30+8*14,170,total>>10,5,16);				//显示SD卡总容量 MBLCD_ShowNum(30+8*14,190,free>>10,5,16);					//显示SD卡剩余容量 MB			    while(1){t++; delay_ms(200);		 			   LED0=!LED0;} 
}
实验结果

若fatfs初始化成功会显示FAFS ok字样,接着会显示SD卡总容量和剩余容量。

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

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

相关文章

2024年2月20日v1.0.5更新·优雅草便民工具youyacao-tools

2024年2月20日v1.0.5更新优雅草便民工具youyacao-tools apk下载 https://fenfacun.youyacao.com/tools105.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益工具&#xff0c;2024年1月17日正式发布v1.0.0版本&#xff0c;本工具为了方便大众免…

pclpy OC-Tree “体素内的邻居搜索”、“K 最近邻搜索”和“半径内的邻居搜索”

pclpy OC-Tree “体素内的邻居搜索”、“K 最近邻搜索”和“半径内的邻居搜索” 一、算法原理1.介绍2.“体素内的邻居搜索”、“K 最近邻搜索”和“半径内的邻居搜索” 二、代码三、结果1.原点云2.体素内的邻居搜索3.K 最近邻搜索4.半径内的邻居搜索 四、相关数据 一、算法原理…

python实现线下缓存最优算法

对于现代计算机为了加快数据存储速度&#xff0c;一般会采用多级缓存的方法&#xff0c;以最简单的二级缓存来说&#xff0c;数据会存放在两个地方&#xff0c;一个地方就是存在内存当中&#xff0c;另一个存放的地方就是存放在硬盘当中&#xff0c;但是这两个地方数据读取的速…

面向面试的机器学习知识点(4)——分类模型

省流版&#xff1a; 本文介绍机器学习中的回归算法&#xff1a;逻辑回归、KNN、SVM、随机森林和XGBoost。作为机器学习的有监督学习方法&#xff0c;分类模型是最重要也是最常见的一类算法&#xff0c;在数据分析等岗位的笔试面试中都是常客&#xff0c;非常值得深入研究&…

【elasticsearch实战】知识库文件系统检索工具FSCrawler

需求背景 最近有一个需求需要建设一个知识库文档检索系统&#xff0c;这些知识库物料附件的文档居多&#xff0c;有较多文档格式如&#xff1a;PDF, Open Office, MS Office等&#xff0c;需要将这些格式的文件转化成文本格式&#xff0c;写入elasticsearch 的全文检索索引&am…

JAVA--反射机制

目录 1. 反射(Reflection)的概念 1.1 反射的出现背景 1.2 反射概述 1.3 Java反射机制研究及应用 1.4 反射相关的主要API 1.5 反射的优缺点 2. 理解Class类并获取Class实例 2.1 理解Class 2.1.1 理论上 2.1.2 内存结构上 2.2 获取Class类的实例(四种方法) 2.3 哪些类…

本地部署ChatGPT

发布一下我之前做的一个本地大模型部署,不需要API key,但要有自己的账号 利用Docker 的Pandora做本地ChatGPT模型部署 先下载安装Docker,设置好运行如下 会要求升级核心,cmd运行如下命令就OK 安装Pandora 再管理员cmd中输入如下命令拉取Pandora镜像 docker pull pengzhi…

Makefile静态库动态库的构建和链接之工程实用篇

静态库和动态库的构建和链接 现有C工程目录结构如下&#xff1a; add.h int add(int a, int b);add.cpp #include "add.h"int add(int a, int b) {return ab; }main.cpp #include <iostream> #include "add.h"int main() {std::cout << a…

openssl3.2 - crypto-mdebug被弃用后, 内存泄漏检查的替代方法

文章目录 openssl3.2 - crypto-mdebug被弃用后, 内存泄漏检查的替代方法概述笔记查看特性列表openssl3.2编译脚本 - 加入enable-crypto-mdebug看看有没有替代内存诊断的方法?main.cppmy_openSSL_lib.hmy_openSSL_lib.c备注备注END openssl3.2 - crypto-mdebug被弃用后, 内存泄…

TransformerEncoder影评测试

import os import keras import tensorflow as tf from keras import layers import numpy as np#加载数据 def load_data(data_dir):"""data_dir&#xff1a;train的目录或test的目录输出&#xff1a;X&#xff1a;评论的字符串列表y&#xff1a;标签列表&…

再探二分法

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读二分查找题目思路解法左闭右闭式写法左闭右开式写法 二分查找 题目 给定一个…

【Flutter/Android】运行到安卓手机上一直卡在 Running Gradle task ‘assembleDebug‘... 的终极解决办法

方法步骤简要 查看你的Flutter项目需要什么版本的 Gradle 插件&#xff1a; 下载这个插件&#xff1a; 方法一&#xff1a;浏览器输入&#xff1a;https://services.gradle.org/distributions/gradle-7.6.3-all.zip 方法二&#xff1a;去Gradle官网找对应的版本&#xff1a;h…