1. 摘要安全
本篇筆記主要介紹,如何開發穩定可靠,功能齊全的QSPI驅動。微信
2. 準備工做數據結構
1, IAR 8.32.1架構
2, STM32Cube_FW_H7_V1.6.0函數
3. QSPI簡介測試
4. QSPI驅動編碼
在項目的開發中,咱們常常會使用外掛Flash在作一些應用,而STM32H743帶QSPI接口,能夠用來外掛QSPI Flash,在以前的推送中咱們以winbond華邦的W25Q256爲例給你們說明了下QSPI的操做,藉助ST的HAL庫例程能夠快速驗證,不一樣型號的QSPI Flash會有一些參數和命令區別,你們應用時候要注意,例如美光和華邦的有的命令碼就不一樣。ST的驅動裏STM32H743的評估板是以美光的MT25T_QLKT_L_01G爲例。若是你使用不一樣的型號,請注意區分,既然是評估板,那麼就只是給你們參考,在正式的項目中,還須要考慮一些其餘的問題。spa
5. 驅動架構.net
驅動的架構能夠參考STM32Cube_FW_H7中對QSPI Flash驅動架構,也能夠本身作架構,儘可能簡單明瞭,易用且穩定。對具體型號Flash的驅動能夠放在一個文件下創建一個.c和.h. 如咱們以華邦的W25Q系列爲例,3d
還能夠創建一個文本文檔,用來記錄驅動的一些變動,發佈筆記等。
BSP層能夠在BSP文件夾下創建QSPI的驅動,名字能夠參考ST庫,也能夠按照本身的命名規則來定,或者企業的軟件文件命名規則來定。
創建好這些文件後,接下來能夠動手開發了。開發的時候能夠先畫一些圖,除過正常的初始化,去初始化,外,考慮都包含那些功能,那些模式,那些命令,那些安全管理。那些中斷,是否能夠用DMA操做等。還要考慮數據結構類型,配置信息,錯誤碼等。這些必定要結合數據手冊來考慮和分析。
5.1 初始化和去初始化
這部分相對比較簡單,能夠參考例程,市面上的開發板,編碼風格和參差不齊,你們儘可能參考官方的資料和文檔,要考慮檢查返回值,初始化有沒有成功。跟硬件相關的管腳,時鐘等你們根據本身的應用去定,H743我通常跑400M. 官方的大部分例程也都是跑在400M.
5.2 驅動模式
從手冊能夠知道分爲間接模式,狀態輪詢模式,內存映射模式,那麼咱們的驅動就要可以分別支持這三種模式。在stm32h743i_eval_qspi.h裏面定義這些模式和其餘數據類型。這些能夠參考官方的定義
在w25q256.h中定義跟flash相關的數據類型,結構體,宏定義等。如QSPI的操做模式,這裏要明白1-1-1,1-1-2,1-1-4,1-4-4等的含義,由於QSPI包含這四種,指令單線,地址單線/4線,數據單線/兩線/四線,這些在flash的數據手冊指令表裏都會標出,支持那種操做,而咱們在驅動中要綜合考慮這四種。
命令表的定義,這個要注意不一樣型號的FLASH,會稍有區別,即便同一家的不一樣型號的可能也有區別,如華邦256M和1G的指令就有一些個別的不一樣。剛好這兩款我都用過,在這裏給你們提一下。因爲指令比較多,這裏就不一一列舉了,只截取其中一部分,具體指令表的定義能夠參考flash手冊,
可是建議你們在作驅動的時候對全部指令作支持,這樣在用的時候就很方便,而不是用的時候發現少,在去填補。能夠分別作成子函數,例如讀取ID,能夠作一些校驗
不少指令的內容官網的驅動裏都沒有,須要咱們本身去作。
5.3 狀態寄存器讀寫
W25Q系列通常有三個狀態寄存器,用來表示一些狀態,如狀態寄存器1就能夠經過讀取來判斷flash的狀態,有沒有忙,寫使能有沒有打開,以及保護位保護了那些地址,這些都要本身去實現,市面上包括官方的例程驅動裏都沒有,假如你不判斷的話,若是要寫的地址被保護,是寫不進去的,還有可能出現異常,這些均可以經過讀取狀態寄存器1和2來判斷和處理。以及結合WP腳。
這些功能在正式的產品中咱們必定要考慮,不然你的驅動就不穩定,不安全,由於工業現場各類干擾,以及其餘異常狀況。可能你在實驗室跑的好好的代碼,到現場就不行了
5.4 讀寫擦驅動
擦除操做比較耗時,因此若是你是用查詢模式的話,要不斷去查詢狀態,而不能死等,從手冊能夠看除時間量級,擦除正片最大須要1000s,仍是比較耗時,即便最小的擦除單元4k擦除,最壞狀況也須要400ms。用中斷或者DMA方式操做的話不涉及,但DMA的話中斷須要好幾個,有命令,完成,狀態匹配,收發完成等。要熟悉這些大概時間量級。方便參考。基於不一樣模式的驅動咱們在公衆號裏都給你們介紹過。
讀寫驅動,能夠參考官網的例程,可是要加一些改動,如考慮讀寫失敗怎麼辦,超時退出,若是連續兩次仍是失敗,怎麼考慮,咱們通常會考慮嘗試三次,若是第一次失敗就嘗試第二次讀取,第二次失敗,嘗試第三次,這樣能夠大大增強安全性,可能99.99%的狀況下一次就成功,但不排除失敗的可能性。此外還要考慮參數的保護。
5.4.1 擦除
能夠按照擦除單位來綜合寫一個函數
這裏要注意就是W25Q256 和W25Q01J 的一些區別。若有的指令前者支持指令地址四線,然後者不支持。
5.4.2 讀操做
讀操做要考慮是single仍是dual模式,分別出兩個子函數,讀的指令不一樣,時序也不一樣
建議你們一個指令作一個子函數。如0x6C和0xEC的時序和操做模式就不一樣,如0X6c
代碼實現
從時序圖能夠看到指令單線,地址單線,數據4線即 1-1-4模式。0xEC留給你們去聯繫實現。
5.4.3 寫操做
寫操縱也有幾條不一樣的命令
不一樣的時序和方式,能夠寫成不一樣的子函數,咱們以34h爲例子
經過時序圖能夠看到是指令單線,地址單線,數據四線,這樣就能夠實現寫操做了。
5.5 異常
一般咱們還須要去管理和處理一些異常狀況,例以下面的定義,你也能夠按照本身的方式,總之要對異常和錯誤作一些管理。
官方的例子基本上每一個都有返回值,你們能夠去參考,這樣使你的驅動更安全可靠。
5.6 其餘
其餘一些應考慮的問題,你們能夠根據本身的需求和應用在添加,這裏就不在贅述。
6. 測試驗證
開發完後,就能夠寫一個簡答的測試程序,對本身的驅動進行測試,由於我是在freeRTOS系統下用的,因此創建一個QSPI的測試任務,去實現擦,寫,讀,比較的功能和驗證。截取幾張測試圖
7. 參考文檔
序號 |
文獻 |
1 |
STM32H743RM |
2 |
STM32Cube_FW_H7_V1.6.0 |
本文分享自微信公衆號 - 嵌入式程序猿(InterruptISR)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。