[10min速通]STM32CubemMX配置W25Q128

news2024/11/17 19:52:09

[10min速通]🦏STM32CubemMX配置W25Q128

文章目录

  • [10min速通]🦏STM32CubemMX配置W25Q128
  • 1、下载源码
  • 2、配置Cube
    • 2.1 基础配置
    • 2.2 SPI配置
  • 3、配置MDK
    • 3.1 添加源文件
    • 3.2 管理源文件
    • 3.3 完成接口配置
  • 4、接口介绍
    • 4.1 初始化
    • 4.2 擦除
    • 4.3 写入
    • 4.4 读取
  • 5、代码示例
  • 6、其他
    • 6.1 芯片擦除
    • 6.2 没有掉电功能
    • 6.3 这个开源代码适用其他w25qxx型号
    • 6.4 FatFs
  • 配套例程和源码

1、下载源码

下载github开源驱动代码。

GitHub - nimaltd/w25qxx: w25qxx SPI FLASH driver for stm32 HAL

此处声明此工程不是本人所作。
这个工程的作者在Readme中提供的视频教程配置非常详细了,会魔法的同学可以直接去看视频进行配置,不用看此文。

如果访问不了github,可以直接下载文末的资料,打包好了。

2、配置Cube

2.1 基础配置

内容包含,时钟树、串口、SW下载接口等基础配置。此处不再赘述。

2.2 SPI配置

SW25Q128支持三种SPI通信模式:标准SPI,Dual SPI,Quad SPI。速度依次增加,每种模式所用到的通信时序也不一样,目前使用的是标准SPI。

SPI工作模式选择模式0或者3。写入时钟最大133M,读取时钟最大50M,这里我们把时钟控制在50M以内。

Untitled

下面是依据硬件电路配置接口。以下是我的接口:

Untitled

Untitled

特别注意的是CS引脚,因为配置SPI的时候,没有选择硬件NSS引荐,因此我们这里单独把PB14设置为CS引脚。

3、配置MDK

3.1 添加源文件

github上下载下来的文件如下:

Untitled

w25qxx就是我们需要加入到MDK里的驱动文件。

我们把w25qxx.c加入到…/Core/Src文件夹下。把w25qxx.h和w25qxxConf.h加入到…/Core/Inc文件夹。

3.2 管理源文件

接下来把文件导入到工程中。

6Q31MO(4%`KLZK0.png

如果找不到.h文件,需要设置下面的文件类型为All file

Untitled

最终的文件结构如下:

Untitled

3.3 完成接口配置

作者已经将所有的顶层配置集中在了w25qxxConf.h中,我们只需要更改其中的接口就可以完成基础的配置。

Untitled

下面用代码注释的方式,讲解下如何配置:

#ifndef _W25QXXCONFIG_H
#define _W25QXXCONFIG_H

#define _W25QXX_SPI                   hspi1         //使用到的是spi几
#define _W25QXX_CS_GPIO               GPIOB         //CS引脚的端口
#define _W25QXX_CS_PIN                GPIO_PIN_14   //CS引脚的引脚号
#define _W25QXX_USE_FREERTOS          0             //是否使用到了FreeRTOS,0为不使用。如果用到了其他RTOS,需要改动他的源码
#define _W25QXX_DEBUG                 0             //是否开启DEBUG模式,开启的话,需要提前配置好printf函数,工程运行时,会打印出运行过程。

#endif

此处我们用到的是spi1,CS引脚是PB14,关闭了RTOS跟DEBUG调试功能。

4、接口介绍

作者写的代码并没有提供多少注释,不过变量的命名已经可以做到见名知意。我通读了W25Qxx.c后,给大家介绍下常用的几个函数功能。

4.1 初始化

bool W25qxx_Init(void);
/*
函数功能:初始化芯片。成功就返回1,失败返回0。
*/

4.2 擦除

void W25qxx_EraseChip(void);
void W25qxx_EraseSector(uint32_t SectorAddr);
void W25qxx_EraseBlock(uint32_t BlockAddr);

上面三种擦除分别是:芯片全部擦除,擦除值定扇区,擦除值定块。SectorAddr是指扇区的编号,BlockAddr是指块的编号,编号不是地址。不太明白这句话可以接着往下看。

W25Q128有256个块(block),每个块由16个扇区(Sector)构成。一个块有64KB存储空间,一个扇区有4KB。下图是W25Q64的示意图,W25Q128内部也是这样的,就是block多一点。

image-20230817171513323

我们想擦除第3个块,只需要:

W25qxx_EraseBlock(2);

如果我们想要擦除第2个块中的第3个扇区。只需要:

W25qxx_EraseSector(15+3);

解释以下,15是因为第一个块中包含了0-15,总共16个扇区,编号16对应着第二个块中的第1个扇区,那么18就对应着第2个块中的第3个扇区。

4.3 写入

void W25qxx_WritePage(uint8_t *pBuffer, uint32_t Page_Address, uint32_t OffsetInByte, uint32_t NumByteToWrite_up_to_PageSize);
void W25qxx_WriteSector(uint8_t *pBuffer, uint32_t Sector_Address, uint32_t OffsetInByte, uint32_t NumByteToWrite_up_to_SectorSize);
void W25qxx_WriteBlock(uint8_t *pBuffer, uint32_t Block_Address, uint32_t OffsetInByte, uint32_t NumByteToWrite_up_to_BlockSize);

下面以W25qxx_WriteSector 为例讲解。

参数含义
pBuffer待写入的数据组指针
Sector_Address想要写入的扇区编号
OffsetInByte写入地址的字节偏置
NumByteToWrite_up_to_SectorSize想要写入的字节数

如果我想要写入第19个扇区的第二个字节位置,写入一个两字节的变量。那么代码是:

uint8_t WriteBuff[]={0x11,0x22};
...
W25qxx_WriteSector(WriteBuff, 18, 1,2);

4.4 读取

void W25qxx_ReadPage(uint8_t *pBuffer, uint32_t Page_Address, uint32_t OffsetInByte, uint32_t NumByteToRead_up_to_PageSize);
void W25qxx_ReadSector(uint8_t *pBuffer, uint32_t Sector_Address, uint32_t OffsetInByte, uint32_t NumByteToRead_up_to_SectorSize);
void W25qxx_ReadBlock(uint8_t *pBuffer, uint32_t Block_Address, uint32_t OffsetInByte, uint32_t NumByteToRead_up_to_BlockSize);

下面以W25qxx_ReadSector为例讲解。

参数含义
pBuffer待读取的数据组指针
Sector_Address想要读取的扇区编号
OffsetInByte读取地址的字节偏置
NumByteToWrite_up_to_SectorSize想要读取的字节数

如果我想要写入第19个扇区的第二个字节位置,写入一个两字节的变量。那么代码是:

uint8_t ReadBuff[2];
...
W25qxx_ReadSector(ReadBuff, 18, 1,2);

5、代码示例

首先要包含头文件

#include "w25qxx.h"

再定义读写变量:

uint8_t WriteBuff[] = {0x11, 0x22};
uint8_t ReadBuff[2];

最后编写服务代码

W25qxx_Init();                           // 初始化Flash芯片
W25qxx_EraseChip();                      // 擦除整个芯片
W25qxx_WriteSector(WriteBuff, 18, 1, 2); // 写入两字节数据
W25qxx_ReadSector(ReadBuff, 18, 1, 2);   // 读取两字节数据
printf("read data is 0x%x, 0x%x\n", ReadBuff[0], ReadBuff[1]);

6、其他

6.1 芯片擦除

由于FLASH存储器的特性决定了它只能把原来为“1”的数据位改写成“0”,而原来为“0”的数据位不能直接改写为“1”。 所以这里涉及到数据“擦除”的概念,在写入前,必须要对目标存储矩阵进行擦除操作,把矩阵中的数据位擦除为“1”, 在数据写入的时候,如果要存储数据“1”,那就不修改存储矩阵,在要存储数据“0”时,才更改该位。

作为测试,我们更改示例代码的内容,,读取一个擦除后,没有被编程的地址:

W25qxx_Init();                           // 初始化Flash芯片
W25qxx_EraseChip();                      // 擦除整个芯片
W25qxx_WriteSector(WriteBuff, 18, 1, 2); // 写入两字节数据
W25qxx_ReadSector(ReadBuff, 18, 0, 2);   // 读取两字节数据
printf("read data is 0x%x, 0x%x\n", ReadBuff[0], ReadBuff[1]);

会发现,打印的结果是

0xff, 0x11

0xff的出现正是擦除后,每一位都变成了1。

6.2 没有掉电功能

这个开源代码包含了常用的功能,但是没有power down等不常用的功能。

6.3 这个开源代码适用其他w25qxx型号

6.4 FatFs

用flash存储少量信息没有问题,如果存储大量信息,可以考虑上文件系统,可以关注我的文章。

配套例程和源码

配套资源,0积分下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/889951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AntDB数据库受邀参加【ACDU 中国行】,共促行业发展和创新

作为数据的集中存储和管理系统,数据库在现代信息化时代扮演着至关重要的角色,随着人工智能,物联网和大数据时代的到来,数据库的发展需要进一步拓展其广度和深度,持续创新,实现技术进步,以更好地…

香港服务器备案会通过吗?

​  对于企业或个人来说,合规备案是网络运营的基本要求,也是保护自身权益的重要举措。以下内容围绕备案展开话题,希望为您解开疑惑。 香港服务器备案会通过吗? 目前,香港服务器无法备案,这是由于国内管理规定的限制…

Salient主题 - 创意多用途和WooCommerce商城主题

Salient主题是下一代WordPress主题,给任何人带来专业的设计结果,而不需要任何编码。Salient 提供永久更新的专业剖面模板库,目前有超过425个可供选择 – 所有这些都充满热情并坚持高标准的审美质量。 网址: Salient主题 - 创意多用途和WooCo…

Linux下安装nodejs

1、下载nodejs 点击前往:Download | Node.js 2、解压 tar -xvf node-v18.16.0-linux-x64.tar.xz mv node-v18.16.0-linux-x64/ /usr/local/nodejs 3、 建立软链接 此时的bin文件夹中已经存在node以及npm,如果你进入到对应文件的中执行命令行一点问题…

vue3 路由缓存问题

目录 解决问题的思路: 解决问题的方案: 1、给roter-view添加key(破坏复用机制,强制销毁重建) 2、使用beforeRouteUpdate导航钩子 3、使用watch监听路由 vue3路由缓存:当用户从/users/johnny导航到/use…

估算森林蓄积量哨兵2号变量计算详情

哨兵2号估算森林蓄积量变量计算详细步骤 变量概括哨兵2号变量计算详情1. 生物物理变量计算2. 植被指数3. 纹理特征 变量概括 需要计算的变量参数有: 生物物理变量 采用SNAP软件的工具生成5个生物物理变量。植被指数 采用gdal库计算,共17个植被指数变量…

「爱校对」——如何让每一篇公文都完美无瑕

在繁忙的办公环境中,公文是企业沟通的桥梁和载体,每一篇公文都关乎公司的形象和效率。但是,即使是最细心的员工,也难免会在公文中出现笔误或格式错误。这时,「爱校对」就显得尤为重要。 1.什么是「爱校对」&#xff1f…

Hyper-v导致Vmware window无法启动崩溃记录

最近有几次vmware启动window10直接崩溃情况,显示蓝屏报错。一开始没在意,以为是因为固态硬盘错了几个字节导致的? 但后来想想不对啊。vmware用了也有10来年了,稳得一笔,在仔细思考了一下后发现打不开的win10这三个虚拟…

springboot自定义banner的输出与源码解析

文章目录 一、介绍二、演示环境三、自定义banner1. 文本2. 图片3. placeholder占位符4. 关闭banner 四、源码分析1. 关闭banner2. banner模式3. banner打印器4. 打印banner① 获取banner② 打印banner 5. 版本号占位符的解析器6. 文本格式占位符的解析器7. 应用标题占位符的解析…

windows下, artemis学习

1. download artemis from apache ActiveMQhttps://activemq.apache.org/components/artemis/download/2. 解压缩到 C:/software/apache-artemis-2.30.0/ 2. 进入到cmd, 执行 C:\software\apache-artemis-2.30.0\bin>artemis create C:/software/apache-artem…

C语言实现将字典dict.txt上传到数据库中

代码 #include <stdio.h> #include <string.h> #include <unistd.h> #include <sqlite3.h>int do_insert(sqlite3 *db,char *word,char *mean);int main(int argc, const char *argv[]) {//以读的方式打开文件FILE* fpfopen("./dict.txt",&…

Android Studio run app 设置 release 模式

背景 为验证我们的 SDK 集成在客户应用上的质量&#xff0c;需要我们的测试环境尽量的与客户应用保持一致。客户普遍都会打 release 包并混淆&#xff0c;然后进行上线应用&#xff0c;因此我们在测试过程中也需要使用 release 包进行验证。对于 Android Studio 运行项目&…

基于web的旅游管理系统/旅游网站的设计与实现

摘要 随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;在线旅游给景区商家的业务带来了更大的发展机遇。 在经济快速发展的带动下&#xff…

这6个免费设计素材网站,设计师都在用,马住

新手设计师不知道去哪里找素材&#xff0c;那就看看这几个设计师都在用的网站吧&#xff0c;免费、付费、商用素材都有&#xff0c;可根据需求选择&#xff0c;赶紧收藏~ 菜鸟图库 https://www.sucai999.com/?vNTYxMjky 菜鸟图库是一个非常大的素材库&#xff0c;站内包含设…

如何做好意大利语翻译,北京翻译哪里比较专业?

意大利语被誉为世界上最美的语言之一&#xff0c;在国内应用广泛&#xff0c;市场对意大利语翻译的需求量也很大。那么&#xff0c;如何做好意大利语翻译&#xff0c;北京翻译哪里比较专业&#xff1f; 业内人士指出&#xff0c;要想做好意大利语翻译&#xff0c;首先要充分理解…

【C语言】动态通讯录 -- 详解

⚪前言 前面详细介绍了静态版通讯录【C语言】静态通讯录 -- 详解_炫酷的伊莉娜的博客-CSDN博客&#xff0c;但是静态版通讯录的空间是无法被改变的&#xff0c;而且空间利用率也不高。为了解决静态通讯录这一缺点&#xff0c;这时就要有一个能够随着存入联系人数量的增加而增大…

Maven之tomcat7-maven-plugin 版本低的问题

tomcat7-maven-plugin 版本『低』的问题 相较于当前最新版的 tomcat 10 而言&#xff0c;tomcat7-maven-plugin 确实看起来很显老旧。但是&#xff0c;这个问题并不是问题&#xff0c;至少不是大问题。 原因 1&#xff1a;tomcat7-maven-plugin 仅用于我们&#xff08;程序员&…

为什么企业需要内部威胁检测软件?

在数字时代&#xff0c;企业不仅需要抵御外部威胁&#xff0c;还必须密切关注内部威胁&#xff0c;因为内部因素可能对数据安全造成严重威胁。作为一款强大的内部威胁监测工具&#xff0c;ADAudit Plus 在这一领域发挥着关键作用。本文将深入探讨 ADAudit Plus 在内部威胁监测中…

AUTOSAR NvM Block的三种类型

Native NVRAM block Native block是最基础的NvM Block&#xff0c;可以用来存储一个数据&#xff0c;可以配置长度、CRC等。 Redundant NVRAM block Redundant block就是在Native block的基础上再加一个冗余块&#xff0c;当Native block失效&#xff08;读取失败或CRC校验失…

如何使用PHP开发网页定时刷新功能

如何使用PHP开发网页定时刷新功能 随着互联网的发展&#xff0c;越来越多的网站需要实时更新显示数据。而实时刷新页面是一种常见的需求&#xff0c;它可以让用户在不刷新整个页面的情况下获得最新的数据。本文将介绍如何使用PHP开发网页定时刷新功能&#xff0c;并提供代码示…