当咱们有比较多的数据须要掉电存储时,上一篇文章所介绍的 24C02 (256个字节EEPROM)就不够了。此时咱们会用到另一种类型的存储器,即 Flash。好比具备 SPI 接口的 W25Q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128M-bit,也就是 16M 字节,同时它的读写速度能够达到 66MB/S。可是因为 STM32F030 不支持 Quad/Dual SPI,只能以标准 SPI 方式读写,因此速度会低一些。如下是 W25Q128 的主要特色:
a.133MHz SPI Clock。git
b.10万次擦写寿命,20年数据保持时间。github
c.每颗具备64-Bit惟一序列号 Unique ID。微信
d.每次能够写入 1 到 256 字节数据。app
e.写以前须要对目的地址所在扇区进行擦除操做。函数
( Winbond W25Q128 datasheet )
咱们经过如下连线使 W25Q128 连至 STM32F030 的 SPI1:spa
W25Q128 STM32F030.net
Pin 1 /CS PA4 也能够用其它 GPIO 引脚component
Pin 2 DO PA6 SPI1_MISOorm
Pin 3 /WP ( VCC )blog
Pin 4 GND ( GND )
Pin 5 DI PA7 SPI1_MOSI
Pin 6 CLK PA5 SPI1_SCK
Pin 7 /HOLD or /RESET ( VCC )
代码的开发若是想提升效率,一个方法就是充分利用前人的成果,而不是本身一再的去造轮子。
对于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 "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 Reference Manual
