RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动

2024-01-10 05:44

本文主要是介绍RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键词:SFUD,FLASH,W25Q64,W25Q128,STM32F407

说明:RT-Thread 系统 使用 SPI万能驱动 SFUD 驱动 Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动。

提示:SFUD添加后的存储位置

1.打开RT-Thread Setting SPI SFUD

打开 SFUD ,SPI

右键-详细配置

SFUD的配置 放置于如下头文件 rtconfig.h

2.开启board.h/stm32F1xx_hal_config.h中关于SPI的宏定义

STEP 1:第一步打开RT-Thread Setting SPI SFUD 中已经操作实现。

STEP 2:定义与spi总线相关的宏,例如#define BSP_USING_SPI1

STEP 4:修改您的stm32xxxx_hal_config.h文件以支持spi外围设备。 定义与外围设备相关的宏,例如#define HAL_SPI_MODULE_ENABLED

STEP 3:将由stm32cubemx生成的stm32xxxx_hal_msp.c的spi init函数复制到board.c文件的末尾,例如void HAL_SPI_MspInit(SPI_HandleTypeDef * hspi)

如下复制过程,将由stm32cubemx生成的 SPI 驱动部分代码全部复制到 board.c文件的末尾

3.stm32cubemx SPI 驱动生成过程

如何打开 stm32cubemx 建工程的过程就不讲解,直接讲关于SPI的配置过程

根据对应的STM32芯片打开一个工程配置SPI部分

时钟配置

 时钟树配置

SPI接口设置

输出项目设置

代码生成器 设置

生成代码

打开文件夹

SPI.C文件夹内便是生成的关于SPI接口的配置驱动代码

4.编译烧录后 发送命令 list_device 可以看到SPI总线 SPI1 已经注册到系统

5.SPI从设备驱动编写

SPI的总线设备已经注册完毕,接下来需要进行SPI从设备驱动编写,这里直接使用开发板板载的SPI Flash W25Q64进行测试,

新建 w25q_test.c

#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#include "drv_spi.h"
#include "spi_flash_sfud.h"static int rt_hw_spi_flash_init(void)
{__HAL_RCC_GPIOB_CLK_ENABLE();rt_hw_spi_device_attach("spi1", "spi10", GPIOC, GPIO_PIN_0);// spi10 表示挂载在 spi3 总线上的 0 号设备,PC0是片选,这一步就可以将从设备挂在到总线中。if (RT_NULL == rt_sfud_flash_probe("W25Q64", "spi10"))  //注册块设备,这一步可以将外部flash抽象为系统的块设备{return -RT_ERROR;};return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);

        不支持 SFDP 标准的 Flash 已经在 Flash 参数信息表中定义,sfud_flash_def.h 文件有关于 flash 芯片的配置信息,配置中有的型号可以直接定义使用;配置中没有,且不支持SFDP的Flash 可以自己添加。

        注意:上述代码中的 "W25Q64" 与下截图的型号无关,进过测试,将"W25Q64" 改为"W25Q664" 编译烧录后,串口打印的数据任然一样,打印信息是 SFUD 自动探测读出的 Flash 的信息。具体原理不清楚。

编译后烧录,串口会显示 FLASH 的注册信息

SFUD打印了 基本Flash参数表信息

 \ | /
- RT -     Thread Operating System/ | \     4.0.2 build Jul  3 20202006 - 2019 Copyright by rt-thread team
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud.c:862) The flash device manufacturer ID is 0xEF, memory type ID is 0x40, capacity ID is 0x17.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:132) Check SFDP header is OK. The reversion is V1.5, NPN is 0.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:175) Check JEDEC basic flash parameter header is OK. The table id is 0, reversion is V1.5, length is 16, parameter table pointer is 0x000080.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:203) JEDEC basic flash parameter table info:
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:204) MSB-LSB  3    2    1    0
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0001] 0xFF 0xF9 0x20 0xE5
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0002] 0x03 0xFF 0xFF 0xFF
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0003] 0x6B 0x08 0xEB 0x44
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0004] 0xBB 0x42 0x3B 0x08
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0005] 0xFF 0xFF 0xFF 0xFE
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0006] 0x00 0x00 0xFF 0xFF
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0007] 0xEB 0x40 0xFF 0xFF
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0008] 0x52 0x0F 0x20 0x0C
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:207) [0009] 0x00 0x00 0xD8 0x10
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:215) 4 KB Erase is supported throughout the device. Command is 0x20.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:234) Write granularity is 64 bytes or larger.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:245) Target flash status register is non-volatile.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:271) 3-Byte only addressing.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:305) Capacity is 8388608 Bytes.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:312) Flash device supports 4KB block erase. Command is 0x20.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:312) Flash device supports 32KB block erase. Command is 0x52.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud_sfdp.c:312) Flash device supports 64KB block erase. Command is 0xD8.
[SFUD] Find a Winbond flash chip. Size is 8388608 bytes.
[SFUD] (../rt-thread/components/drivers/spi/sfud/src/sfud.c:840) Flash device reset success.
[SFUD] W25Q64 flash device is initialize success.
[SFUD] Probe SPI flash W25Q64 by SPI device spi10 success.
msh >

6.SFUD命令介绍

        通过串口发送 sf 命令,可以查到关于 SFUD 系统的命令,可以通过命令对Flash进行读写、擦除等操作。

msh >sf
Usage:
sf probe [spi_device]           - probe and init SPI flash by given 'spi_device'
sf read addr size               - read 'size' bytes starting at 'addr'
sf write addr data1 ... dataN   - write some bytes 'data' to flash starting at 'addr'
sf erase addr size              - erase 'size' bytes starting at 'addr'
sf status [<volatile> <status>] - read or write '1:volatile|0:non-volatile' 'status'
sf bench                        - full chip benchmark. DANGER: It will erase full chip!
sf probe [spi_device]           - 探测命令:使用如 sf probe spi10 ,就能探测到挂载的spi10设备
sf read addr size               - 读flash:使用如 sf read 00 100 ,表示从地址00开始读100个字节
sf write addr data1 ... dataN   - 写flash:使用如 sf write 17 01 02 03 04 05 06 07 08 09 10 11 ,表示从17地址开始写入后面这些数据
sf erase addr size              - 擦除命令:
sf status [<volatile> <status>] - 查询状态:查询状态寄存器的值- 全芯片基准测试。 危险:它将擦除整个芯片!

7.SFUD 测试程序

#include "user_cfg.h"/*
W25Q128介绍
W25Q128是华邦公司推出的大容量SPI FLASH产品,W25Q128的容量为128M bit,该系列还有W25Q80/16/32/64等。
W25Q128将16M的容量分为256个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。
W25Q128的最小擦除单位为一个扇区,也就是每次必须擦除4K个字节。这样我们需要给W25Q128开辟一个至少4K的缓存区,这样对SRAM要求比较高,要求芯片必须有4K以上SRAM才能很好的操作。
W25Q128的擦写周期多达10W次,具有20年的数据保存期限,支持电压为2.7~3.6V,
W25Q128支持标准的SPI,还支持双输出/四输出的SPI,最大SPI时钟可以到80Mhz(双输出时相当于160Mhz,四输出时相当于320M),更多的W25Q128的介绍,请参考W25Q128的DATASHEET。*//* SPI Flash 驱动 */
static int rt_hw_spi_flash_init(void)
{//__HAL_RCC_GPIOB_CLK_ENABLE();/* 往总线 spi1 上挂载一个 spi10 从设备 */rt_hw_spi_device_attach("spi1", "spi10", GPIOA, GPIO_PIN_4);/*spi10 表示挂载在 spi3 总线上的 0 号设备,PC0是片选,这一步就可以将从设备挂在到总线中。*//* 使用 SFUD 探测 spi10 从设备,并将 spi10 连接的 flash 初始化为块设备,名称 W25Q64DW */if (RT_NULL == rt_sfud_flash_probe("W25Q128JV", "spi10"))  /* 注册块设备,这一步可以将外部flash抽象为系统的块设备*/{return -RT_ERROR;};return RT_EOK;
}
/* 导出到自动初始化 */
INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init);void W25Q_Flash_test(void)
{sfud_err result;uint8_t *read_data;  // 读取到的数据uint8_t *write_data; // 将要写入的数据sfud_flash *sfud_dev = NULL;sfud_dev = rt_sfud_flash_find("spi10"); // 获取 sfud_dev// 或者 sfud_dev = rt_sfud_flash_find_by_dev_name("W25Q128");/*擦除 Flash 数据;flash: Flash 设备对象;addr:起始地址;size:从起始地址开始擦除数据的总大小*/sfud_erase(sfud_dev, 0, 1024);           // 擦除从 0 开始的 4096 字节write_data = rt_malloc(4096);              // 内存申请,函数会从系统堆空间中找到合适大小的内存块,然后把内存块可用地址返回给用户。rt_memset(write_data, 1, 4096);            // 作用是在一段内存块中填充某个给定的值,将  write_data 32 个地址填入1/*往 Flash 写数据:flash:Flash 设备对象;addr:起始地址;size:从起始地址开始写入数据的总大小;data:待写入的数据*/sfud_write(sfud_dev, 0, 4096, write_data); // 将数据 32 字节的 write_data 从 0 开始写入 flashread_data = rt_malloc(4096);rt_memset(read_data, 0, 4096);for (uint16_t var = 0; var < 4096; ++var){rt_kprintf("var = %d ,data = %d \n",var,read_data[var]) ;}/*读取 Flash 数据; flash: Flash 设备对象 ;addr: 起始地址;size:从起始地址开始读取数据的总大小;data:读取到的数据*/sfud_read(sfud_dev, 0, 4096, read_data);   // 读取从 0 开始的 32 字节,存入 read_datafor (uint16_t var = 0; var < 4096; ++var){rt_kprintf("var = %d ,data = %d \n",var,read_data[var]) ;}
}

这篇关于RT-Thread:SPI万能驱动 SFUD 驱动Flash W25Q64,通过 STM32CubeMX 配置 STM32 SPI 驱动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589743

相关文章

如何在Mac上安装并配置JDK环境变量详细步骤

《如何在Mac上安装并配置JDK环境变量详细步骤》:本文主要介绍如何在Mac上安装并配置JDK环境变量详细步骤,包括下载JDK、安装JDK、配置环境变量、验证JDK配置以及可选地设置PowerSh... 目录步骤 1:下载JDK步骤 2:安装JDK步骤 3:配置环境变量1. 编辑~/.zshrc(对于zsh

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

SQL server配置管理器找不到如何打开它

《SQLserver配置管理器找不到如何打开它》最近遇到了SQLserver配置管理器打不开的问题,尝试在开始菜单栏搜SQLServerManager无果,于是将自己找到的方法总结分享给大家,对SQ... 目录方法一:桌面图标进入方法二:运行窗口进入方法三:查找文件路径方法四:检查 SQL Server 安

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

SpringQuartz定时任务核心组件JobDetail与Trigger配置

《SpringQuartz定时任务核心组件JobDetail与Trigger配置》Spring框架与Quartz调度器的集成提供了强大而灵活的定时任务解决方案,本文主要介绍了SpringQuartz定... 目录引言一、Spring Quartz基础架构1.1 核心组件概述1.2 Spring集成优势二、J

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

如何配置Spring Boot中的Jackson序列化

《如何配置SpringBoot中的Jackson序列化》在开发基于SpringBoot的应用程序时,Jackson是默认的JSON序列化和反序列化工具,本文将详细介绍如何在SpringBoot中配置... 目录配置Spring Boot中的Jackson序列化1. 为什么需要自定义Jackson配置?2.

鸿蒙中Axios数据请求的封装和配置方法

《鸿蒙中Axios数据请求的封装和配置方法》:本文主要介绍鸿蒙中Axios数据请求的封装和配置方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.配置权限 应用级权限和系统级权限2.配置网络请求的代码3.下载在Entry中 下载AxIOS4.封装Htt

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col