W25Q64 Flash存儲器與STM32:硬件與軟件的完美結合案例

摘要

在嵌入式系統中,數據存儲是關鍵組成部分之一。W25Q64 Flash存儲器因其高容量、低功耗和高可靠性,成為STM32微控制器項目中優選的存儲解決方案。本文將展示W25Q64與STM32微控制器集成的案例,包括硬件設計、SPI通信協議實現和軟件編程策略。

1. 引言

隨著技術的發展,對嵌入式系統的數據存儲需求越來越高。W25Q64 Flash存儲器以其卓越的性能,成為滿足這些需求的理想選擇。

2. W25Q64 Flash存儲器特性

W25Q64是一款8Mbit的SPI Flash存儲器,具有以下特性:

  • 高存儲密度。
  • 低功耗操作。
  • 支持快速讀寫操作。

3. 硬件集成設計

硬件集成是實現W25Q64與STM32通信的基礎。以下是推薦的硬件連接方法:

  • 將W25Q64的CSSCKMOSIMISO引腳連接到STM32的相應GPIO引腳。
  • 連接VCC至3.3V,GND至地。

4. SPI通信協議實現

4.1 SPI初始化

SPI初始化是確保SPI通信正常工作的關鍵步驟。

void SPI_Init(void) {SPI_HandleTypeDef SPI_Handle;SPI_Handle.Instance = SPI1;SPI_Handle.Init.Mode = SPI_MODE_MASTER;SPI_Handle.Init.Direction = SPI_DIRECTION_2LINES;SPI_Handle.Init.DataSize = SPI_DATASIZE_8BIT;SPI_Handle.Init.CLKPolarity = SPI_POLARITY_LOW;SPI_Handle.Init.CLKPhase = SPI_PHASE_1EDGE;SPI_Handle.Init.NSS = SPI_NSS_SOFT;SPI_Handle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;SPI_Handle.Init.FirstBit = SPI_FIRSTBIT_MSB;SPI_Handle.Init.TIMode = SPI_TIMODE_DISABLE;SPI_Handle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;SPI_Handle.Init.CRCPolynomial = 10;HAL_SPI_Init(&SPI_Handle);
}
4.2 W25Q64初始化

W25Q64初始化包括發送特定命令以配置設備。

void W25Q64_Init(void) {SPI_Init();// 發送W25Q64初始化命令
}

5. 軟件編程策略

5.1 讀取W25Q64 ID

讀取ID是驗證W25Q64芯片連接是否成功的重要步驟。

uint8_t W25Q64_ReadID(void) {uint8_t id;HAL_SPI_Transmit(&hspi, &W25Q64_CMD_READ_ID, sizeof(W25Q64_CMD_READ_ID), HAL_MAX_DELAY);HAL_SPI_Receive(&hspi, &id, sizeof(id), HAL_MAX_DELAY);return id;
}
5.2 數據讀寫操作

數據的讀寫是W25Q64 Flash存儲器的核心功能。

void W25Q64_WritePage(uint32_t addr, const uint8_t *data, size_t size) {// 發送寫入命令和地址// 發送數據// 等待寫入完成
}void W25Q64_ReadData(uint32_t addr, uint8_t *buffer, size_t size) {// 發送讀取命令和地址// 接收數據
}

6. 完整示例代碼

以下是STM32與W25Q64通信的完整示例代碼。

int main(void) {HAL_Init();W25Q64_Init();uint8_t id = W25Q64_ReadID();printf("W25Q64 ID: %02X\n", id);uint32_t testAddr = 0x000000; // 測試地址uint8_t testData[] = {0xAA, 0xBB, 0xCC, 0xDD}; // 測試數據W25Q64_WritePage(testAddr, testData, sizeof(testData)); // 寫入數據// 延遲一段時間,等待數據寫入完成HAL_Delay(100);uint8_t readData[sizeof(testData)];W25Q64_ReadData(testAddr, readData, sizeof(readData)); // 讀取數據if (memcmp(testData, readData, sizeof(testData)) == 0) {printf("Write and Read Test Passed.\n");} else {printf("Write and Read Test Failed.\n");}while (1) {// 其他應用代碼}
}

7. 結論

本文詳細介紹了W25Q64 Flash存儲器與STM32微控制器的硬件與軟件集成策略。通過硬件設計、SPI通信協議實現和軟件編程策略,本文為讀者提供了一個全面的集成案例。開發者可以根據項目需求和硬件條件,選擇合適的SPI工作模式,實現高效的數據存儲和讀取。

?作者簡介:熱愛科研的嵌入式開發者,修心和技術同步精進

?歡迎關注我的知乎:對error視而不見

代碼獲取、問題探討及文章轉載可私信。

? 愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。

🍎獲取更多嵌入式資料可點擊鏈接進群領取,謝謝支持!👇

點擊領取更多詳細資料

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42766.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42766.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42766.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

記錄在Windows上安裝Docker

在Windows上安裝Docker時,可以選擇使用不同的后端。 其中兩個常見的選擇是:WSL 2(Windows Subsystem for Linux 2)和 Hyper-V 后端。此外,還可以選擇使用Windows容器。 三者的區別了解即可,推薦用WSL 2&…

我們公司落地大模型的路徑、方法和坑

我們公司落地大模型的路徑、方法和坑 李木子 AI大模型實驗室 2024年07月02日 18:35 北京 最近一年,LLM(大型語言模型)已經成熟到可以投入實際應用中了。預計到 2025 年,AI 領域的投資會飆升到 2000 億美元。現在,不只…

Thinking--在應用中添加動態水印,且不可刪除

Thinking系列,旨在利用10分鐘的時間傳達一種可落地的編程思想。 水印是一種用于保護版權和識別內容的技術,通常用于圖像、視頻或文檔中。它可以是文本、圖像或兩者的組合,通常半透明或以某種方式嵌入到內容中,使其不易被移除或篡改…

【Linux】多線程_2

文章目錄 九、多線程2. 線程的控制 未完待續 九、多線程 2. 線程的控制 主線程退出 等同于 進程退出 等同于 所有線程都退出。為了避免主線程退出,但是新線程并沒有執行完自己的任務的問題,主線程同樣要跟進程一樣等待新線程返回。 pthread_join 函數…

【代碼隨想錄_Day28】62. 不同路徑 63. 不同路徑 II

Day28 OK,今日份的打卡!第二十八天 以下是今日份的總結不同路徑不同路徑 II 以下是今日份的總結 62 不同路徑 63 不同路徑 II 今天的題目難度不低,盡量還是寫一些簡潔代碼 ^?_?^ 不同路徑 思路: 1.確定dp數組(dp…

算法學習筆記(8.2)-動態規劃入門進階

目錄 問題判斷: 問題求解步驟: 圖例: 解析: 方法一:暴力搜索 實現代碼如下所示: 解析: 方法二:記憶化搜索 代碼示例: 解析: 方法三:動態規劃 空間…

每日復盤-20240709

今日關注: 20240709 六日漲幅最大: ------1--------300391--------- 長藥控股 五日漲幅最大: ------1--------300391--------- 長藥控股 四日漲幅最大: ------1--------603155--------- 新亞強 三日漲幅最大: ------1--------301300--------- 遠翔新材 二日漲幅最大: ------1-…

基于antdesign封裝一個react的上傳組件

項目中遇到了一個上傳的需求,看了一下已有的代碼很粗糙,而且是直接引用andt的組件,體驗不太好,自己使用FormData對象封裝了一個上傳組件,僅供參考。 代碼如下: /*** FileUploadModal* description - 文件選…

Qt入門(二):Qt的基本組件

目錄 Designer程序面板 1、布局Layout 打破布局 貼合窗口 2、QWidget的屬性 3、Qlabel標簽 顯示圖片 4、QAbstractButton 按鈕類 按鈕組 5、QLineEdit 單行文本輸入框 6、ComboBox 組合框 7、若干與數字相關的組件 Designer程序面板 Qt包含了一個Designer程序 &…

Qt編程技巧總結篇(3)-信號-槽-多線程(二)

文章目錄 Qt編程技巧總結篇(3)-信號-槽-多線程(二)主進程與子線程線程同步實例與應用 小結 Qt編程技巧總結篇(3)-信號-槽-多線程(二) 多線程學習,使用QMutex,…

RTK_ROS_導航(3):點云的壓縮,PointCloud轉scan

目錄 1. 源碼的安裝2. 修改訂閱的話題3. 可視化1. 源碼的安裝 安裝過程如下 mkdir -p point_to_scan_ws/src cd point_to_scan_ws/src git clone https://github.com/BluewhaleRobot/pointcloud_to_laserscan.git cd .. catkin_make source devel/setup.bash2. 修改訂閱的話題 …

2024.07.01校招 實習 內推 面經

綠*泡*泡VX: neituijunsir 交流*裙 ,內推/實習/校招匯總表格 1、校招 | 元戎啟行2025校園招聘正式批正式啟動(內推) 校招 | 元戎啟行2025校園招聘正式批正式啟動(內推) 2、提前批 | 多益網絡2025屆校園…

基于抽象 HandlerInterceptor 快速實現接口鑒權

歡迎關注公眾號:冬瓜白 相關文章: 每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能(限流、權限等) 在[每天學習一點點之 Spring Web MVC 之抽象 HandlerInterceptor 快速實現常用功能&#xff08…

Numpy的廣播機制(用于自動處理不同形狀的數組)

NumPy 廣播是一種強大的機制,允許 NumPy 在執行元素級運算時自動處理不同形狀的數組。廣播的規則使得無需顯式地創建匹配形狀的數組,直接進行運算,大大簡化了代碼并提高了效率。 基本概念 廣播的基本思想是讓較小的數組在需要的維度上進行擴…

【MySQL數據庫之概念性問題】

1、關系型數據庫和非關系型數據庫 關系型數據庫(Relational Database,簡稱RDBMS)和非關系型數據庫(NoSQL Database)是兩種不同的數據庫類型。SQL本身叫做結構化查詢語言1、關系型數據庫:(MySQL…

Django 更新數據 save()方法

1,添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_length200)content models.TextField()pub_date models.DateTimeField(date published)class Book(models.Model):title models.CharFie…

Spring Boot集成grpc快速入門demo

1.什么是GRPC? gRPC 是一個高性能、開源、通用的RPC框架,由Google推出,基于HTTP2協議標準設計開發,默認采用Protocol Buffers數據序列化協議,支持多種開發語言。gRPC提供了一種簡單的方法來精確的定義服務&#xff0c…

UE5.3-基礎藍圖類整理一

常用藍圖類整理: 1、獲取當前關卡名:Get Current LevelName 2、通過關卡名打開關卡:Open Level(by name) 3、碰撞檢測事件:Event ActorBeginOverlap 4、獲取當前player:Get Player Pawn 5、判斷是否相等&#xff1…

深入解析CSS中的!important規則:優先級與最佳實踐

先上實踐,再討論設計 在實際工程中,!important 的使用場景通常出現在需要確保某個樣式規則具有最高優先級,以覆蓋其他可能沖突的樣式規則時。以下是一個具體的例子: 場景描述 假設你正在開發一個網站,該網站使用了多…

JavaScript的數組與函數

數組 <script type"text/javascript">/** 知識點&#xff1a;數組* 理解&#xff1a;一維數組的容器* 概念&#xff1a;* 1.數組中的數據叫做元素* 2.元素都有編號叫做下標/索引* 3.下標從0開始* 注意&#xff1a;* 1.數組作為數據的容器…