上次給大家分享了《2017年最全的excel函數大全7—財務函數(下)》,這次分享給大家文本函數(上)。
描述
對于雙字節字符集 (DBCS) 語言,該函數將全角(雙字節)字符轉換成半角(單字節)字符。
用法
ASC(text)
ASC 函數用法具有以下參數:
· Text必需。文本或對包含要更改文本的單元格的引用。如果文本不包含任何全角字母,則不會對文本進行轉換。
案例
=ASC(EXCEL)等于 EXCEL
=ASC() equals
描述
將數字轉換為泰語文本并添加后綴“泰銖”。
通過“區域和語言選項”(Windows“開始”菜單、“控制面板”),可以將 Excel 桌面應用程序中的泰銖格式更改為其他樣式。
用法
BAHTTEXT(number)
BAHTTEXT 函數用法具有以下參數:
· Number必需。 要轉換成文本的數字、對包含數字的單元格的引用或結果為數字的公式。
案例
描述
返回對應于數字代碼的字符。 使用 CHAR 可將從其他類型計算機上的文件中獲取的代碼頁數字轉換為字符。
用法
CHAR(number)
CHAR 函數用法具有以下參數:
· Number必需。 介于 1 到 255 之間的數字,指定所需的字符。 使用的是當前計算機字符集中的字符。
案例
描述
刪除文本中所有不能打印的字符。 對從其他應用程序導入的文本使用 CLEAN,將刪除其中含有的當前操作系統無法打印的字符。 例如,可以使用 CLEAN 刪除某些通常出現在數據文件開頭和結尾處且無法打印的低級計算機代碼。
用法
CLEAN(text)
CLEAN 函數用法具有以下參數:
· 文本必需。 要從中刪除非打印字符的任何工作表信息。
案例
描述
返回文本字符串中第一個字符的數字代碼。 返回的代碼對應于本機所使用的字符集。
用法
CODE(text)
CODE 函數用法具有以下參數:
· Text必需。 要為其獲取第一個字符的代碼的文本。
案例
描述
CONCAT 函數將多個區域和/或字符串的文本組合起來,但不提供分隔符或 IgnoreEmpty 參數。
用法
CONCAT(text1, [text2],…)
例如,=CONCAT(明, ,天, ,將, ,有, ,日, ,出。) 將返回明天將有日出。
備注
· 如果結果字符串超過 32767 個字符(單元格限制),則 CONCAT 返回 #VALUE! 錯誤。
案例
案例 1
由于此函數允許整列和整行引用,所以它將返回以下結果:A’sa1a2a4a5a6a7B’sb1b2b4b5b6b7
案例 2
結果:a1b1a2b2a4b4a5b5a6b6a7b7
案例 3
描述
使用CONCATENATE(其中一個文本函數)將兩個或多個文本字符串聯接為一個字符串。
用法:
CONCATENATE(text1, [text2], ...)
例如:
· =CONCATENATE(Stream population for , A2, , A3, is , A4, /mile)
· =CONCATENATE(B2, , C2)
案例
常見問題
最佳做法
描述
本“幫助”主題中描述的函數將字符串中的半角(單字節)字母轉換為全角(雙字節)字符。函數的名稱(及其轉換的字符)取決于您的語言設置。
對于日文,該函數將字符串中的半角(單字節)英文字母或片假名更改為全角(雙字節)字符。
用法
DBCS(text)
DBCS 函數用法具有以下參數:
· Text必需。文本或包含要轉換的文本的單元格的引用。如果文本中不包含任何半角英文字母或片假名,則不會對文本進行轉換。
案例
=DBCS(EXCEL)等于 EXCEL
=DBCS() equals
以上是所有EXCEL的文本函數(上)描述用法以及使用案例。這次分享中存在哪些疑問或者哪些不足,可以在下面進行評論。如果覺得不錯,可以分享給你的朋友,讓大家一起掌握這些excel的文本函數(上)。
1 、FAT 文件系統概述
1.1 FAT 概述
文件分配表 (FAT)文件系統是由比爾蓋茨與麥克唐納所開發。它是一種格式,某種程度上 也算是軟件,它用于在存儲設備 (比如磁盤驅動或內存)上保存和組織文件。它用于方便文 件與目錄的訪問。
FAT 文件系統提供一種途徑來記錄文件被創建或更改時的時間標記,并且提供了識別文件大 小的方法。這套系統提供了保存文件其它屬性的一套機制,比如文件是否只讀,是否應在目 錄顯示中隱藏,或者是否應在下一次磁盤備份中歸檔。
FAT 文件系統特別適合消費電子產品中的移動閃存介質,比如數碼相機、媒體播放器和閃存 盤等。
FAT 文件系統可以在以下場合中帶來幫助:
? 由于 FAT 文件系統具備向后兼容性,用戶可以利用記憶棒或軟盤在消費電子設備和采用 過時操作系統的計算機之間傳輸文件。
? FAT 文件系統讓用戶能夠快速刪除電子設備上的文件,就像在專業廣播媒介中那樣。
? FAT16 或 FAT32 的文件系統版本均適用于硬盤卷。
另外,如果用戶想要通過軟盤訪問硬盤卷上的數據 (往往指系統恢復工具)來引導計算機的 話,這些版本也很有用處。
1.1.1 主引導記錄
主引導記錄(MBR)位于設備物理起始位置上的一個或多個扇區。MBR 的引導區包含 DOS 引導加載程序代碼,該代碼會在設備格式化后被寫入(否則不會被動態 C FAT 文件系統所使 用)。引導區之后是分區表。分區表中含有四個 16 字節的條目,允許設備劃分多達四個分區。
分區表條目中含有一些關鍵信息:分區類型 (動態 C FAT 可識別 FAT12 和 FAT16 的分區類
型)以及分區的起始與結束扇區號。另外還有一個字段指明分區中的扇區總數。如果該數字 為零,則對應的分區是空的可用分區。
某些設備經格式化后沒寫入 MBR,因此便也沒有分區表。目前在動態 C FAT 文件系統中并不 支持這種配置
1.1.2 FAT 分區
有效 FAT 文件系統分區的第一個扇區中包含 BIOS 參數塊 (BPB) ,之后是文件分配表 (FAT),再之后是根目錄。下圖顯示了具備兩個 FAT 分區的設備。
BIOS 參數塊
BPB 中的字段包含該分區的描述信息:
? 每個扇區的字節數;
? 每個簇的扇區數;
? 該分區的扇區總數;
? 根目錄下的條目數。
FAT 分配表
文件分配表是一種結構,也是 FAT 文件系統的命名由來。 FAT 中保存了關于簇的分配信息。 一個簇既可以分配給一個文件,也可以使用,還可以標記為壞簇。 FAT 分配表的副本會緊跟 著第一個 FAT 分配表存放。
根目錄
根目錄具有預定義的位置及大小。根目錄有 512 個條目,每個條目 32 字節。根目錄中的條目 既可以是空條目,也可以包含文件或子目錄名稱(以 8.3 格式)、文件大小、上一次修改的日 期時間以及文件或子目錄的起始簇號。
數據區
數據區占據了分區中的大部分空間。其中包含文件數據與子目錄。請注意,按照慣例,分區 的數據區必須從第 2 簇開始。
欲了解更多信息,請參考 Microsoft? EFI FAT32 文件系統規范。
2 、FatFs 文件系統
2.1 FatFs 概述
FatFs 是適用于小型嵌入式系統的 FAT 文件系統模塊。FatFs 是按照 ANSI C 的標準來指定, 且與磁盤 I/O 層完全分隔開。因此, FatFs 與硬件架構完全無關,具有以下特點:
? 兼容 Windows 的 FAT 文件系統。
? 極小的代碼量和工作區
? 豐富的配置選項:
– 多卷 (物理驅動與分區)。
– 多個 ANSI/OEM 代碼頁,包括 DBCS。
– 以 ANSI/OEM 或 Unicode 支持長文件名。
– 支持 RTOS。
– 支持多種扇區大小。
– 只讀、小化的 API、 I/O 緩沖等等 ......
– FAT子類型:FAT12、 FAT16 和 FAT32。
– 打開的文件數量:無限制,取決于可用的內存。
– 卷的數量:多達 10 個。
– 文件大小:取決于 FAT 規范。(多達 4G-1 字節)
– 卷的大小:取決于 FAT 規范。(512 字節 / 扇區情況下,支持多達 2T 字節)
– 簇的大小:取決于 FAT 規范。(512 字節 / 扇區情況下,支持多達 64K 字節)
– 扇區的大小:取決于 FAT 規范。(多達 4K 字節)
2.2 FatFs 架構
FatFs 模塊是一個中間件,提供許多用于訪問 FAT 卷的函數,比如 f_open()、 f_close()、 f_read()、 f_write() 等等 (參考 ff.c)。
該模塊沒有平臺依賴性,只要編譯器符合 ANSI C 即可。
使用底層磁盤 I/O 模塊來讀取 / 寫入物理驅動。
采用 RTC 模塊來獲取當前時間。
底層磁盤 I/O 和 RTC 模塊均與 FatFs 模塊完全分離。它們必須由用戶提供,這是將 FatFs 模 塊與其它平臺相連的主要工作。
2.3 FatFs 特性
2.3.1 復制文件訪問
FatFs 模塊默認并不支持對復制文件的共享控制。僅當文件的打開方式為只讀模式時,才允許 共享控制。禁止以寫入模式對文件進行復制打開,而且打開的文件不允許被重命名和刪除,否 則會破壞卷的 FAT 結構。
當將 _FS_LOCK 設為 1 或更大的數值時,也可使用文件共享控制。 該數值設定了同時管理
的文件數目。在這種情況下,如果嘗試 “ 打開 ”、“ 重命名 ” 或 “ 刪除 ” 等違反上述文件共享規 則的操作,則文件功能失敗,提示 FR_LOCKED。如果打開的文件數量大于 _FS_LOCK,那 么 f_open() 函數也會執行失敗,提示 FR_TOO_MANY_OPEN_FILES。
2.3.2 可重入性
對不同卷的文件操作是可重入的,并且可以同時工作。對同一個卷的文件操作是不可重入的, 但可利用 _FS_REENTRANT option 選項配置為線程安全。在這種情況下,必須將依賴于操 作系統的同步對象控制函數ff_cre_syncobj()、ff_del_syncobj()、ff_req_grant()和ff_rel_grant() 添加到項目中。
當卷被其它任務使用時,如果文件函數被調用,則這個文件函數會保持掛起,直至該任務結 束。如果等待時間超過 _TIMEOUT 所設定的時間,那么文件函數會以 FR_TIMEOUT 退出。 某些 RTOS 并不支持這種超時功能。
f_mount() 和 f_mkfs() 函數是例外。這些函數對于同一個卷并不具備可重入性。當使用這些函 數時,所有其它任務必須關閉該卷上的對應文件,以避免對卷的訪問。
請注意,這一節描述的是 FatFs 模塊本身的可重入性,但底層磁盤 I/O 層也必須是可重入的。
2.3.3 長文件名
FatFs 模塊從版本 0.07 開始便支持長文件名 (LFN)。除了 f_readdir() 函數以外,一個文件 的 SFN 和 LFN 這兩種不同的文件名對于文件函數來說是透明的。如需使能 LFN 功能,請將 _USE_LFN 設為 1、 2 或 3,然后在項目中添加 Unicode 代碼轉換函數 ff_convert() 和 ff_wtoupper()。LFN 功能需要附加一個特定的工作緩沖。緩沖的大小可根據可用內存大小,利 用 _MAX_LFN 來進行配置。長文件名可達 255 個字符,所以 _MAX_LFN 應設為 255,以實 現完全的 LFN 功能。如果工作緩沖的大小不足以存放給定的文件名,則文件函數執行失敗并 提示 FR_INVALID_NAME。當以可重入功能使能 LFN 特性時,_USE_LFN 必須設為 2 或 3。 這種情況下,文件函數會在棧或堆里分配工作緩沖。工作緩沖會占據 (_MAX_LFN + 1) * 2 個 字節。
當使能 LFN 功能時,模塊大小會根據所選擇的代碼頁而有所增大。右表顯示了當以某些代碼 頁使能 LFN 功能時,所增加的字節數。
2.4、FatFs API
FatFs 的 API 層用于執行文件系統 API。它采用磁盤 I/O 接口與適當的物理驅動通信。這些 API 可劃分為四組:
? 操作邏輯卷或分區的 API 分組。
? 操作目錄的 API 分組。
? 操作文件的 API 分組。
? 操作文件和目錄的 API 分組。
以下列出了 FatFs 訪問 FAT 卷時所能執行的操作:
? f_mount():掛載 / 卸載邏輯磁盤
? f_open():打開 / 創建文件
? f_close():關閉文件
? f_read():讀取文件
? f_write():寫入文件
? f_lseek():移動讀 / 寫指針,擴大文件的大小
? f_truncate():截取文件到當前已讀 / 已寫指針位置
? f_sync():同步內存中的數據到磁盤
? f_opendir():打開一個目錄
? f_readdir():讀取目錄條目
? f_getfree():獲取空閑的簇的數量
? f_stat():檢查對象是否存在,并獲取其狀態
? f_mkdir():創建目錄
? f_unlink():刪除文件或目錄
? f_chmod():更改屬性
? f_utime():更改時間戳
? f_rename():重命名 / 移動文件或目錄
? f_chdir():更改當前目錄
? f_chdrive():更改當前驅動
? f_getcwd():檢索當前目錄
? f_getlabel():獲取卷標簽
? f_setlabel():設置卷標簽
? f_forward():將文件數據直接轉發至流
? f_mkfs():在驅動上創建文件系統
? f_fdisk():劃分物理驅動
? f_gets():讀取字符串
? f_putc():寫入字符
? f_puts():寫入字符串
? f_printf():寫入格式化的字符串
? f_tell():獲取當前的讀 / 寫指針
? f_eof():檢驗是否達到文件末尾
? f_size():獲取文件大小
? f_error():檢驗文件是否出錯
2.5 FatFs 底層 API
由于 FatFs 模塊與磁盤 I/O 和 RTC 模塊完全分離,所以需要一些底層功能來操作物理驅動: 讀 / 寫和獲取當前時間。因為底層磁盤 I/O 功能和 RTC 模塊并非 FatFs 模塊的組成部分,所 以必須由用戶提供。
FatFs 中間件解決方案為某些支持的磁盤驅動(RAMDisk、uSD、USBDisk)提供底層磁盤 I/O 驅動。
已添加額外接口層 diskio.c,用于為 FatFs 模塊動態添加 / 刪除(鏈接)物理介質,提供如下 所述的底層磁盤 I/O 函數:
? disk_initialize():初始化物理磁盤驅動
? disk_status():返回所選物理驅動的狀態
? disk_read():讀取磁盤中的扇區
? disk_write():將扇區寫入磁盤
? disk_ioctl():控制設備的專用功能
? get_fattime():返回當前時間 應用程序禁止調用這些函數,這些函數僅可由 FatFs 文件系統函數調用,比如 f_mount()、 f_read()、 f_write()...
2.6 將 FatFs 整合至 STM32CubeF4
在 STM32CubeF4 解決方案中,已添加額外的接口層,用于動態地添加 / 刪除 FatFs 模塊的 物理介質。如需以底層磁盤 I/O 驅動來連接 FatFs 模塊,用戶可以使用 FATFS_LinkDriver() 和 FATFS_UnLinkDriver() 動態地添加或者刪除磁盤 I/O 驅動;應用程序可能需要知道當前連 接的磁盤 I/O 驅動數量,這一點可通過 FATFS_GetAttachedDriversNbr() API 來實現。
通用的底層驅動 ff_gen_drv.c/h 位于 FatFs 模塊的根目錄下。采用兩個磁盤 I/O 驅動類型定義 結構,協助動態管理 ff_gen_drv.h 文件下所連接的磁盤驅動,如下所述:
如需將 FatFs 模塊與底層磁盤 I/O 驅動相連接,用戶可以使用以下 API:
? FATFS_LinkDriver():用于動態添加磁盤 I/O 驅動。
? FATFS_UnLinkDriver():用于動態刪除磁盤 I/O 驅動。
? FATFS_GetAttachedDriversNbr():了解當前所連接的磁盤 I/O 驅動數量
2.6.1 FATFS_LinkDriver()
該函數用于連接兼容的磁盤 I/O 驅動,并增加已激活連接的驅動的數量。如果成功則返回 0, 失敗則返回 1。
注 :因為 FatFs方 面 的 限 制 , 所 連 接 的 磁 盤 大 數 目 ( _VOLUMES )為 10個。
FATFS_LinkDriver 的實現:
uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path)
{
uint8_t ret = 1; uint8_t DiskNum = 0;
if(disk.nbr <= _VOLUMES) {
disk.drv[disk.nbr] = drv;
DiskNum = disk.nbr++;
path[0] = DiskNum + '0';
path[1] = ':';
path[2] = '/';
path[3] = 0;
ret = 0;
}
return ret;
}
2.6.2 FATFS_UnlinkDriver()
該函數用于解除與磁盤 I/O 驅動的連接,并減少已激活連接的驅動數量。如果成功則返回 0, 失敗則返回 1。
FATFS_UnLinkDriver 的實現:
uint8_t FATFS_UnLinkDriver(char *path)
{
uint8_t DiskNum = 0;
uint8_t ret = 1;
if(disk.nbr >= 1)
{
DiskNum = path[0] - '0';
if(DiskNum <= disk.nbr)0
{
disk.drv[disk.nbr--] = 0;
ret = 0;
}
}
return ret;
}
2.6.3 FATFS_GetAttachedDriverNbr()
該函數返回已連接至 FatFs 模塊的驅動數量。
FATFS_GetAttachedDriversNbr 的實現:
uint8_t FATFS_GetAttachedDriversNbr(void)
{ return disk.nbr; }
2.7 將自己的磁盤連接至 FatFs
如果工作存儲控制模塊可用,應通過粘合函數連接至 FatFs,而不是進行修改。用戶可以開發 適當的磁盤 I/O 底層驅動來連接任意的新磁盤(mynewdisk_diskio.c/.h),并將這些驅動文件 保存在:\Middlewares\Third_Party\FatFs\src\drivers。
值得注意的是,所提供的 FatFs 磁盤 I/O 底層驅動依賴于板級 BSP 驅動。如需移除這種 BSP 依賴性,用戶可以將 “BSP_...” 的 API 調用替換為自己的代碼,以確保實現正確的功能性。
如需從頭開始開發磁盤 I/O 底層驅動,用戶可以從下述的粘合函數骨架開始,用已定義的 API 將現有的存儲控制模塊添加到 FatFs。
適用于 FatFs 的底層磁盤 I/O 模塊骨架:
/*-------------------------------------------------------------------------*/
/* mynewdisk_diskio.c:適用于 FAT 的底層磁盤 I/O 模塊框架 */
/*-------------------------------------------------------------------------*/
/* 包含的頭文件 -------------------------------------------------------------*/
#include <string.h> #include "ff_gen_drv.h"
/* 私有的宏定義 ---------------------------------------------------------*/
#define BLOCK_SIZE 512 /* Block Size in Bytes */
/* 私有變量 --------------------------------------- */
static volatile DSTATUS Stat = STA_NOINIT; /* 磁盤狀態 */
/* 私有函數原型 --------------------------------------------*/
DSTATUS mynewdisk_initialize (void);
DSTATUS mynewdisk_status (void);
DRESULT mynewdisk_read (BYTE*, DWORD, BYTE);
#if _USE_WRITE == 1
DRESULT mynewdisk_write (const BYTE*, DWORD, BYTE);
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
DRESULT mynewdisk_ioctl (BYTE, void*);
#endif /* _USE_IOCTL == 1 */
Diskio_drvTypeDef mynewdisk_Driver =
{
mynewdisk_initialize,
mynewdisk_status,
mynewdisk_read,
#if _USE_WRITE == 1
mynewdisk_write,
#endif /* _USE_WRITE == 1 */
/*------------------------ 初始化驅動 ---------------------------*/
DSTATUS mynewdisk_initialize (void)
{
Stat = STA_NOINIT;
// 在此寫入自己的代碼,對驅動進行初始化
Stat &= ~STA_NOINIT;
return Stat;
}
/*------------------------- 獲取磁盤狀態 -----------------------------*/
DSTATUS mynewdisk_status (void)
{
Stat = STA_NOINIT;
// 在此寫入自己的代碼
return Stat;
}
/*-------------------------- 讀取扇區 -----------------------------*/
DRESULT mynewdisk_read (BYTE *buff, /* 保存讀取數據的數據緩沖 */
DWORD sector, /* 扇區地址 (LBA) */
BYTE count) /* 讀取的扇區數 (1..128) */
{
DRESULT res = RES_ERROR;
// 在此寫入自己的代碼,讀取驅動中的扇區
return res;
}
/*--------------------------- 寫入扇區 ---------------------------*/
#if _USE_WRITE == 1
DRESULT mynewdisk_write (const BYTE *buff, /* 需寫入的數據緩存指針 */
DWORD sector, /* 扇區地址 (LBA) */
BYTE count) /* 需寫入的扇區數 (1..128) */
{
DRESULT res = RES_ERROR;
// 在此寫入自己的代碼,向驅動寫入扇區
return res;
}
#endif /* _USE_WRITE == 1 */
/*------------------------ 其它函數 ----------------------*/
#if _USE_IOCTL == 1
DRESULT mynewdisk_ioctl (BYTE cmd, /* 控制代碼 */
void *buff) /* 用于發送 / 接收控制數據的代碼 */
{
DRESULT res = RES_ERROR;
// 在此寫入自己的代碼,控制驅動專用功能 //
CTRL_SYNC、 GET_SECTOR_SIZE、 GET_SECTOR_COUNT、 GET_BLOCK_SIZE //// 如控制同步,獲取扇區大小,獲取扇區數量,獲取塊大小等
return res; } #endif /* _USE_IOCTL == 1 */
底層磁盤 I/O 模塊的頭文件:
/*-------------------------------------------------------------------------*/
/* mynewdisk_diskio.h:底層磁盤 I/O 模塊的頭文件 */
/*-------------------------------------------------------------------------*/
/* 避免遞歸包含的定義 ----------------------------------*/
#ifndef __MYNEWDISK_DISKIO_H #define __MYNEWDISK_DISKIO_H
extern Diskio_drvTypeDef mynewdisk_Driver;
#endif /* __MYNEWDISK_DISKIO_H */
3、FatFs 應用程序
STM32CubeF4 解決方案中提供了許多基于 FatFs 中間件的應用程序。下表顯示了如 何在不同例子中使用 FatFs 中間件組件,這些例子按照復雜度分類,并取決于所使用 的物理驅動接口 (uSD、 RAMDisk、 USBDisk):
STM32CubeF4 解決方案所提供的上述 FatFs 應用程序是一套有兩種模式的固件:
? 獨立模式
? RTOS 模式,使用 FreeRTOS 中間件組件 值得注意的是,當使用或者開發基于意法半導體磁盤 I/O 底層驅動的 FatFs 應用程序時,用戶 必須保證合適的堆棧值。
因此,當使用基于 USB 主機大容量存儲類的 U 盤時,由于對齊的原因,棧的值必須根據大 扇區大小值 _MAX_SS 來增加。
當在 RTOS 模式中開發任何 FatFs 應用程序時,也必須使用基于 CMSIS-OS 包覆層通用 API 的 FreeRTOS 中間件組件對堆數值進行調整。
3.1 HAL 驅動配置
STM32CubeF4解決方案中所提供的FatFs應用程序是一套用于與各種物理磁盤驅動(uSD、 RAM 盤、 USB 盤)相連接的固件。用戶需要某些運行 FatFs 應用程序所必需的 HAL 驅動。 相應的 HAL 驅動可通過 HAL 配置文件 stm32f4xx_hal_conf.h 來使能,解除 HAL 驅動中所使 用的適當模塊的注釋即可。
HAL 配置文件中,各個支持的磁盤驅動之間的主要差異在于與所使用的磁盤驅動相對應的正 確 HAL 驅動的定義。根據各種驅動,以下宏定義必須可用:
? FatFs_uSD:
– #define HAL_SD_MODULE_ENABLED
? FatFs_RAMDisk:
– #define HAL_SDRAM_MODULE_ENABLED 或
– #define HAL_SRAM_MODULE_ENABLED
? FatFs_USBDisk:
– #define HAL_HCD_MODULE_ENABLED
3.2 FatFs 文件系統配置
FatFs 模塊中包含各種配置選項。在這一層級,我們提供信息幫助用戶根據所連接的物理磁盤 驅動選擇正確的選件,滿足用戶需求,達到高性能。
3.2.1 可重入性
可重入性是獨立和 RTOS 模式配置之間的主要差異,這一點可以在 FatFs 配置文件 ffconf.h 中進行設置。 ? 獨立模式中禁用可重入性: – #define _FS_REENTRANT 0 ? RTOS 模式中使能可重入性: – #define _FS_REENTRANT 1
一旦使能后,用戶必須提供依賴于 OS 的同步對象 (#define _SYNC_t osSemaphoreId)
RTOS 模式應用程序的項目需要包含 syscall.c 文件,以提供 OS 依賴函數,可在以下路徑找 到:\Middlewares\Third_Party\FatFs\src\option
3.2.2 長文件名
FatFs 模塊支持長文件名 (LFN)以及 8.3 格式文件名 (SFN)。
請注意,FAT 文件系統上的 LFN 功能是微軟公司的專利。雖然在 FAT32 上不是這樣,但大多 數 FAT32 驅動包含 LFN 功能。 FatFs 可以通過配置選項切換 LFN 功能。當在商業產品上使 能 LFN 功能時,需要根據終目標獲取微軟的許可。當使能 LFN 功能時,可以使用 LFN,這 項功能可以在 FatFs 配置文件 ffconf.h 中設置:FatFs 配置文件 ffconf.h 中 (_USE_LFN > 0)
? 禁用 LFN 功能:
– #define _USE_LFN 0
? 使能 LFN 功能,其中 3 ≥ _USE_LFN > 0:
一旦在 ffconf.h 配置文件中使能之后,應用程序項目需要包含 syscall.c/unicode.c 文件,以提 供內存管理功能,該文件可在以下路徑中找到:\Middlewares\Third_Party\FatFs\src\option
用戶在獨立模式應用或 RTOS 模式應用中均可使能 LFN 功能。
3.3 FatFs 示例應用程序
如果用戶已經連接了自己的磁盤,開發了適當的磁盤 I/O 底層驅動 (mynewdisk_diskio.c/.h), 請參考 第 2.8 章節 : 將自己的磁盤連接至 FatFs,可按照以下方式將其驅動連接至 FatFs 模塊 以及使用邏輯磁盤:
/*-------------------------------------------------------------------------*/
/* main.c:主程序 */
/*-------------------------------------------------------------------------*/
/* 包括 ---------------------------------------------------------------*/
#include "main.h"
/* 私有變量 --------------------------------------- */
FATFS mynewdiskFatFs; /* 用戶邏輯驅動的文件系統對象 */
FIL MyFile; /* 文件對象 */
char mynewdiskPath[4]; /* 用戶邏輯驅動路徑 */
int main(void)
{
uint32_t wbytes; /* 寫入文件的字節計數 */
uint8_t wtext[] = "text to write logical disk"; /* 寫入文件的緩沖 */
if(FATFS_LinkDriver(&mynewdisk_Driver, mynewdiskPath) == 0)
{
if(f_mount(&mynewdiskFatFs, (TCHAR const*)mynewdiskPath, 0) == FR_OK)
{
if(f_open(&MyFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE) == FR_OK)
{
if(f_write(&MyFile, wtext, sizeof(wtext), (void *)&wbytes) == FR_OK);
{
f_close(&MyFile);
}
}
}
}
FATFS_UnLinkDriver(mynewdiskPath);
}
用戶必須包含通用驅動頭文件 ff_gen_drv.h 以及磁盤 I/O 模塊頭文件 mynewdisk_diskio.h
/*-------------------------------------------------------------------------*/
/* main.h:main.c 模塊的頭文件 */
/*-------------------------------------------------------------------------*/
/* 包括 ---------------------------------------------------------------*/
#include "ff_gen_drv.h"
#include "mynewdisk_diskio.h"
詳細應用可參考UM1721手冊