FATFS備忘

概述

FATFS文件系統可以掛載SD卡也可以掛載FLASH eMMC等設備

SD卡需要格式化為FAT32模式 塊大小默認即可

image-20250401131154037

移植

SD卡

SD卡扇區大小是 512B

SD卡 SDIO模式 可以直接在cubeMX里一鍵設置

先設置好SD卡的設置

這個是選擇支持中文 其余是默認

image-20250401144906909

這個是檢測引腳可以留空

當SD卡插入拔出時會引起檢測腳的變化

image-20250401144931735

FLASH

FLASH接入FATFS需要自行修改接口,選用自定義模式

建議配合USB MSC功能使用

cubeMX配置

使用自定義模式,將扇區大小改為從512到4096都可

image-20250406164521203

設置內容

全在cubeMX生成的user_diskio.c

先導入頭文件和設置扇區大小

image-20250406165626285

需要設置的APIs

全在cubeMX生成的user_diskio.c

初始化
描述名稱功能
BYTE(uint8_t)pdrv磁盤編號
DSTATUS輸出錯誤碼
DSTATUS USER_initialize (BYTE pdrv)

成功返回RES_OK 失敗返回RES_ERROR

根據自己初始化寫入函數

例子

這里不需要初始化直接返回成功即可

DSTATUS USER_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */
)
{/* USER CODE BEGIN INIT */UNUSED(pdrv);return RES_OK;/* USER CODE END INIT */
}
獲取磁盤狀態
描述名稱功能
BYTE(uint8_t)pdrv磁盤編號
DSTATUS輸出錯誤碼
DSTATUS USER_status(BYTE pdrv)

成功返回RES_OK 失敗返回RES_ERROR

不使用返回即可

例子

DSTATUS USER_status(BYTE pdrv /* Physical drive number to identify the drive */
)
{/* USER CODE BEGIN STATUS */UNUSED(pdrv);return RES_OK;/* USER CODE END STATUS */
}
讀取扇區
描述名稱功能
BYTE(uint8_t)pdrv磁盤編號
BYTE(uint8_t)buff緩沖區
DWORDsector扇區編號
UINT (uint32_t)count扇區數量
DSTATUS輸出錯誤碼
DRESULT USER_read(BYTE pdrv,BYTE *buff,DWORD sector,UINT count)

示例

這個函數 W25Qxx_Read_Data輸入的是FLASH的地址和byte數量,因此要乘上扇區大小

DRESULT USER_read(BYTE pdrv,    /* Physical drive nmuber to identify the drive */BYTE *buff,   /* Data buffer to store read data */DWORD sector, /* Sector address in LBA */UINT count    /* Number of sectors to read */
)
{/* USER CODE BEGIN READ */W25Qxx_Read_Data(sector * USER_SECTOR_SIZE, buff, count * USER_SECTOR_SIZE);return RES_OK;/* USER CODE END READ */
}
寫入扇區
描述名稱功能
BYTE(uint8_t)pdrv磁盤編號
BYTE(uint8_t)buff緩沖區
DWORDsector扇區編號
UINT (uint32_t)count扇區數量
DSTATUS輸出錯誤碼
DRESULT USER_write(BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)

示例

這個函數W25Qxx_Write 輸入的是FLASH的地址和byte數量,因此要乘上扇區大小

DRESULT USER_write(BYTE pdrv,        /* Physical drive nmuber to identify the drive */const BYTE *buff, /* Data to be written */DWORD sector,     /* Sector address in LBA */UINT count        /* Number of sectors to write */
)
{/* USER CODE BEGIN WRITE *//* USER CODE HERE */W25Qxx_Write(sector * USER_SECTOR_SIZE, (uint8_t *)buff, count * USER_SECTOR_SIZE, 0);return RES_OK;/* USER CODE END WRITE */
}
控制操作
描述名稱功能
BYTE(uint8_t)pdrv磁盤編號
BYTE(uint8_t)cmd命令
void *buff緩沖區
DSTATUS輸出錯誤碼
DRESULT USER_ioctl(BYTE pdrv,BYTE cmd,void *buff)

必須要響應的命令

描述功能
GET_SECTOR_COUNT扇區數量
GET_SECTOR_SIZE扇區大小 單位byte
GET_BLOCK_SIZE區塊大小

例子

使用W25Q128 16MB

扇區大小為4096=4KB

扇區數為 4096 這里寫4095

區塊直接寫1 即可

DRESULT USER_ioctl(BYTE pdrv, /* Physical drive nmuber (0..) */BYTE cmd,  /* Control code */void *buff /* Buffer to send/receive control data */
)
{/* USER CODE BEGIN IOCTL */DRESULT res = RES_OK;switch (cmd){case CTRL_SYNC:res = RES_OK;break;case CTRL_TRIM:res = RES_OK;break;case GET_SECTOR_COUNT:*(DWORD *)buff = 4095;break;case GET_SECTOR_SIZE:*(DWORD *)buff = USER_SECTOR_SIZE;break;case GET_BLOCK_SIZE:*(DWORD *)buff = 1;break;}return res;/* USER CODE END IOCTL */
}

APIs

地址問題

根據初始化順序,驅動器的根地址分別為0:/ 1:/

比如這個例子里 SD卡的根地址是0:/ USER(可以設為FLASH等) 地址為1:/

image-20250401151430074

掛載

輸入輸出
描述名稱功能
FATFS*fs句柄
const TCHAR*path地址
BYTEopt是否立即加載(一般寫1)
FRESULT輸出錯誤碼
FRESULT f_mount (FATFS* fs,const TCHAR* path,BYTE opt)

掛載例子

f_mount(&hFatfs, "0:/", 1);

打開文件

輸入輸出
描述名稱功能
FIL*fp文件
const TCHAR*path地址
BYTEmode模式
FRESULT輸出錯誤碼
mode
描述功能
FA_READ只讀
FA_WRITE只寫
FA_OPEN_EXISTING如果文件存在,則打開;否則打開失敗
FA_CREATE_NEW創建一個文件,如果文件存在,則創建失敗
FA_CREATE_ALWAYS創建一個文件,如果文件存在,則覆蓋原文件
FA_OPEN_ALWAYS如果文件存在,則打開,如果不存在則創建一個文件并打開

可以輸入 FA_READ | FA_WRITE 來使用讀寫

FRESULT f_open (FIL* fp,const TCHAR* path,BYTE mode)

打開后光標指向開頭

關閉文件

輸入輸出
描述名稱功能
FIL*fp文件
FRESULT輸出錯誤碼
FRESULT f_close (FIL* fp)

讀文件

輸入輸出
描述名稱功能
FIL*fp文件
void*buff緩沖區
UINTbtr操作數量
UINT*br已操作數量
FRESULT輸出錯誤碼
FRESULT f_read (FIL* fp,void* buff,UINT btr,UINT* br)

會從光標處開始讀取 指針自增

寫文件

輸入輸出
描述名稱功能
FIL*fp文件
void*buff緩沖區
UINTbtr操作數量
UINT*br已操作數量
FRESULT輸出錯誤碼
FRESULT f_write (FIL* fp,const void* buff,UINT btw,UINT* bw)

會從光標處開始寫入 指針自增

打印到文件

輸入輸出
描述名稱功能
FIL*fp文件
const TCHAR*fmt規則格式串
.........
int輸出寫入數量
int f_printf (FIL* fp,const TCHAR* fmt,...)

會從光標處開始寫入 指針自增

獲取文件大小

輸入輸出
描述名稱功能
FIL*fp文件
FSIZE_t輸出大小
f_size(fp)

改變光標位置

輸入輸出
描述名稱功能
FIL*fp文件
FSIZE_tofs從頂部開始的偏移
FRESULT輸出錯誤碼
FRESULT f_lseek (FIL* fp,FSIZE_t ofs)

刪除文件

輸入輸出
描述名稱功能
const TCHAR*path路徑
FRESULT輸出錯誤碼
FRESULT f_unlink (const TCHAR* path)

檢查文件是否存在

輸入輸出
描述名稱功能
const TCHAR*path路徑
FILINFO*fno信息
FRESULT輸出不存在FR_NO_FILE,存在FR_OK
FRESULT f_stat (const TCHAR* path,FILINFO* fno)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76940.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76940.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76940.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

唯美社區源碼AM社區同款源碼

源碼介紹 唯美社區源碼AM社區同款源碼 后端修改application.properties文件內容為你的數據庫 前端修改/config/config.js文件內容為你的后端地址 這兩個文件里要修改的地方我已經用中文標注出來了 截圖 源碼免費下載 唯美社區源碼AM社區同款源碼

現代Web應用的多標簽選擇組件:設計哲學與工程實踐

引言:標簽選擇的重要性與挑戰 在信息爆炸時代,標簽系統已成為內容組織的核心基礎設施。研究表明: 使用標簽系統的平臺用戶留存率提高35% 良好的標簽選擇體驗可提升內容發現效率58% 80%的用戶更傾向于使用提供可視化標簽選擇的應用 本文將…

P3799 小 Y 拼木棒

題目背景 上道題中,小 Y 斬了一地的木棒,現在她想要將木棒拼起來。 題目描述 有 n 根木棒,現在從中選 4 根,想要組成一個正三角形,問有幾種選法? 答案對 1097 取模。 輸入格式 第一行一個整數 n。 第…

Perl 條件語句

Perl 條件語句 引言 在編程中,條件語句是執行分支邏輯的關鍵部分。Perl 作為一種強大的腳本語言,提供了豐富的條件語句,使得開發者能夠根據不同的條件執行不同的代碼塊。本文將深入探討 Perl 中的條件語句,包括 if、unless、els…

流量特征分析-蟻劍流量分析

任務: 木馬的連接密碼是多少 這是分析蟻劍流量,可能是網站的,wireshark過濾http 追蹤流http得到 1就是連接密碼 flag{1}黑客執行的第一個命令是什么 取最后的執行命令。base64解密得 除了id不是蟻劍自帶的命令,其他的都是&…

問題1:Sinal 4在開啟PAC檢查的設備崩潰

? 問題信息 硬件不支持PAC(Pointer Authentication),此類錯誤就是signal 11的錯誤,崩潰信息如下: Build fingerprint: google/sdk_gphone64_arm64/emu64a:16/BP22.250221.010/13193326:userdebug/dev-keys Revision: 0 ABI: arm64 Timestamp: 2025-04-06 11:33:13.923…

FreeRTOS移植筆記:讓操作系統在你的硬件上跑起來

一、為什么需要移植? FreeRTOS就像一套"操作系統積木",但不同硬件平臺(如STM32、ESP32、AVR等)的CPU架構和外設差異大,需要針對目標硬件做適配配置。移植工作就是讓FreeRTOS能正確管理你的硬件資源。 二、…

【C++11(下)】—— 我與C++的不解之緣(三十二)

前言 隨著 C11 的引入,現代 C 語言在語法層面上變得更加靈活、簡潔。其中最受歡迎的新特性之一就是 lambda 表達式(Lambda Expression),它讓我們可以在函數內部直接定義匿名函數。配合 std::function 包裝器 使用,可以…

JavaScript中的Proxy詳解

1. 什么是Proxy? Proxy是ES6引入的一個強大特性,它允許你創建一個對象的代理,從而可以攔截和自定義該對象的基本操作。Proxy提供了一種機制,可以在對象的基本操作,如屬性查找、賦值、枚舉、函數調用等之前或之后執行自…

【git】VScode修改撤回文件總是出現.lh文件,在 ?所有 Git 項目 中全局忽略特定文件

VScode里面powershell被迫關閉 場景解決辦法 場景 系統:Windows IDE:Visual Studio Code 一旦修改代碼,就算撤回也會顯示 解決辦法 第一步:“C:\Users\用戶名字.gitignore_global”:在該路徑下新建.gitignore_glo…

為什么 LoRA 梯度是建立在全量參數 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微調的 我們原來要訓練的參數矩陣是 W W W,但 LoRA 說: 別動 W,我在它旁邊加一個低秩矩陣 Δ W U V \Delta W UV ΔWUV,只訓練這個部分! 也就是說,LoRA 用一個…

Nginx負載均衡時如何為指定ip配置固定服務器

大家在用Nginx做負載均衡時,一般是采用默認的weight權重指定或默認的平均分配實現后端服務器的路由,還有一種做法是通過ip_hash來自動計算進行后端服務器的路由,但最近遇到一個問題,就是希望大部分用戶采用ip_hash自動分配后端服務…

Llama 4 家族:原生多模態 AI 創新的新時代開啟

0 要點總結 Meta發布 Llama 4 系列的首批模型,幫用戶打造更個性化多模態體驗Llama 4 Scout 是有 170 億激活參數、16 個專家模塊的模型,同類中全球最強多模態模型,性能超越以往所有 Llama 系列模型,能在一張 NVIDIA H100 GPU 上運…

【硬件開發技巧】如何通過元器件絲印反查型號

目錄 一、在線數據庫查詢 二、官方資料匹配 三、專業軟件輔助 四、實物比對與場景推斷 五、社區與人工支持 注意事項 一、在線數據庫查詢 專業元器件平臺 Digi-Key、Mouser、ICMaster等平臺支持直接輸入絲印代碼檢索,可獲取芯片型號、技術文檔及替代型號。例如…

【算法/c++】利用中序遍歷和后序遍歷建二叉樹

目錄 題目:樹的遍歷前言題目來源樹的數組存儲基本思想存儲規則示例 建樹算法關鍵思路代碼總代碼 鏈表法 題目:樹的遍歷 前言 如果不是完全二叉樹,使用數組模擬樹,會很浪費空間。 題目來源 本題來自 PTA 天梯賽。 題目鏈接: 樹…

李臻20242817_安全文件傳輸系統項目報告_第6周

安全文件傳輸系統項目報告(第 1 周) 1. 代碼鏈接 Gitee 倉庫地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代碼結構說明: project-root/├── src/ # 源代碼目錄│ ├── main.c # 主程序入口│ ├…

嵌入式rodata段

在嵌入式軟件開發中,將數據放入只讀數據段(.rodata)具有以下好處及典型應用示例: 好處 數據保護 .rodata段的內容在程序運行時不可修改,防止意外或惡意篡改,提升系統穩定性。 節省RAM資源 只讀數據可直接…

InfoSec Prep: OSCP靶場滲透

InfoSec Prep: OSCP InfoSec Prep: OSCP ~ VulnHubInfoSec Prep: OSCP, made by FalconSpy. Download & walkthrough links are available.https://www.vulnhub.com/entry/infosec-prep-oscp,508/ 1,將兩臺虛擬機網絡連接都改為NAT模式 2,攻擊機上做…

【JavaWeb-Spring boot】學習筆記

目錄 <<回到導覽Spring boot1. http協議1.1.請求協議1.2.響應協議 2.Tomcat2.1.請求2.1.1.apifox2.1.2.簡單參數2.1.3.實體參數2.1.4.數組集合參數2.1.5.日期參數2.1.6.(重點)JSON參數2.1.7.路徑參數 2.2.響應2.3.綜合練習 3.三層架構3.1.三層拆分3.2.分層解耦3.3.補充 &…

C++的多態-上

目錄 多態的概念 多態的定義及實現 1.虛函數 2. 多態的實現 2.1.多態構成條件 2.2.虛函數重寫的兩個例外 (1)協變(基類與派生類虛函數返回值類型不同) (2)析構函數的重寫(基類與派生類析構函數的名字不同) 2.3.多態的實現 2.4.多態在析構函數中的應用 2.5.多態構成條…