用户工具

站点工具


icore4trtt_5
银杏科技有限公司旗下技术文档发布平台
技术支持电话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。

  • 1.2 生成工程后,我们只保留红色方框内的文件,其他的两个文夹可以删除掉。

  • 1.3 复制刚刚生成的src文件夹maic.c文件中的函数SystemClock_Config(void)到board.c。这里内核初始化时要调用该函数进行时钟配置,我们新加入了QSPI的时钟源。

        

二、修改kconfig文件,增加menuconfig菜单配置中QSPI选项。

三、打开menuconfig,使能QSPI。

四、使用scons命令生成MDK5工程,编译、烧录。

启动之后,我们查看设备,可以发现qspi已经做为了个SPI设备添加成功了。             

五、挂载W25Q64

  • 5.1 修改kconfig文件,在menuconfig中添加配置W25Q64的选项。

  • 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 <board.h>
#include <drv_qspi.h>
#include <rtdevice.h>
#include <rthw.h>
#include <finsh.h>

#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 <dfs_fs.h>

#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工程。

  • 5.4 打开menuconfig,使能QSPI。

  • 5.5 再次使用scons命令生成MDK5工程,编译、烧录,我们发现W25Q64已经做为块设备成功挂载上了。

至此,我们成功的添加了QSPI总线驱动,挂载W25Q64。         

六、源代码

源代码可以移步这里下载:

链接:https://pan.baidu.com/s/1fcLU4WaRDlgr0mNYwZj1Yg  提取码:zstq

icore4trtt_5.txt · 最后更改: 2022/04/01 11:09 由 sean