stm32 Fatfs 讀寫SD卡
165 |
166 | if(drv) |
167 | { |
168 | returnRES_PARERR;//僅支持單磁盤操作,否則返回參數(shù)錯(cuò)誤 |
169 | } |
170 |
171 | //FATFS目前版本僅需處理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三個(gè)命令 |
172 | switch(ctrl) |
173 | { |
174 | caseCTRL_SYNC: |
175 | SD_CS_ENABLE(); |
176 | if(SD_WaitReady()==0) |
177 | { |
178 | res = RES_OK; |
179 | } |
180 | else |
181 | { |
182 | res = RES_ERROR; |
183 | } |
184 | SD_CS_DISABLE(); |
185 | break; |
186 |
187 | caseGET_BLOCK_SIZE: |
188 | *(WORD*)buff = 512; |
189 | res = RES_OK; |
190 | break; |
191 |
192 | caseGET_SECTOR_COUNT: |
193 | *(DWORD*)buff = SD_GetCapacity(); |
194 | res = RES_OK; |
195 | break; |
196 | default: |
197 | res = RES_PARERR; |
198 | break; |
199 | } |
200 |
201 | returnres; |
202 | } |
203 |
204 | /*-----------------------------------------------------------------------*/ |
205 | /* User defined function to give a current time to fatfs module */ |
206 | /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ |
207 | /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ |
208 | DWORDget_fattime (void) |
209 | { |
210 | return0; |
211 | } |
這里的結(jié)構(gòu)函數(shù)為Fatfs提供和SD卡的通信接口。 在 最新版本的Fatfs中還加入了對(duì)中文文件名的支持,需要修改 ffconf.h
#define _CODE_PAGE 936 //- Simplified Chinese GBK (DBCS, OEM, Windows)
同時(shí)應(yīng)該添加 option/cc936.c文件。但是這個(gè)文件有700多K占相當(dāng)大的ROM, 像stm32F103RBT6這種小FLASH的MCU根本不行 ,加入當(dāng)前工程文件中代碼將增加160KB 左右。
配置好Stm32的串口和SPI等IO口設(shè)置后,就可以使用Fatfs做一些文件操作了。
4. Fatfs 文件操作
文件分配表FAT(File AllocationTable)用來記錄文件所在位置的表格.它對(duì)于硬盤的使用是非常重要的,假若丟失文件分配表,那么硬盤上的數(shù)據(jù)就會(huì)因無法定位而不能使用了。
Fatfs 文件系統(tǒng)減輕了操作SD卡的工作量,調(diào)用其提供的函數(shù)就可以方便的操作文件,讀寫刪改等。
這里提供一個(gè)main.c 示例:
001 | #include "common.h" |
002 | #include |
003 |
004 | FRESULT scan_files (char* path); |
005 |
006 | #define F_PUTS 1 //測(cè)試向文件寫入字符串 |
007 | #define F_READ 1 //測(cè)試從文件中讀出數(shù)據(jù) |
008 | #define F_UNLINK 0 //測(cè)試刪除文件 |
009 | #define SCAN_FILES 1 //測(cè)試目錄掃描 |
010 |
011 | FATFS fs; |
012 | FRESULT res; |
013 | FIL file; |
014 | UINTbr; |
015 | BYTEbuffer[4096];//以上變量作為全局變量 可以避免一些Bug |
016 |
017 | intmain(void) |
018 | { |
019 | u16 i,n; |
020 |
021 |
022 | //stm32 初始化 |
023 | RCC_Configuration(); |
024 | NVIC_Configuration(); |
025 | USART_Configuration(); |
026 | SPI_Configuration(); |
027 | GPIO_Configuration(); |
028 |
029 |
030 | //fatfs 操作 |
031 |
032 | f_mount(0, &fs); |
033 |
034 | //如果data.txt存在,則打開;否則,創(chuàng)建一個(gè)新文件 |
035 | res = f_open(&file,"0:/data.txt",FA_OPEN_ALWAYS|FA_READ|FA_WRITE ); |
036 |
037 | if(res!=FR_OK) |
038 | { |
039 | printf("f_open() fail .. "); |
040 | }else{ |
041 | printf("f_open() success .. "); |
042 | } |
043 |
044 | #if F_READ |
045 |
046 | while(1){//使用f_read讀文件 |
047 | res = f_read(&file, buffer, 1, &br);//一次讀一個(gè)字節(jié)知道讀完全部文件信息 |
048 |
049 | if(res == FR_OK ) |
050 | { |
051 | printf("%s",buffer); |
052 | }else{ |
053 | printf("f_read() fail .. "); |
054 | } |
055 |
056 | if(f_eof(&file)) {break;} |
057 | } |
058 |
059 | /*if( f_gets(buffer,sizeof(buffer),&file) != NULL) //使用f_gets讀文件 ,存在 Bugs 待調(diào)試 |
060 | { |
061 | printf("%s",buffer); |
062 | }else{ |
063 | printf("f_gets() fail .. "); |
064 | } */ |
065 |
066 | #endif |
067 |
068 | #if F_PUTS |
069 |
070 | //將指針指向文件末 |
071 | //res = f_lseek(&file,(&file)->fsize); |
072 | res = f_lseek(&file,file.fsize); |
073 |
074 | n = f_puts("hello dog ..", &file) ;//向文件末寫入字符串 |
075 |
076 | if(n<1)//判斷寫是否成功 |
077 | { |
078 | printf("f_puts() fail .. "); |
079 | }else{ |
080 | printf("f_puts() success .. "); |
081 | } |
082 |
083 | #endif |
084 |
085 | #if F_UNLINK |
086 |
087 | res = f_unlink("test.jpg");//前提SD下存在一個(gè)test.jpg |
088 |
089 | if(res!=FR_OK) |
090 | { |
091 | printf("f_unlink() fail .. "); |
092 | }else{ |
093 | printf("f_unlink() success .. "); |
094 | } |
095 |
096 | #endif |
097 |
098 | #if SCAN_FILES |
099 |
100 | printf("the directory files : "); |
101 | scan_files("/");//掃描根目錄 |
102 |
103 | #endif |
104 |
105 | f_close(&file); |
106 | f_mount(0, NULL); |
107 |
108 | while(1); |
109 | } |
110 |
111 |
112 | FRESULT scan_files ( |
113 | char* path/* Start node to be scanned (also used as work area) */ |
114 | ) |
115 | { |
116 | FRESULT res; |
117 | FILINFO fno; |
118 | DIR dir; |
119 | inti; |
120 | char*fn;/* This function is assuming non-Unicode cfg. */ |
121 | #if _USE_LFN |
122 | staticcharlfn[_MAX_LFN + 1]; |
123 | fno.lfname = lfn; |
124 | fno.lfsize =sizeoflfn; |
125 | #endif |
126 |
127 |
128 | res = f_opendir(&dir, path);/* Open the directory */ |
129 | if(res == FR_OK) { |
130 | i =strlen(path); |
131 | for(;;) { |
132 | res = f_readdir(&dir, &fno);/* Read a directory item */ |
133 | if(res != FR_OK || fno.fname[0] == 0)break;/* Break on error or end of dir */ |
134 | if(fno.fname[0] ==.)continue;/* Ignore dot entry */ |
135 | #if _USE_LFN |
136 | fn = *fno.lfname ? fno.lfname : fno.fname; |
137 | #else |
138 | fn = fno.fname; |
139 | #endif |
140 | if(fno.fattrib & AM_DIR) {/* It is a directory */ |
141 | sprintf(&path[i],"/%s", fn); |
142 | res = scan_files(path); |
143 | if(res != FR_OK)break; |
144 | path[i] = 0; |
145 | }else{/* It is a file. */ |
146 | printf("%s/%s ", path, fn); |
147 | } |
148 | } |
149 | } |
150 |
151 | returnres; |
152 | } |
其中 目錄掃描函數(shù) scan_files( char * path) 參數(shù)格式如下:
關(guān)鍵詞:
stm32Fatfs讀寫SD
相關(guān)推薦
技術(shù)專區(qū)
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機(jī)
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線
- 開關(guān)電源
- 單片機(jī)
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩(wěn)壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機(jī)控制
- 藍(lán)牙
- PLC
- PWM
- 汽車電子
- 轉(zhuǎn)換器
- 電源管理
- 信號(hào)放大器
評(píng)論