1.查詢qspi配置過程
文件路徑: /drivers/board.h
#define BSP_USING_QSPI //注釋中詳細描述了qspi配置過程
2.使能rtt qspi驅動
打開 RT-Thread Settings
選擇SPI功能后,右鍵詳細配置:分別勾
3.使能使用 qspi bsp
打開 /drivers/board.h
#define BSP_USING_QSPI
4.初始化qspi硬件
通過 stm32cubemx工具使能qspi硬件,在一下路徑
\Core\Src\stm32f7xx_hal_msp.c中將HAL_QSPI_MspInit拷貝到 /drivers/board.c中
5.打開相應的HAL庫
打開 /drivers/ stm32f7xx_hal_conf.h
使能 #define HAL_QSPI_MODULE_ENABLED
使能 #define HAL_SPI_MODULE_ENABLED
6.編譯驗證
燒錄,在串口終端輸入**>list_device 可以看到spi總線
7.掛載W25qspi設備
#include <rtthread.h> #include <rtdevice.h> #include <board.h> /** * 讀取qspi狀態寄存器2 * @param device : qspi設備 * @return */ char w25qxx_read_status_register2(struct rt_qspi_device *device) { /* 0x35 read status register2 */ char instruction = 0x35, status; rt_qspi_send_then_recv(device, &instruction, 1, &status, 1);//讀取狀態寄存器 return status; } /** * qspi寫使能 * @param device : qspi設備 */ void w25qxx_write_enable(struct rt_qspi_device *device) { /* 0x06 write enable */ char instruction = 0x06; rt_qspi_send(device, &instruction, 1);//發送數據 } /** * 使能qspi模式 * @param device : qspi設備 */ void w25qxx_enter_qspi_mode(struct rt_qspi_device *device) { char status = 0; /* 0x38 enter qspi mode */ char instruction = 0x38; char write_status2_buf[2] = {0}; /* 0x31 write status register2 */ write_status2_buf[0] = 0x31; status = w25qxx_read_status_register2(device);//讀取狀態寄存器2 if (!(status & 0x02))//判讀當前flash通信模式 { status |= 1 << 1; w25qxx_write_enable(device); //w25q寫使能 write_status2_buf[1] = status; //寫狀態寄存器 rt_qspi_send(device, &write_status2_buf, 2);// rt_qspi_send(device, &instruction, 1);//設置qspi模式 rt_kprintf("flash already enter qspi mode\n"); rt_thread_mdelay(10); } } /** *掛在設備到qspi總線上 * @return 掛載狀態 */ static rt_err_t rt_hw_qspi_flash_with_sfud_init(void) { /*W25Q256掛在qspi總線上*/ rt_err_t ret = stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); if (ret != RT_EOK) { rt_kprintf("qspi attach device failed\n"); return -RT_ERROR; } rt_kprintf("qspi attach device success\n"); return RT_EOK; } /*設備自動初始化 */ INIT_DEVICE_EXPORT(rt_hw_qspi_flash_with_sfud_init); static int rt_hw_qspi_block_device_init(void) { /* W25Q256 注冊為快設備*/ if (RT_NULL == rt_sfud_flash_probe("W25Q256", "qspi10")) { rt_kprintf("flash sfud failed\n"); return -RT_ERROR; } rt_kprintf("flash sfud success\n"); return RT_EOK; } /*設備自動初始化 */ INIT_DEVICE_EXPORT(rt_hw_qspi_block_device_init); #define W25Q_SPI_DEVICE_NAME "qspi10" static void qspi_w25q_sample(int argc, char *argv[]) { struct rt_spi_device *qspi_dev_w25q; char name[RT_NAME_MAX]; rt_uint8_t w25x_read_id = 0x90; rt_uint8_t id[5] = {0}; if (argc == 2) { rt_strncpy(name, argv[1], RT_NAME_MAX); } else { rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX); } /* 查找 spi 設備獲取設備句柄 */ qspi_dev_w25q = (struct rt_spi_device *)rt_device_find(name);//根據 SPI 設備名稱查找設備獲取設備句柄 if (!qspi_dev_w25q) { rt_kprintf("qspi sample run failed! can't find %s device!\n", name); } else { /* 方式1:使用 rt_spi_send_then_recv()發送命令讀取ID */ rt_qspi_send_then_recv(qspi_dev_w25q, &w25x_read_id, 1, id, 5);//先發送后接收數據id rt_kprintf("use rt_qspi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]); } } /* 導出到 msh 命令列表中 */ MSH_CMD_EXPORT(qspi_w25q_sample, qspi w25q sample);
8.創建 快設備
9.掛載文件系統
使能 fatfs
打開 RT-Thread Settings
選擇fatfs功能后,右鍵詳細配置:分別勾選
static int mnt_init(void) { dfs_mkfs("elm", "W25Q256");//格式化設備 if(dfs_mount("W25Q256", "/", "elm", 0, 0)==0)//掛載文件 { rt_kprintf("dfs mount success\r\n"); return RT_EOK; }else { rt_kprintf("dfs mount failed\r\n"); return -RT_ERROR; } } /* 組件自動初始化 */ INIT_COMPONENT_EXPORT(mnt_init);
10.編譯驗證
燒錄,在串口終端輸入 ls