历史上的今天
返回首页

历史上的今天

今天是:2026年03月14日(星期六)

2023年03月14日 | STM32F0单片机快速入门十: 用 SPI HAL 库读写W25Q128

2023-03-14 来源:zhihu

1.W25Q128 介绍

当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:

  1. 133MHz SPI Clock。

  2. 10万次擦写寿命,20年数据保持时间。

  3. 每颗具有64-Bit唯一序列号 Unique ID。

  4. 每次可以写入 1 到 256 字节数据。

  5. 写之前需要对目的地址所在扇区进行擦除操作。


( Winbond W25Q128 datasheet )

我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:

W25Q128 STM32F030

Pin 1 /CS PA4 也可以用其它 GPIO 引脚

Pin 2 DO PA6 SPI1_MISO

Pin 3 /WP ( VCC )

Pin 4 GND ( GND )

Pin 5 DI PA7 SPI1_MOSI

Pin 6 CLK PA5 SPI1_SCK

Pin 7 /HOLD or /RESET ( VCC )

Pin 8 VCC ( VCC )

2.代码

代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。

对于W25Q128 我们可以从Github上找到驱动代码:

github.com/nimaltd/w25q

GNU General Public License v3.0

我们把它集成进SPI例程里,完成 W25Q128 的读写功能。

Step 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0DriversBSPComponents

Step 2, 我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesSPISPI_FullDuplex_ComPollingMDK-ARMProject.uvprojx

在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group...

新建 Group 并改名称为 DriversBSPComponentsw25qxx-master

Step 3, 在 DriversBSPComponentsw25qxx-master上点右键,选择Add Existing Files to Group "DriversBSPComponentsw25qxx-master"...,

找到 Drivers/BSP/components/w25qxx-master/w25qxx.c 点击Add,然后可以看到w25qxx.c已经添加进项目中:

Step 4, 在 Options for Target 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。

Add include path ../../../../../../Drivers/BSP/components/w25qxx-master

Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:

//#include "spi.h"

#include "stm32f0xx_hal.h"

Step 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数

HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)

里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。

Step 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。

Step 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。

在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。

下面是读出数据时实际抓取的波形:

参考资料:

PM0215 STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

Winbond W25Q128 Datasheet

STM32F030 Datasheet

STM32F030 Reference Manual


推荐阅读

史海拾趣

Corstat Containers公司的发展小趣事

Corstat Containers公司在电子行业中崭露头角,始于一次技术突破。当时,公司研发团队成功开发出一种新型的防静电电子元件包装盒,有效解决了电子产品在运输过程中因静电导致的损坏问题。这一创新产品迅速获得了市场的认可,许多知名电子品牌纷纷与Corstat Containers公司建立合作关系。随着订单量的不断增加,公司的规模逐渐扩大,生产线也更加完善。

Electro-Optical Systems Inc公司的发展小趣事

EOS公司成立于1983年,创始人是一群热衷于红外技术的专家。他们深知红外探测器在军事、科研和工业领域的重要性,于是决定投身于这一领域。初创时期,EOS面临着资金短缺、技术难度大等挑战,但团队成员凭借着对技术的执着和对市场的敏锐洞察,逐步攻克难关,成功研制出第一批红外探测器产品。

Fronter Electronics Co Ltd公司的发展小趣事

Fronter电子成立于1991年,由一群对电子技术充满热情的创业者共同创立。在公司成立初期,Fronter电子专注于电子元件的代理与销售,通过引进国际知名品牌的产品,如SUNLORD、KDS等,迅速在行业内建立了初步的声誉。公司凭借敏锐的市场洞察力和高效的供应链管理,逐步在电子元器件市场中站稳脚跟。

AIRPAX公司的发展小趣事

AIRPAX的故事始于一个对电气保护和传感器技术充满热情的团队。在20世纪初,电气技术的快速发展为各种行业带来了巨大的变革。看到这一机遇,AIRPAX的创始人在美国马萨诸塞州的阿特波罗创立了这家公司,专注于传感器、电气保护器和控制器的设计与制造。最初,AIRPAX的产品主要服务于本地的小规模工业应用,但凭借其卓越的性能和可靠性,很快赢得了市场的认可。

Asian Best Components Co Ltd公司的发展小趣事

在电子行业的快速发展中,Asian Best Components Co Ltd始终坚持环保理念,致力于推动绿色生产。公司积极采用环保材料和工艺,减少生产过程中的废弃物排放和能源消耗。同时,公司还加大了对环保技术的研发投入,推出了一系列环保型电子元件,为行业的可持续发展做出了积极贡献。这种环保理念不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

Hewlett Packard Co公司的发展小趣事
类似地,高音控制电位器(如RP5)用于调节高音成分的衰减量。顺时针旋转电位器通常会增加高音输出,逆时针旋转则会减少。

问答坊 | AI 解惑

linux 下 CY7C68013 的 slavefifo 驱动

linux 下 CY7C68013 的 slavefifo  驱动 在 linux 下 自己编写 68013 驱动 1:在驱动程序调试中发现 写函数 成功执行了,68013 也 收到了数据,但是相应的硬件并不出现 68013 slavefifo 模式下应该出现的结果。 2:但是 68013 slavef ...…

查看全部问答>

如何实现wince多用户?

如题,各用户要有自己的注册表信息和密码等信息!…

查看全部问答>

关于PXA270的AC97采集电压问题

各位:    CPU为PXA270,采集电压芯片为WM9712 ,通过AC-LINK采集电压 一共有两处用到:         1、触摸屏,         2、电池当前电压 问题:     正常情 ...…

查看全部问答>

[求教]使用单片机解决UDP传输问题

小弟使用的是C8051F020芯片 以太网接口芯片是CP2201 由于开发使用芯片自带的库文件 函数和socket有些类似 程序基本实现将从PC收到的数据再次传回去 发送发送一段时间后(10ms或100ms) 单片机将不收数据了 不知道是什么原因?…

查看全部问答>

STM32用串口调试助手收不到数据

STM32可以编译包括运行,但是收不到数据。很郁闷。 公司台式电脑没串口,用的是USB转串口,相当于虚拟串口,串口调试助手,是用COM3口。下述程序可以运行,LED也会闪,但是串口调试助手上就是收不到数据。 请帮忙看看,十分感谢! 附近 ...…

查看全部问答>

请问 2401 能用JTAG 烧写和调试吗???谢谢

             大家好,我按着TI的资料做了一块2401的板子,做出来后不要说用来做调试了,就是连都不能连上.接下来的工作根本无法进行.后来找JTAG的资料来研究,发现EUM0和EUM1是用来作为接收来自仿真器的中断 ...…

查看全部问答>

面板PCB(多图)

直接上图 [ 本帖最后由 lindabell 于 2012-3-25 18:22 编辑 ]…

查看全部问答>

关于320F28035实现并口的问题?<时钟问题续集>

    我用这个28035运行其他的程序能够运行,应该说明系统时钟应该能够支持系统的运行。 但是我现在在做一个28035+TOPWAY 的液晶屏的显示就是显示不出来。    以前我在MSP430F149上已经实现了。这次只是换到DSP28035上就 ...…

查看全部问答>

FRAM在医疗领域完胜其他小伙伴们?大家怎么看

前不久参加医疗电子大会,重点了解了一下现在很热门的一个存储器——FRAM。Speaker认为因为FRAM的以下优势在医疗应用已经取得绝对主导地位: 首先,在医疗领域,FRAM的抗辐射性是一个比较大的优势,因为医院里的特殊环境所致(CT扫描X射线、用于消 ...…

查看全部问答>