嵌入式系统应用-拓展-FLASH之操作 SFUD (Serial Flash Universal Driver)之KEIL应用

发布于:2024-05-07 ⋅ 阅读:(24) ⋅ 点赞:(0)

这里已经假设SFUD代码已经移植到工程下面成功了,如果读者对SFUD移植还不了解。可以参考笔者这篇文章:SFUD (Serial Flash Universal Driver)之KEIL移植
这里主要介绍测试和应用

1 硬件设计

这里采用windbond 的W25Q32这款芯片用于SFUD测试。

W25Q32是一款由Winbond(温邦)公司生产的串行闪存器件,具有以下特点和规格:

容量: W25Q32的容量为32 Megabits(Mb),即4 Megabytes(MB)。
接口: 采用串行外围接口(SPI)进行通信,支持快速的串行数据传输。
工作电压: 标准的工作电压范围为2.7V至3.6V,也有一些版本支持低电压工作(1.65V至2.0V)。
速度: 支持不同的时钟速度,例如在单线SPI模式下,最高速度可达到104MHz。
擦除和编程: 支持扇区擦除和页编程操作,有多种擦除模式可选。
保护功能: 支持硬件数据保护功能,可以通过设置保护位来保护特定的存储区域。

W25Q32广泛应用于嵌入式系统中,如智能手机、数字相机、网络设备、工业控制系统等,用于存储固件、配置数据、日志记录等信息。它的高速度、可靠性和丰富的功能使其成为许多嵌入式系统中的理想选择。在这里插入图片描述
主控芯片采用gd32f103系列芯片,远远满足固件移植的需要。

这里待续,今天没有写完

2 驱动准备

2.1 硬件驱动移植

2.2 软件驱动准备

  sfud_err result = SFUD_SUCCESS;
    const sfud_flash *flash = sfud_get_device_table() + 0;
    size_t i;
    /* prepare write data */
    for (i = 0; i < size; i++) {
        data[i] = i;
    }
    /* erase test */
    result = sfud_erase(flash, addr, size);
    if (result == SFUD_SUCCESS) {
        printf("Erase the %s flash data finish. Start from 0x%08X, size is %ld.\r\n", flash->name, addr,
                size);
    } else {
        printf("Erase the %s flash data failed.\r\n", flash->name);
        return;
    }
    /* write test */
    result = sfud_write(flash, addr, size, data);
    if (result == SFUD_SUCCESS) {
        printf("Write the %s flash data finish. Start from 0x%08X, size is %ld.\r\n", flash->name, addr,
                size);
    } else {
        printf("Write the %s flash data failed.\r\n", flash->name);
        return;
    }
    /* read test */
    result = sfud_read(flash, addr, size, data);
    if (result == SFUD_SUCCESS) {
        printf("Read the %s flash data success. Start from 0x%08X, size is %ld. The data is:\r\n", flash->name, addr,
                size);
        printf("Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n");
        for (i = 0; i < size; i++) {
            if (i % 16 == 0) {
                printf("[%08X] ", addr + i);
            }
            printf("%02X ", data[i]);
            if (((i + 1) % 16 == 0) || i == size - 1) {
                printf("\r\n");
            }
        }
        printf("\r\n");
    } else {
        printf("Read the %s flash data failed.\r\n", flash->name);
    }
    /* data check */
    for (i = 0; i < size; i++) {
        if (data[i] != i % 256) {
            printf("Read and check write data has an error. Write the %s flash data failed.\r\n", flash->name);
			break;
        }
    }
    if (i == size) {
        printf("The %s flash test is success.\r\n", flash->name);
    }

3 测试代码