STMCU小助手
发布时间:2021-9-17 17:37
|
1.W25Q128 介绍" z8 u5 L6 _6 ?8 Q+ |. h- h' I 当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时我们会用到另外一种类型的存储器,即 Flash。比如具有 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度可以达到 66MB/S。但是由于 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,所以速度会低一些。以下是 W25Q128 的主要特点:- Q. S! {% C% E6 w% k+ f a.133MHz SPI Clock。' ~- f- F ~6 |5 t: `7 K b.10万次擦写寿命,20年数据保持时间。! k9 P/ h f; ]" }8 @ c.每颗具有64-Bit唯一序列号 Unique ID。* w$ r @; C5 x* V d.每次可以写入 1 到 256 字节数据。7 z" E" x+ s; I ]$ H e.写之前需要对目的地址所在扇区进行擦除操作。
( Winbond W25Q128 datasheet ) 我们通过以下连线使 W25Q128 连至 STM32F030 的 SPI1:2 }5 Y4 T8 h3 m1 }2 ^! ` . W+ |- Q" D0 H4 p0 ` W25Q128 STM32F030; w& b. k0 j+ D" u5 X1 E2 D Pin 1 /CS PA4 也可以用其它 GPIO 引脚) i/ X1 e$ r, c Pin 2 DO PA6 SPI1_MISO Pin 3 /WP ( VCC )) C0 y) X$ f" d& J: |, U 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 )% U; A1 Y ^6 ]% A$ } 2.代码 代码的开发如果想提高效率,一个方法就是充分利用前人的成果,而不是自己一再的去造轮子。, V6 g- S* W3 c5 u! [ 对于W25Q128 我们可以从Github上找到驱动代码: https://github.com/nimaltd/w25qxx GNU General Public License v3.09 Z0 z$ p; T7 Z% V9 k; a* V 我们把它集成进SPI例程里,完成 W25Q128 的读写功能。 Step 1,下载后把解压的文件夹 w25qxx-master 放在 STM32Cube_FW_F0_V1.11.0\Drivers\BSP\Components- h. _& T* W9 T* g
Step 2, 我们用 Keil 打开下面这个工程:: N# D2 b' k% Y7 X5 }( m! W STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\SPI\SPI_FullDuplex_ComPolling\MDK-ARM\Project.uvprojx. X! J/ V& C7 Y, Y, e; g 在项目(STM32F030R8-Nucleo)上点鼠标右键,选择Add Group... 新建 Group 并改名称为 Drivers\BSP\Components\w25qxx-master: R+ w: H/ N3 \4 l6 T, n0 r
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 里添加路径,这里使用的是工程所在路径的相对路径,也可以使用绝对路径,但如果工程拷贝到别的地方的时候,此包含路径就需要跟随更改。0 S" W- ~3 \, e$ p( U Add include path ../../../../../../Drivers/BSP/components/w25qxx-master& j+ z1 t+ x- }& C
Step 5, 驱动头文件 w25qxx.h 中原来包含的的 spi.h, 因为我们使用的 Cube 库,头文件需要做如下替换:/ w6 Y- b+ u( l0 k y5 E //#include "spi.h"5 o6 B- q+ O$ _' d5 v) T0 M1 w #include "stm32f0xx_hal.h" Step 6, main.h 里根据实际情况配置引脚,把驱动头文件 #include "w25qxx.h" 包含进来。片选信号 CS 可以由任意一个 GPIO 控制,在函数 HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)+ N$ }; @; ]' K 里把CS引脚配置为GPIO输出就行了,实际的拉低拉高是驱动代码实现的。6 i, z# c$ q4 w1 i. j& `- _( Z5 a
Step 7, 在 main.c 里定义了 SpiHandle 并指向 SPI1, 我们在 w25qxx.c里也要用到这个 Handle,所以通过 extern 来引用一下。
Step 8, 初始化 SPI1,然后调用 w25qxx 驱动的初始化代码 W25qxx_Init( ); 然后就可以用擦除,读写等函数了。: z; D$ p/ Z: C; B) c 2 }) q" G3 @6 e* a: ]
在代码的修改过程中,我们可以再次体会 Cube 库的这种分层结构带来的好处,特别是如何与第三方驱动代码融合。各个模块就像积木一样,我们只需要把它们搭建起来就可以快速的实现我们想要的功能。 下面是读出数据时实际抓取的波形:; a2 u% s5 O- x9 @- {
|
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
小白也能明白的STM32的低功耗与唤醒机制
STM32系统中2种数据掉电保护的方法
分享STM32F051中文参考手册(重制书签版)
AI工具训练营-用ChatGPT解决HID Keyboard实现的问题
STM32固件库分享,超全系列整理
STM32小白入门指南:从基础到OTA实现方案
STM32超详细学习笔记
新手必看!STM32单片机应该怎么学?
如果你解决了这些问题,就可以直接学STM32
微信公众号
手机版