STM32F0單片機快速入門十 用 SPI HAL 庫讀寫W25Q128

1.W25Q128 介紹
當咱們有比較多的數據須要掉電存儲時,上一篇文章所介紹的 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 )

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

掃碼關注公衆號:
加入微信交流羣:

本文分享自微信公衆號 - TopSemic嵌入式(TopSemic)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索