首页 » 通讯 » STM32F0单片机快速入门十:用 SPI HAL 库读写W25Q128_代码_路径

STM32F0单片机快速入门十:用 SPI HAL 库读写W25Q128_代码_路径

雨夜梧桐 2024-11-14 05:24:30 0

扫一扫用手机浏览

文章目录 [+]

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

a. 133MHz SPI Clock。

STM32F0单片机快速入门十:用 SPI HAL 库读写W25Q128_代码_路径 通讯

b. 10万次擦写寿命,20年数据保持韶光。

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

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

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

( 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上找到驱动代码:

https://github.com/nimaltd/w25qxx

GNU General Public License v3.0

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

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

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

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx

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

新建 Group 并改名称为 Drivers\BSP\Components\w25qxx-master

Step 3, 在 Drivers\BSP\Components\w25qxx-master上点右键,选择Add Existing Files to Group "Drivers\BSP\Components\w25qxx-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

标签:

相关文章

海尔P代码,介绍家电巨头的技术创新密码

在科技飞速发展的今天,家电行业竞争愈发激烈。作为家电巨头的海尔,始终坚持以科技创新为驱动力,不断为消费者提供高品质的产品和服务。其...

通讯 2025-01-06 阅读0 评论0

浪漫代码,情人节里的情感密码

在这个充满爱意的节日里,情人节代码成为了情侣间传递情感的独特方式。这些数字、字母和符号组合,如同一个个情感的密码,承载着甜蜜的祝福...

通讯 2025-01-06 阅读0 评论0

海淀建网站,数字化转型的先锋力量

随着互联网技术的飞速发展,数字化转型已经成为我国各行各业的重要发展方向。作为我国科技创新的重要基地,海淀区积极拥抱数字化浪潮,致力...

通讯 2025-01-06 阅读0 评论0

海门区,历史沉淀与现代活力的完美融合

海门区,位于江苏省南通市,拥有悠久的历史和丰富的文化底蕴。自古以来,海门就是我国沿海地区的重要交通枢纽和商贸中心。如今,海门区在传...

通讯 2025-01-06 阅读0 评论0