先展示最终实现的功能效果如下:

在这里插入图片描述

1.目的与意义

为什么选用SD卡?
使用Nor-flash(W25Q系列)进行图片的存取,需要先把图片通过对应软件批量处理为二进制bin文件,再通过SPI等通讯方式将 bin文件烧写进Nor-flash才能进行使用,使用时还要记住每张图片的首地址和对应字节数,MCU才能准确的读出来并显示,所以在要更换图片或者读取显示图片上会显得十分繁琐麻烦;相对来说,SD(TF)卡虽然价格较贵,但通过SD(TF)卡和读卡器直接连接电脑可以将SD(TF)卡虚拟为U盘,直接往里面拷贝图片即可,更换图片就显得方便简单;

为什么要使用FATFS文件系统?
MCU要跟SD卡之间进行通讯,可以使用SPI和SDIO通讯方式,不移植FATFS文件系统的话也可以像Nor-flash一样通过对地址及扇区字节进行读取,但是此方法较麻烦,为了让MCU可以直接对SD卡内的各类文件格式进行读取识别,所以需要一个相同的文件系统,又由于fatfs系统在现阶段最广泛兼容,且STM32CUBEMX支持移植,所以就选用了该文件系统;

为什么使用Tinyjpeg解码库?
STM32F4系列具有较大的flash和ram,所以可以直接移植LVGL或Emwin图形库对图片格式进行解码,同时STM32F4及以上系列的MCU,STM32CubeMX也已经支持Tinyjpeg解码库的直接移植:在这里插入图片描述
所以证明Tinyjpeg解码库还是挺受欢迎的;
而STM32H系列价格昂贵,但具有JEPG硬件解码,所以不需要软件解码库;
STM32F1系列作为STM32家族中的廉价产品,其外设及内存肯定也较少,即没有硬件JPEG解码,flash和ram又较小,所以在使用显示屏显示图片时,移植Tinyjpeg库就是比较好的选择了,通过软件多写一点,就能节省MCU的价格,相信大部分人还是愿意做的。

2.使用STM32CubeMX建立工程

这里先给出我使用的TF卡的硬件原理图:
在这里插入图片描述这里我设计成了只要TF卡插入卡槽,LED灯就会被点亮,同时这个CD脚也是后面配置FATFS文件系统要用到的,所以才在这里给出原理图。

通过STM32CubeMX我们要完成创建对SD卡的SDIO通讯,FATFS文件系统的移植,Tinyjpeg则只需要拷贝几个C文件和h文件即可:
1.使能SYS的serial Wire,选择晶振及配置时钟树,这些创建基本工程也都要进行配置,这里我就不具体给出设置参数了,我这边使用的是外部晶振配置为72MHz时钟:
在这里插入图片描述

2.配置SD卡的SDIO通讯方式(因为MCU又要从SD卡读取文件,又要将数据发送到TFTLCD进行显示,所以SDIO这里使用DMA方式,减少对MCU线程的占用):

这里配置了SDIO的基本参数,开启4线通讯(对应4个IO口才会使能),然后使能硬件流(看过很多博主都说使能了硬件流之后SD卡初始化成功概率高很多,我自己测试也确实是),最后设置工作频率1Mhz(计算方式为:SDIO的时钟频率/(SDIOCLK clock divide factor+2),通过时钟树可以看到SDIO的时钟频率为36MHz ,如果SD卡通讯失败率很高,则可以再调小频率进行尝试,若改小后效果仍然很差,需检查硬件布线是否存在较大线长差异或线路干扰等);
在这里插入图片描述

接下来开启SDIO的DMA通道及中断使能:

由于是从SD卡读取数据到MCU,所以方向选择外设到内存;
在这里插入图片描述
在这里插入图片描述

这里设置好后要到中断优先级NVIC里面,将DMA的中断优先级改低,一般DMA的中断优先级都调到比其他重要中断低,防止大规模传输数据时打断其他重要中断:
在这里插入图片描述
这样SDIO就配置完成了。

3.移植FATFS文件系统:
在这里插入图片描述

这里也没啥需要进行配置修改的,由于大家都是中国人,难免会用到中文给文件夹起名,所以这里将CODE_PAGE修改为simplified Chinese即可,同时为了避免长文件名出错,所以也使能了USE_LFN使用栈的方式。由于这里我们只用了一个外部存储器(TF卡),所以VOLUMES默认为1即可,操作块(MAX_SS及MIN_SS)为512字节也是默认即可。

然后配置其设备检测IO口(即上面原理图跟CD脚相连的MCU的IO口,低电平触发,所以配置为上拉输入即可):
在这里插入图片描述
至此SDIO(DMA)跟FATFS文件系统也配置完成。

接下来就是Keil生成工程,这里把堆栈可申请空间都稍微调大至4KB,确保FATFS和Tinyjpeg操作时有足够的空间。请添加图片描述

3.对工程进行修改,并测试MCU跟SD卡正常通讯及挂载FATFS系统

打开KEIL工程的main.c文件,找到SDIO初始化的位置将其数据总线改为1位,这里仅是做初始化用(初始化用1位数据总线,400KHz以下频率),初始化完成后程序会切换到4位数据总线:
在这里插入图片描述
在这里插入图片描述
接下来编写SD卡的测试函数:
1.配置uart对接printf函数:
在这里插入图片描述

#include "stdio.h"#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */PUTCHAR_PROTOTYPE                       //重定义usart1,之后使用printf()函数将自动通过串口1输出
{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);   //改变&huart1为&huart2可以选择串口2return ch;
} 

然后勾选USE MicroLIB库:
在这里插入图片描述

2.读取SD卡的

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

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

相关文章

数据结构-散列表查找(哈希表)

一,散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集中存在这个记录&#xff0…

Stable Diffusion 简单了解一下

1. 帮我简单介绍一下:StableDiffusion 🌈 Stable Diffusion 是什么? Stable Diffusion 是一个 文本生成图像(Text-to-Image) 的人工智能模型。你只需要输入一句话,它就能根据这句话生成一张高质量的图片。 比如: "一只穿着太空服的猫,在月球上弹吉他"St…

R语言科研编程-标准偏差柱状图

生成随机数据 在R中&#xff0c;可以使用rnorm()生成正态分布的随机数据&#xff0c;并模拟分组数据。以下代码生成3组&#xff08;A、B、C&#xff09;随机数据&#xff0c;每组包含10个样本&#xff1a; set.seed(123) # 确保可重复性 group_A <- rnorm(10, mean50, sd…

普罗米修斯监控CPU\内存汇聚图

要找出内存使用率大于80%的主机&#xff0c;你可以使用以下PromQL查询。这个查询会计算每个节点的内存使用率&#xff0c;然后筛选出使用率超过80%的节点&#xff1a; (avg by(nodename) ((node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)* on(instance) group…

飞牛fnNAS手机相册备份及AI搜图

目录 一、相册安装应用 二、手机开启自动备份 三、开始备份 四、照片检索 五、AI搜图设置 六、AI搜图测试 七、照片传递 现代的手机,已经成为我们最亲密的“伙伴”。自从手机拍照性能提升后,手机已经完全取代了简单的卡片相机,而且与入门级“单反”相机发起了挑战。在…

华为高斯数据库(GaussDB)深度解析:国产分布式数据库的旗舰之作

高斯数据库介绍 一、高斯数据库概述 GaussDB是华为自主研发的新一代分布式关系型数据库&#xff0c;专为企业核心系统设计。它支持HTAP&#xff08;混合事务与分析处理&#xff09;&#xff0c;兼具强大的事务处理与数据分析能力&#xff0c;是国产数据库替代的重要选择。 产…

网页 CSS美化2(详解)

这是接着上一篇css基础的第二篇&#xff1a;主要开始对页面的布局进行学习 显示模式&#xff1a; 块级模式&#xff08;Block&#xff09; 特点 &#xff1a; 元素会独占一行&#xff0c;在其前后会自动换行&#xff0c;与其他块级元素在垂直方向上排列。 宽度默认为所在容器…

JSON解析性能优化全攻略:协程调度器选择与线程池饥饿解决方案

简介 JSON解析是现代应用开发中的基础操作,但在使用协程处理时,若调度器选择不当,会导致性能严重下降。特别是当使用Dispatchers.IO处理JSON解析时,可能触发线程池饥饿,进而引发ANR或系统卡顿。本文将深入剖析这一问题的技术原理,提供全面的性能检测方法,并给出多种优化…

python打卡第37天

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#xf…

【洛谷P9303题解】AC- [CCC 2023 J5] CCC Word Hunt

在CCC单词搜索游戏中&#xff0c;单词隐藏在一个字母网格中。目标是确定给定单词在网格中隐藏的次数。单词可以以直线或直角的方式排列。以下是详细的解题思路及代码实现&#xff1a; 传送门&#xff1a; https://www.luogu.com.cn/problem/P9303 解题思路 输入读取与初始化&…

LangGraph + LLM + stream_mode

文章目录 LLM 代码valuesmessagesupdatesmessages updatesmessages updates 2 LLM 代码 from dataclasses import dataclassfrom langchain.chat_models import init_chat_model from langgraph.graph import StateGraph, STARTfrom langchain_openai import ChatOpenAI # 初…

Pydantic 学习与使用

Pydantic 学习与使用 在 Fastapi 的 Web 开发中的数据验证通常都是在使用 Pydantic 来进行数据的校验&#xff0c;本文将对 Pydantic 的使用方法做记录与学习。 **简介&#xff1a;**Pydantic 是一个在 Python 中用于数据验证和解析的第三方库&#xff0c;它现在是 Python 使…

批量文件重命名工具

分享一个自己使用 python 开发的小软件&#xff0c;批量文件重命名工具&#xff0c;主要功能有批量中文转拼音&#xff0c;简繁体转换&#xff0c;大小写转换&#xff0c;替换文件名&#xff0c;删除指定字符&#xff0c;批量添加编号&#xff0c;添加前缀/后缀。同时还有文件时…

多语言视角下的 DOM 操作:从 JavaScript 到 Python、Java 与 C#

多语言视角下的 DOM 操作&#xff1a;从 JavaScript 到 Python、Java 与 C# 在 Web 开发中&#xff0c;文档对象模型&#xff08;DOM&#xff09;是构建动态网页的核心技术。它将 HTML/XML 文档解析为树形结构&#xff0c;允许开发者通过编程方式访问和修改页面内容、结构和样…

【C/C++】红黑树学习笔记

文章目录 红黑树1 基本概念1.1 定义1.2 基本特性推理1.3 对比1.4 延伸1.4.1 简单判别是否是红黑树1.4.2 应用 2 插入2.1 插入结点默认红色2.2 插入结点2.2.1 插入结点是根结点2.2.2 插入结点的叔叔是红色2.2.3 插入结点的叔叔是黑色场景分析LL型RR型LR型RL型 3 构建4 示例代码 …

网络通信的基石:深入理解帧与报文

在这个万物互联的时代&#xff0c;我们每天都在享受着网络带来的便利——从早晨查看天气预报&#xff0c;到工作中的视频会议&#xff0c;再到晚上刷着短视频放松。然而&#xff0c;在这些看似简单的网络交互背后&#xff0c;隐藏着精密而复杂的数据传输机制。今天&#xff0c;…

STM32 SPI通信(硬件)

一、SPI外设简介 STM32内部集成了硬件SPI收发电路&#xff0c;可以由硬件自动执行时钟生成、数据收发等功能&#xff0c;减轻CPU的负担 可配置8位/16位数据帧、高位先行/低位先行 时钟频率&#xff1a; fPCLK / (2, 4, 8, 16, 32, 64, 128, 256) 支持多主机模型、主或从操作 可…

尚硅谷redis7-11-redis10大类型之总体概述

前提&#xff1a;我们说的数据类型一般是value的数据类型&#xff0c;key的类型都是字符串。 redis字符串【String】 string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 string类型是Redis最基本的数据类型,一个redis中字符串va…

【递归、搜索与回溯算法】专题一 递归

文章目录 0.理解递归、搜索与回溯1.面试题 08.06.汉诺塔问题1.1 题目1.2 思路1.3 代码 2. 合并两个有序链表2.1 题目2.2 思路2.3 代码 3.反转链表3.1 题目3.2 思路3.3 代码 4.两两交换链表中的节点4.1 题目4.2 思路4.3 代码 5. Pow(x, n) - 快速幂5.1 题目5.2 思路5.3 代码 0.理…

C#实现List导出CSV:深入解析完整方案

C#实现List导出CSV&#xff1a;深入解析完整方案 在数据交互场景中&#xff0c;CSV文件凭借其跨平台兼容性和简洁性&#xff0c;成为数据交换的重要载体。本文将基于C#反射机制实现的通用CSV导出方案&#xff0c;结合实际开发中的痛点&#xff0c;从基础实现、深度优化到生产级…