1.簡介
SFUD是一款開源的串行 SPI Flash 通用驅動庫。由于現有市面的串行 Flash 種類居多,各個 Flash 的規格及命令存在差異, SFUD 就是為了解決這些 Flash 的差異現狀而設計,讓我們的產品能夠支持不同品牌及規格的 Flash,提高了涉及到 Flash 功能的軟件的可重用性及可擴展性,同時也可以規避 Flash 缺貨或停產給產品所帶來的風險。 主要特點:支持 SPI/QSPI 接口、面向對象(同時支持多個 Flash 對象)、可靈活裁剪、擴展性強、支持 4 字節地址。
2.SFUD移植
2.1硬件接口
這里使用的是STM32F407的單片機,使用SPI1接口與Flash連接,Flash型號為W25Q16JV。電路圖如下:
2.2 添加源碼到工程中
首先下載SFUD的源碼,下載后可以看到,sfud文件夾中有三個子文件夾: Inc—頭文件 Port—接口文件 Src—源碼文件 然后用STM32CubeMx生成一個工程,初始化時鐘、SPI1和一個串口(用于打印信息)。SPI通訊格式如下:
生成工程后,將sfud文件夾復制到工程目錄,添加.c文件到工程中:
添加頭文件的包含路徑:
2.3編寫底層函數
這里使用的是SPI接口,需要自己編寫的只有兩個函數,讀寫和初始化:
static sfud_err spi_write_read(const sfud_spi *spi, const uint8_t *write_buf, size_t write_size, uint8_t *read_buf, size_t read_size)
sfud_err sfud_spi_port_init(sfud_flash *flash)如果使用的是QSPI,則需要編寫下面這個函數:
static sfud_err qspi_read(const struct __sfud_spi *spi, uint32_t addr, sfud_qspi_read_cmd_format *qspi_read_cmd_format, uint8_t *read_buf, size_t read_size)下載的源碼中有個STM32F1xx的工程例程,使用的是標準庫,這里改為HAL庫,具體代碼就不貼了,可在文章開始下載完整工程。 需要注意的是,這里添加了幾個函數:
static void spi_lock(const sfud_spi *spi) { // __disable_irq(); } static void spi_unlock(const sfud_spi *spi) { // __enable_irq(); } static void retry_delay(void) { HAL_Delay(1); }如果retry_delay使用了HAL_Delay做延時,那spi_lock就不能關閉中斷,否則systick無法中斷,HAL_Delay函數會卡死。如果使用純軟件延時就不存在這個問題。 接口文件修改好后,在sfud_cfg.h文件中添加FLASH型號的列表,列表中可以有多個器件型號,也就是說該驅動庫支持同時讀寫多個器件。這里只有一個W25Q16,列表如下:
enum { SFUD_W25Q16_DEVICE_INDEX = 0, }; #define SFUD_FLASH_DEVICE_TABLE { [SFUD_W25Q16_DEVICE_INDEX] = {.name = "W25Q16", .spi.name = "SPI1"}, }最后將測試demo函數復制過來,在main函數中初始化芯片,并調用demo函數:
if (sfud_init() == SFUD_SUCCESS) { sfud_demo(0,sizeof(sfud_demo_test_buf),sfud_demo_test_buf); }在串口調試助手可以看到初始化以及讀寫的一些打印信息:
審核編輯:郭婷
-
FlaSh
+關注
關注
10文章
1640瀏覽量
148320 -
接口
+關注
關注
33文章
8669瀏覽量
151548 -
SPI
+關注
關注
17文章
1717瀏覽量
91857 -
開源
+關注
關注
3文章
3381瀏覽量
42604 -
SFUD
+關注
關注
0文章
5瀏覽量
1073
原文標題:【開源項目】SFUD--通用串口Flash驅動庫的移植和使用
文章出處:【微信號:嵌入式技術開發,微信公眾號:嵌入式技術開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論