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中還加入了對中文文件名的支持,需要修改 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)用來記錄文件所在位置的表格.它對于硬盤的使用是非常重要的,假若丟失文件分配表,那么硬盤上的數(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 //測試向文件寫入字符串 |
| 007 | #define F_READ 1 //測試從文件中讀出數(shù)據(jù) |
| 008 | #define F_UNLINK 0 //測試刪除文件 |
| 009 | #define SCAN_FILES 1 //測試目錄掃描 |
| 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)放大器


評論