GD32F4移植SFUD

文章介绍了如何将开源的SFUD通用闪存驱动库移植到项目中,主要包括将源代码添加到工程,添加必要的C文件,修改接口如`sfud_spi_port_init()`以适应特定硬件,如SPI配置和GPIO设置。在操作系统环境下,使用信号量进行资源管理,而在裸机环境下则可以简化处理。此外,文章还提到了SPI读写函数的实现以及对flash设备表的配置和初始化。
摘要由CSDN通过智能技术生成

移植准备
SFUD 是一款通用的flash驱动库,网上很多介绍,这里省略,有兴趣的去搜索。源文件下载 https://github.com/armink/SFUD,开源的,直接移植。
如下是根据所给例程移植的。

1.打开文件夹,直接拷贝sfud文件到工程中:

demo文件夹中是作者给出的几个平台的移植。仔细阅读readme.
在这里插入图片描述

2 工程中添加C文件

将如下三个.c添加到工程中,并包含到include Path中
在这里插入图片描述

3 修改接口,关键地方就是这里了

主要修改sfud_port.c中的sfud_spi_port_init()

sfud_err sfud_spi_port_init(sfud_flash *flash)
{
    sfud_err result = SFUD_SUCCESS;

    if (!strcmp(flash->spi.name, "SPI2")) {
        w25qxx_init();
        spi_lock_init();
        /* 同步 Flash 移植所需的接口及数据 */
        flash->spi.wr = spi_write_read;
        flash->spi.lock = spi_lock;
        flash->spi.unlock = spi_unlock;
        // flash->spi.user_data = &spi2;
        /* about 100 microsecond delay */
        flash->retry.delay = retry_delay_100us;
        /* adout 60 seconds timeout */
        flash->retry.times = 60 * 1000;
    }

    return result;
}

/************************************************************/
其中 w25qxx_init()为flash硬件初始化,包括SPI的配置和GPIO的配置;

/************************************************************/
spi_lock_init();如果使用操作系统,可做如下:
// static SemaphoreHandle_t SfudMutexSemaphore = NULL;
static void spi_lock_init()
{
     SfudMutexSemaphore = xSemaphoreCreateMutex();
     if (SfudMutexSemaphore == NULL) {
         sfud_log_debug("sfud semaphore create faild");
     }
}

//关全局中断还是使用信号量,自行选择
static void spi_lock(const sfud_spi *spi)
{
    // __disable_irq();
    // if (SfudMutexSemaphore != NULL) {
    //     xSemaphoreTake(SfudMutexSemaphore, portMAX_DELAY);
    // }
}
static void spi_unlock(const sfud_spi *spi)
{
    // __enable_irq();
    // if (SfudMutexSemaphore != NULL) {
    //     xSemaphoreGive(SfudMutexSemaphore); // send semaph
    // }
}
若裸机,则直接搞个标志位就行;
或者不使用;直接为空;

/************************************************************/
spi_write_read()可做如下:
/**
 * SPI write data then read data
 */
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 result = SFUD_SUCCESS;

    if (write_size) {
        SFUD_ASSERT(write_buf);
    }
    if (read_size) {
        SFUD_ASSERT(read_buf);
    }

    SPI_25QXX_CS_LOW();

    if (write_size) {
        spi_flash_buffer_write(write_buf, write_size);
    }

    if (read_size) {
        spi_flash_buffer_read(read_buf, read_size);
    }
    SPI_25QXX_CS_HIGH();
    return result;
}

static void spi_flash_buffer_write(const uint8_t *pbuf_write, size_t size_write)
{
    // SPI_25QXX_CS_LOW();
    while (size_write--) {
       w25qxx_wr_byte(*pbuf_write);
        pbuf_write++;
    }
    // SPI_25QXX_CS_HIGH();
}

static void spi_flash_buffer_read(uint8_t *pbuf_read, size_t size_read)
{
    // SPI_25QXX_CS_LOW();
    while (size_read--) {
        *pbuf_read = w25qxx_wr_byte(GD25QXX_DUMMY);
        pbuf_read++;
    }
    // SPI_25QXX_CS_HIGH();
}


//w25qxx_wr_byte()是GD官方库所给例程中的spi_send_byte(),然后自行封装的接口:
uint8_t spi_send_byte(uint32_t spi_periph, uint8_t byte)
{
    uint8_t retry = 0;
    /* loop while data register in not empty */
    while (RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_TBE)) {
        retry++;
        if (retry > SPI_RETRY_TIME) {
            return ERROR;
        }
    }
    /* send byte through the SPI5 peripheral */
    spi_i2s_data_transmit(spi_periph, byte);

    retry = 0;
    /* wait to receive a byte */
    while (RESET == spi_i2s_flag_get(spi_periph, SPI_FLAG_RBNE)) {
        retry++;
        if (retry > SPI_RETRY_TIME) {
            return ERROR;
        }
    }

    /* return the byte read from the SPI bus */
    return(spi_i2s_data_receive(spi_periph));
}
flash->retry.delay和flash->retry.times可要可不要,自行选择;

还有个关键的flash设备表

如何配置及初始化设备,这个armlink大佬写的很详细,仔细阅读。其他部分,网上一堆,自行搜索。

还要注意是否使用QSPI。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值