1.w25q128 介绍
当我们有比较多的数据需要掉电存储时,上一篇文章所介绍的 24c02 (256个字节eeprom)就不够了。此时我们会用到另外一种类型的存储器,即 flash。比如具有 spi 接口的 w25q128。这颗小芯片虽然也只有简单的 8 个引脚,但存储容量却达到了128m-bit,也就是 16m 字节,同时它的读写速度可以达到 66mb/s。但是由于 stm32f030 不支持 quad/dual spi,只能以标准 spi 方式读写,所以速度会低一些。以下是 w25q128 的主要特点:
a.133mhz spi clock。
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/w25qxxgnu 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 manualum1785 description of stm32f0 hal and low-layer driverswinbond w25q128 datasheetstm32f030 datasheet
stm32f030 reference manual