早兩天往stm32上移植fatfs檔案系統,花了一些時間;
後面又花了些時間移植stm32的usb功能;
在這個過程中,自己摸索了很多東西,也向群裡的高人請教過,所以希望把這部分東西記錄下,方便自己以後和想尋找這方面知識的人檢視。
下面按照上面的介紹分幾步來介紹移植驅動所做的工作。
其實為了方便移植前輩們在這個上面已經完善了很多很多,我們只需要做比較少的改動就可以應用起來;我們需要修改的檔案是diskio.c這個檔案裡面的幾個標準介面:
dstatus disk_initialize (byte pdrv);
dstatus disk_status (byte pdrv);
dresult disk_read (byte pdrv, byte* buff, dword sector, uint count);
dresult disk_write (byte pdrv, const byte* buff, dword sector, uint count);
dresult disk_ioctl (byte pdrv, byte cmd, void* buff);
dword get_fattime (void);
在diskio.c中定義了幾個磁碟裝置:
#define dev_ram 0 /* example: map ramdisk to physical drive 0 */
#define dev_mmc 1 /* example: map mmc/sd card to physical drive 1 */
#define dev_usb 2 /* example: map usb msd to physical drive 2 */
在對應的幾個操作函式裡面也有這幾個裝置對應的操作,但是我們只用乙個spi-flash所以就只定義乙個:
#define spi_flash 0
定義扇區大小,塊大小,扇區個數
#define flash_sector_size (4*1024)
#define flash_block_size 64
u16 flash_sector_count = 4*1024*1024/(4*1024);
獲取磁碟狀態直接返回成功:
dstatus disk_status (
byte pdrv /* physical drive nmuber to identify the drive */
)return sta_noinit;
}初始化磁碟的函式,主要是把spi-flash初始化:
dstatus disk_initialize (
byte pdrv /* physical drive nmuber to identify the drive */
)return sta_noinit;
}讀取檔案系統驅動介面:讀取單位以sector(扇區)為單位
dresult disk_read (
byte pdrv, /* physical drive nmuber to identify the drive */
byte *buff, /* data buffer to store read data */
dword sector, /* start sector in lba */
uint count /* number of sectors to read */
)return res_ok;
}return res_parerr;
}寫檔案系統驅動介面:寫入也是以sector為單位
dresult disk_write (
byte pdrv, /* physical drive nmuber to identify the drive */
const byte *buff, /* data to be written */
dword sector, /* start sector in lba */
uint count /* number of sectors to write */
)return res_ok;
}return res_parerr;
}檔案系統一些控制命令:主要是獲取一些磁碟的引數
dresult disk_ioctl (
byte pdrv, /* physical drive nmuber (0..) */
byte cmd, /* control code */
void *buff /* buffer to send/receive control data */)}
return res;
}檔案系統時間的介面:
dword get_fattime (void)
到這裡驅動基本上就移植完了,下面要做的就是初始化檔案系統:在ffconf.h檔案中可以配置檔案系統的引數和功能,因為一開始我們的flash是沒有檔案系統的,需要自己格式化一下,所以需要有建立檔案系統的功能:
#define ff_use_mkfs 1//預設是0
/* this option switches f_mkfs() function. (0:disable or 1:enable) */
建立檔案系統:
首先嘗試掛載檔案系統
掛載成功則返回成功,掛載失敗則建立檔案系統
建立失敗則返回失敗,建立成功再一次嘗試掛載
res = f_open(&fil, "0:/hello.txt", fa_read);
if (res == 0)
}return 0;
}測試輸出:
read:0|1 =>>0
read:0|2 =>>01
read:0|3 =>>012
read:0|4 =>>0123
read:0|5 =>>01234
read:0|6 =>>012345
read:0|7 =>>0123456
read:0|8 =>>01234567
read:0|9 =>>012345678
usb功能的移植
這部分驅動用原子哥的實驗」實驗50 usb讀卡器實驗「中的檔案:
拷貝例程中的驅動:usb檔案下到專案中,然後把剛才專案中初始化和測試檔案系統的**注釋掉。
第一步:案例中定義了兩個儲存介質(sd卡和spi-flash),但是我們只需要spi-flash,所以將
#define max_lun 0//原來為1
然後把磁碟操作改為只是對磁碟0有效:
u16 mal_write(u8 lun, u32 memory_offset, u32 *writebuff, u16 transfer_length)
if(sta!=0)return mal_fail;
return mal_ok;
}u16 mal_read(u8 lun, u32 memory_offset, u32 *readbuff, u16 transfer_length)
if(sta!=0)return mal_fail;
return mal_ok;
}u16 mal_getstatus (u8 lun)
}初始化的地方新增spi-flash初始化的操作和u盤資訊初始化:
u16 mal_init(u8 lun)
return status;
}第二步:先將案例中的和本專案中相衝突的**去掉,例如led部分;
實驗案例中的這兩個檔案先不要加入到專案中stm32f10x_it.h、stm32f10x_it.c,因為我自己起的案例中已經有這兩個檔案了,只要將stm32f10x_it.c中的中斷函式和標頭檔案包含內容複製到專案中的stm32f10x_it.c;
還有幾個標頭檔案包含問題就能編譯過。
第三步:開始初始化usb
static void usb_port_set(u8 enable)
}//usb口初始化
static void usbportinit()
當usb-device插入的時候,從裝置需要將usb-d+通過1.5k電阻拉高,讓主機識別到這是乙個高速usb裝置,所以在mass_init()的函式中有
void mass_init()
但是發現格式化的時候只有480kb的大小。
經過很久的查詢資料發現將檔案系統的操作單位改為和usb的mass_block_size大小一樣為512時就能檢測到4mb的u盤。
#define flash_sector_size 512//(4*1024)
有幾點需要注意的是:
FAT32檔案系統轉NTFS檔案系統
ntfs 檔案系統的優點 1 ntfs有更好的安全與訪問速度 注 感覺上如此 2 u盤使用ntfs格式能成功打造多重啟動工具 注 待驗證 3 u盤格式化為ntfs格式,才能夠儲存超過4gb的大檔案 注 地球人都知道 經過一番努力,找到三種行之有效的手術方案 1 傻瓜工具型 借助 惠普u盤格式化ntf...
FAT32檔案系統
windows95 osr2和windows 98開始支援fat32檔案系統,它是對早期dos的fat16檔案系統的增強,由於檔案系統的核心 檔案分配表fat由16位擴充為32位,所以稱為fat32檔案系統。在一邏輯盤 硬碟的一分割槽 超過 512 兆位元組時使用這種格式,會更高效地儲存資料,減少硬...
Linux kernel FAT32檔案系統實現
1.fat表操作 fat檔案系統中,使用fat表標記哪個cluster被占用,哪個沒被占用。在linux核心 中,與fat表操作對應的是fat entry,fatent ops結構和fat cache id快取等。1.1 fat entry fat中的fat entry用於描述fat檔案系統的fat...