SD卡+FATFS+Tinyjpeg圖片解碼顯示 (STM32F103VET6通過CubeMX快速建立工程)

先展示最終實現的功能效果如下:

在這里插入圖片描述

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;從基礎實現、深度優化到生產級…