| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-02-29 | zh. | 初次建立 | ===== iCore4T_RTT_5_添加QSPI设备驱动 ===== * iCore4T核心板通过QSPI总线挂有一片 8MB FLASH W25Q64可用于运行程序、存放字库、存放图片、做为文件系统的从设备等,那么我们怎么把它用起来呢,今天给大家分享一下QSPI总线驱动的加载过程及W25Q64的挂载过程。 ==== 一、配置QSPI相应的GPIO,选择QSPI的时钟源 ==== * 1.1 我们仍然是借助STM32CubeMx工具来完成外设IO的配置,打开../bsp/stm32/stm32h750-gingko-icore4t/board/CubeMX_Config来配置QSPI的IO,从原理图中可以看到我们用的是QSPI的BANK1,它的IO分别是PB2(CLK)、PB6(NCS)、PD11(IO0)、PD12(IO1)、PD13(IO3)、PF7(IO2)。打开QSPI后,默认给出的IO和我们原理图中的并不相符,这里我们手动修改一下,仍然是只配置IO,选择QSPI的时钟源。配置完成点击CREATE CODE。 {{ :icore4t:iCore4T_RTT_5_1.png?direct |}} {{ :icore4t:iCore4T_RTT_5_2.png?direct |}} * 1.2 生成工程后,我们只保留红色方框内的文件,其他的两个文夹可以删除掉。 {{ :icore4t:iCore4T_RTT_5_3.png?direct |}} * 1.3 复制刚刚生成的src文件夹maic.c文件中的函数SystemClock_Config(void)到board.c。这里内核初始化时要调用该函数进行时钟配置,我们新加入了QSPI的时钟源。          ==== 二、修改kconfig文件,增加menuconfig菜单配置中QSPI选项。 ==== {{ :icore4t:iCore4T_RTT_5_4.png?direct |}} ==== 三、打开menuconfig,使能QSPI。 ==== {{ :icore4t:iCore4T_RTT_5_5.png?direct |}} ==== 四、使用scons命令生成MDK5工程,编译、烧录。 ==== 启动之后,我们查看设备,可以发现qspi已经做为了个SPI设备添加成功了。 {{ :icore4t:iCore4T_RTT_5_6.png?direct |}}             ==== 五、挂载W25Q64 ==== * 5.1 修改kconfig文件,在menuconfig中添加配置W25Q64的选项。 {{ :icore4t:iCore4T_RTT_5_7.png?direct |}} * 5.2 添加w25q64的驱动程序drv_qspi_flash.c文件,并将该文件放在../bsp/stm32/libraries/HAL_Drivers,我把源码贴在下面。 /* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-11-27 zylx first version */ #include #include #include #include #include #ifdef BSP_USING_QSPI_FLASH #include "spi_flash.h" #include "spi_flash_sfud.h" 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; } void w25qxx_write_enable(struct rt_qspi_device *device) { /* 0x06 write enable */ char instruction = 0x06; rt_qspi_send(device, &instruction, 1); } 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); if (!(status & 0x02)) { status |= 1 << 1; w25qxx_write_enable(device); write_status2_buf[1] = status; rt_qspi_send(device, &write_status2_buf, 2); rt_qspi_send(device, &instruction, 1); rt_kprintf("flash already enter qspi mode\n"); rt_thread_mdelay(10); } } static int rt_hw_qspi_flash_with_sfud_init(void) { stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); /* init w25q64 */ if (RT_NULL == rt_sfud_flash_probe("W25Q64", "qspi10")) { return -RT_ERROR; } return RT_EOK; } INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_with_sfud_init); #if defined(RT_USING_DFS_ELMFAT) && !defined(BSP_USING_SDCARD) #include #define BLK_DEV_NAME "W25Q64" int mnt_init(void) { rt_thread_delay(RT_TICK_PER_SECOND); if (dfs_mount(BLK_DEV_NAME, "/", "elm", 0, 0) == 0) { rt_kprintf("file system initialization done!\n"); } else { if(dfs_mkfs("elm", BLK_DEV_NAME) == 0) { if (dfs_mount(BLK_DEV_NAME, "/", "elm", 0, 0) == 0) { rt_kprintf("file system initialization done!\n"); } else { rt_kprintf("file system initialization failed!\n"); } } } return 0; } INIT_ENV_EXPORT(mnt_init); #endif /* defined(RT_USING_DFS_ELMFAT) && !defined(BSP_USING_SDCARD) */ #endif /* BSP_USING_QSPI_FLASH */ * 5.3 添加文件路径,这样生成工程的时候可以自动将该文件加入MDK工程。 {{ :icore4t:iCore4T_RTT_5_8.png?direct |}} * 5.4 打开menuconfig,使能QSPI。 {{ :icore4t:iCore4T_RTT_5_9.png?direct |}} * 5.5 再次使用scons命令生成MDK5工程,编译、烧录,我们发现W25Q64已经做为块设备成功挂载上了。 {{ :icore4t:iCore4T_RTT_5_10.png?direct |}} 至此,我们成功的添加了QSPI总线驱动,挂载W25Q64。          ==== 六、源代码 ==== 源代码可以移步这里下载: 链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq