轉stm32 檔案系統,外部USB通訊連線

2021-09-02 18:12:18 字數 4346 閱讀 4236

早兩天往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...