Stm32CubeMx 通過SPIflash做一個U盤

這是一個卑微電子信息學員的開始

學習stm32

寒假開始了,卑微電子信息學員開始了stm32的學習過程。

SPI flash的注意事項

一. 擦除操作

  1. 以W25X16爲例,最小Sector Erase 4KB(4096B),最大擦除全部文件,而做U盤時,每次的傳輸文件寫入的大小爲512B;
  2. 擦除需要時間,函數執行完畢不等於擦除操作完畢,當擦除操作未執行完整就進行其他操作會發生錯誤;

二. 寫入操作

  1. 以W25X16爲例,單次寫入最大256B,當給出的長度超過256B時,會從開頭開始覆蓋先前寫入的內容;
  2. 寫入需要時間,函數執行完畢不等於寫入操作完畢,當擦除操作未執行完整就進行其他操作會發生錯誤;

三.讀數據操作

  1. 以W25X16爲例,讀數據的長度沒有限制,只要你給函數的指針指向的空間有足夠大的空間,就可以完成讀數據操作;
  2. 讀數據在任何時間都可以進行,速度遠大於寫或者擦除的速度,不用擔心發生出錯,是一個比較令人安心的函數;

容易遇到的問題

一.擦除的空間大於寫入的空間

  1. 以W25X16爲例,單次擦除至少4K,而寫入是512B,衆所周知,在進行SPI寫入操作前,要進行寫入操作的地址必須是被擦除過的地址,不然會無法寫入;
  2. 就我個人而言,有兩種思路:方法一.在每次寫入前先讀4KB的內容將其儲存到一個數組中,再進行4KB的擦除,然後將要寫入SPI的內容寫到數組中,在將數組中的內容寫入flash---------------------------------------------------我是分割線------------------------方法二 .在寫入前先讀4KB的內容將其儲存到一個數組中,再進行4KB的擦除,然後將要寫入SPI的內容寫到數組中,不立即將數組中的內容跟新到flash,進行下一次寫入操作,然後判斷第二次寫入的地址(512B)是否在前一次擦除的地址(4KB)內,如果在,將它賦值給數組,反之,將數組的內容更新到flash,再讀4KB,擦除4KB進行循環

二.單次寫入的內容只有256B而U盤單次寫入512B

  1. 以W25X16爲例,單次寫入最大256B,想要寫入更多的內容,之可以進行多次寫入操作,這個比較簡單,不多解釋;

三.擦除操作的地址

  1. 以W25X16爲例,擦除操作(4KB的)需要傳入3BYTE的地址,但其實因爲扇區的地址大小爲4KB,不是任何的地址都可以作爲扇區地址使用,必須是4KB(4096即0x1000)的整數倍;
  2. 給一個簡單計算扇區首地址的簡單是算法:(STORAGE_BLK_SIZ*blk_addr)&0xFFFFF000 其中STORAGE_BLK_SIZ定義爲512,blk_addr爲uint16_t類型的變量,表示當前的扇區號;

四.SPI函數

  1. SPi函數較上一次的函數做了一些改變,在地址的方面可以直接傳輸uint32_t的數據,更加方便計算,在函數的結尾都增加了檢驗該操作是否完成的語句,使該操作真正執行完纔會進入下一個操作;

五.讀操作

  1. 如果選用第一種方案,這個不用注意,該讀什麼讀什麼,但是,如果選用了第二種方案,讀函數需要判斷當前讀的數據是在數組中還是在flash中,會麻煩一點,代碼在最後面;

我用了第二種方案

因爲第一種方案我開始也寫了,但是因爲實在效率低下,開始的時候應爲在Cube中傳輸速度設定的太慢,導致格式化時間過長,格式化失敗;後來提高傳輸速度勉強格式化成功,方法二的效率大約是方法一的8倍,所以我推薦在算法方面比較優秀的程序員選擇第二中算法;
先給出經過改進後的SPIflash函數:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
和上次一樣,有需要源代碼的可以留言(我不知道怎麼放代碼)
然後是對U盤調用的兩個讀寫函數的修改:
在這裏插入圖片描述
在這裏插入圖片描述
讀和寫的地址真的很重要,只要錯一個地址基本上格式化就不會成功,我被其中的一個地址坑了好久,最後調試的時候很久才發現;
最後,這個代碼有一個缺陷就是最後的一個傳輸的數據會儲存在數組中,而不是在flash中,這就會產生掉電數據會損壞的問題,現階段的解決方法是在main函數中一直判斷是否在進行寫入操作,如果發現有一段時間沒有進行寫入操作就將最後的幾個數據寫入flash,但是這樣可能在寫入的時候剛好U盤被拔出或者有新的數據傳入,會發生衝突,希望有大佬可以幫我解答一下這一關問題,或者有更加好的想法,感激不盡;
本文僅供學習使用,希望可以對您的學習有幫助,大家除夕快樂(在除夕寫的)!!

發佈了5 篇原創文章 · 獲贊 1 · 訪問量 2857
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章