AWorksLP對存儲類設(shè)備進行了高度抽象化,為存儲類設(shè)備提供了通用的文件操作接口,應(yīng)用程序可以輕松跨平臺。本文以MR6450平臺為例,介紹AWorksLP基于FatFs的SD卡的基本用法。
??簡介
SD卡(Secure Digital Card)即安全數(shù)字卡。是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,從MMC的基礎(chǔ)上發(fā)展而來。由于它的體積小、數(shù)據(jù)傳輸速度快、可熱拔插等優(yōu)點,被廣泛的運用于便攜式和嵌入式設(shè)備上。 FatFs是一種面向小型嵌入式系統(tǒng)的通用的FAT文件系統(tǒng)。它完全是由ANSIC語言編寫并且完全獨立于底層I/O。
因此它可以很容易的移植到不同且資源有限的微控制器中。
由此可見在嵌入式開發(fā)中對SD卡中的文件進行管理時,F(xiàn)atFs是使用的最多的文件系統(tǒng)。 在AWorksLP中已經(jīng)集成了FatFs文件系統(tǒng),并支持使用該文件系統(tǒng)對SD卡的文件進行管理。
??相關(guān)API
在SD卡例程中,是通過文件接口實現(xiàn)對SD卡中文件進行操作的。在本文中僅介紹用到的文件接口,其他文件接口,請參考SDK中《AWorksLP OS 標準API參考手冊(html)》。
AWorksLP函數(shù)列表:
部分接口參數(shù)屬性表:
??工程編譯
環(huán)境的搭建、Eclipse工程的編譯與配置、開發(fā)板的仿真與調(diào)試、請參考《AWorksLPSDK快速入門(MR6450)——開箱體驗》。
??例程介紹
本文介紹例程在{SDK}demosperipheralsdcard目錄下。
在src目錄下的demo_sdcard_fs.c例程代碼中的第149行到第157行使用了while循環(huán)如代碼1示,在循環(huán)中每隔500ms打開一次SD卡設(shè)備,通過檢查返回值來檢測是否有SD卡插入。如檢測到返回值大于等于0則表明有SD卡插入。需要注意的是打開SD卡的設(shè)備名(“__BLK_NAME”在demo_sdcard_fs.c的第67行中默認被宏定義為“/dev/sdcardB0”)需要與實際檢測到的SD卡設(shè)備名一致。
在AWorksLP中SD卡默認是動態(tài)監(jiān)測,在SD卡插入時會在串口打印設(shè)備信息如圖1示,串口顯示SD卡設(shè)備名為“sdcardA0”,所以我們需要修改“__BLK_NAME”的宏定義為“/dev/sdcardA0”。
64 /* sd卡設(shè)備分區(qū)名,是由sd卡設(shè)備分區(qū)注冊為字符型設(shè)備 65 * sd卡設(shè)備分區(qū)名一般是由SD卡設(shè)備名加上part number 66 */ 67 #define __BLK_NAME "/dev/sdcardB0" 149 do{ 150 fd = aw_open(__BLK_NAME, AW_O_RDWR, 0); 151 if (fd < 0) { 152 ? ? ? ? aw_kprintf("open device failed "); 153 ? ? ? ? aw_mdelay(500); 154 ? ? } 155 }while(fd < 0); 156 157 ? ?aw_close(fd);代碼1SD卡設(shè)備檢測流程
圖1串口打印SD卡設(shè)備名 代碼2中第159行到172行的功能為使用aw_make_fs函數(shù)接口將SD卡格式化為FatFs文件系統(tǒng)。第159行的宏定義默認為#if 0,本次例程為了演示該步驟將宏改為#if 1。需要注意的是格式化會把卡內(nèi)的數(shù)據(jù)清除,在執(zhí)行格式化之前需要確保卡內(nèi)沒有重要數(shù)據(jù)。
159 #if 1 /* 格式化一次即可 */ 160 161 /* 卷名為"awdisk", 卷大小為4k */ 162 struct aw_fs_format_arg fmt = {"awdisk", 1024 * 4, 0}; 163 164 /* 制作文件系統(tǒng) ,將存儲器名為 "/dev/sd0"制作為"vfat"類型的文件系統(tǒng) */ 165 ret = aw_make_fs(__BLK_NAME, "vfat", &fmt); 166 if (ret != AW_OK) { 167 AW_ERRF(("failed: %d ", ret)); 168 return; 169 } 170 AW_INFOF(("make fs OK ")); 171 172 #endif
代碼2SD卡格式化
格式化完成后,代碼3中第174行通過aw_mkdir函數(shù)創(chuàng)建一個名為“/sd”的目錄,以該目錄為SD卡的掛載點。創(chuàng)建目錄的文件模式為文件所有者、用戶組和其他用戶都可以對該目錄進行讀寫。第181行通過aw_mount函數(shù)將SD卡掛載在“/sd”目錄中。需要注意的掛載前需要確保目錄存在,如果將SD卡掛載在不存在的目錄上,掛載會失敗。掛載的文件系統(tǒng)也需要與SD卡格式化的文件系統(tǒng)格式一致,否則掛載同樣會失敗。
173 /* 創(chuàng)建掛載節(jié)點 */ 174 ret = aw_mkdir("/sd", AW_S_IRWXU | AW_S_IRWXG | AW_S_IRWXO); 175 if (ret != AW_OK) { 176 AW_ERRF(("/sd create error: %d! ", ret)); 177 return; 178 } 179 180 /* 文件系統(tǒng)掛載到"/sd"節(jié)點 */ 181 ret = aw_mount("/sd", __BLK_NAME, "vfat", 0, NULL); 182 if (ret != AW_OK) { 183 AW_ERRF(("/sd mount FATFS error: %d! ", ret)); 184 return; 185 } 186 AW_INFOF(("mount OK ")); 187 188 /* SD 卡讀寫測試 */ 189 __fs_file_rw();
代碼3掛載SD卡
最終例程會在第189行調(diào)用__fs_file_rw函數(shù),函數(shù)體如代碼4所示。在該函數(shù)中會在“/sd”目錄下創(chuàng)建一個名為“aworks_sd_test.txt”的測試文件,通過對該文件進行讀寫測試,讀寫完成后對數(shù)據(jù)進行效驗,效驗通過則表明SD卡讀寫測試成功。至此SD卡例程執(zhí)行完畢,整個過程會有串口信息打印如圖2所示。
69 aw_local void __fs_file_rw (void) 70 { 71 int i = 0; 72 int handle; 73 char *p_file_name = "/sd/aworks_sd_test.txt"; 74 uint8_t str_buf[256] = {0}; 75 int len; 76 77 /* 78 * 寫文件測試(包括創(chuàng)建,文件寫操作,關(guān)閉操作) 79 */ 80 /* 創(chuàng)建新文件 */ 81 handle = aw_open(p_file_name, AW_O_RDWR | AW_O_CREAT, 0777); 82 if (handle < 0) { 83 AW_ERRF(("creat file error: %d ", handle)); 84 return; 85 } 86 AW_INFOF(("creat file %s ok ", p_file_name)); 87 88 len = sizeof(str_buf); 89 for (i = 0; i < len; i++) { 90 str_buf[i] = (uint8_t)i; 91 } 92 93 /* 寫文件 */ 94 if (aw_write(handle, str_buf, sizeof(str_buf)) != sizeof(str_buf)) { 95 aw_close(handle); 96 AW_ERRF(("write file error ")); 97 return; 98 } 99 AW_INFOF(("write file %s ok ", p_file_name)); 100 101 /* 關(guān)閉文件 */ 102 aw_close(handle); 103 AW_INFOF(("close file %s ok ", p_file_name)); 104 105 /* 106 * 讀文件測試(包括打開,文件讀操作,關(guān)閉操作) 107 */ 108 /* 打開文件 */ 109 handle = aw_open(p_file_name, AW_O_RDONLY, 0777); 110 if (handle < 0) { 111 AW_ERRF(("open file error: %d ", handle)); 112 return; 113 } 114 AW_INFOF(("open file %s ok ", p_file_name)); 115 116 memset(str_buf, 0, sizeof(str_buf)); 117 118 /* 讀取文件 */ 119 len = sizeof(str_buf); 120 if (aw_read(handle, str_buf, sizeof(str_buf)) != sizeof(str_buf)) { 121 aw_close(handle); 122 AW_ERRF(("read file error! ")); 123 return; 124 } 125 AW_INFOF(("read file %s ok ", p_file_name)); 126 127 /* 檢驗數(shù)據(jù)是否正確 */ 128 for (i = 0; i < len; i++) { 129 if ((uint8_t)i != str_buf[i]) { 130 AW_ERRF(("file data error! ")); 131 aw_close(handle); 132 return; 133 } 134 } 135 136 AW_INFOF(("file %s data check ok ", p_file_name)); 137 }
代碼4__fs_file_rw讀寫測試函數(shù)
圖2SD卡例程執(zhí)行成功的串口信息
??擴展介紹
在上節(jié)中有提到AWorksLP SD卡默認是動態(tài)檢測設(shè)備,即支持熱拔插,這是通過一個檢測引腳實現(xiàn)的。在實際應(yīng)用中,可能出于節(jié)約I/O資源的考慮,需要將檢測引腳復(fù)用為其他功能。在這種情況下可以將SD卡定義為靜態(tài)設(shè)備,這樣檢測引腳就能復(fù)用作其他功能了。
在AWorksLP中SD卡的動態(tài)設(shè)備在圖形化配置界面中沒有SD卡設(shè)備可供使用,只需將對應(yīng)的SDIO控制器選上即可。上文例程中SD卡是通過sdio1設(shè)備來控制的,所以僅需保證sdio1設(shè)備使能即可,如圖3所示。
圖3 動態(tài)設(shè)備下確認控制器被選上
將SD卡設(shè)備以靜態(tài)方式注冊時,則需要進行如下操作:
將pins.dts({board}dtspins.dts)文件中CD引腳配置注釋,修改完成后如代碼5所示;
在board.dts文件中添加SD卡設(shè)備,如代碼5所示。
/* cd-pins = <&pin1 PIN_PD28 (IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) (IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) (IOC_PD28_FUNC_CTL_SDC1_CDN|HPM_PIN_DS(6)|HPM_PIN_PE(_HPM_PIN_PE_ON)|AW_PIN_CFG_PULL_UP) >; */代碼5 注釋引腳
&sdio1 { sdio_mem_card0:sdio_mem_card0 { compatible = "general,sdio_mem_card"; label = "sdcardA"; status = "disabled"; }; };代碼6添加SD卡設(shè)備
完成修改后,重新打開例程編譯圖形化配置界面,即可在Board EPC6450-AWI/Devices/External Memories選項下看到板卡下新增sdcardA設(shè)備如圖4所示,使能該項并保存退出,再次編譯工程并執(zhí)行固件,例程現(xiàn)象與上節(jié)中所描述完全一致。
圖4 選擇SD卡設(shè)備
注意:例程在靜態(tài)SD卡設(shè)備下執(zhí)行需要在固件運行前將SD卡插入。
審核編輯:劉清
-
微控制器
+關(guān)注
關(guān)注
48文章
7953瀏覽量
155079 -
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317606 -
SD卡
+關(guān)注
關(guān)注
2文章
578瀏覽量
65696 -
FatFS文件系統(tǒng)
+關(guān)注
關(guān)注
0文章
12瀏覽量
7749
原文標題:【產(chǎn)品應(yīng)用】AWorksLP例程介紹(MR6450)—— SD卡
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32+SD NAND(貼片SD卡)完成FATFS文件系統(tǒng)移植與測試

cc3200+fatfs+sd卡 文件刪除
stmF103rct6使用fatfs讀SD卡
32的sd卡和FATFS文件系統(tǒng)是什么
關(guān)于SD卡使用FATFS的問題求解
SD卡詳細介紹
基于SD卡的FATFS文件系統(tǒng)的研究與應(yīng)用_崔鵬偉
STM32單片機移植SD卡FATFS文件系統(tǒng)

基于STM32CubeIDE 開發(fā) FATFS + SD卡 + USB 的讀卡器功能

【產(chǎn)品應(yīng)用】AWorksLP例程介紹(MR6450)—— SD卡

stm32 CubeMx 實現(xiàn)SD卡/sd nand FATFS讀寫測試

評論