STM32H743+CubeMX-QSPI读写外部FLASH(W25Q128JVSQ)
文章目錄
- 一、前言
- 二、硬件電路
- 三、CubeMX
- 3.1、Clock Configuration
- 3.2、QUADSPI Parameter Settings
- 3.3、QSPI GPIO Setting(大坑)
- 3.4、生成代碼
- 四、例程代碼
- 4.1、添加代碼到工程
- 4.2、main.c
- 4.3、DEBUG
相關筆記:
STM32H743+CubeMX-QSPI+DMA讀取外部FLASH(W25Q128JVSQ)
一、前言
這次編寫QSPI底層驅動走了很多彎路,硬件是廣州硬石科技的STM32H743的開發板。這個H743的開發板上使用的是華邦的W25Q128JVSQ外部FLASH,這塊FLASH在QSPI上的編程比較坑,比較坑得原因是需要同時使用SPI模式與QSPI模式,后面會詳細講解。還有一個問題是硬石科技STM32H743所編寫的PDF教程上,STM32CubeMX的配置跟編譯的例程代碼不一致的問題(在QSPI章節),折騰了兩三天總算調通串行讀寫得驅動了,為此記下工程筆記。
最新的測試,W25Q128JVSQ可以使用這個bsp,很神奇。
該例程的BSP的百度云盤地址:
https://pan.baidu.com/s/1Ce64wHaKzovfHYxYXnoYKw 提取碼:u3ez
二、硬件電路
三、CubeMX
3.1、Clock Configuration
3.2、QUADSPI Parameter Settings
- Clock Prescaler = 3 - 1 :設置時鐘速度,QSPI clock = 240MHz / (ClockPrescaler+1) = 80M(不能大于芯片的最大頻率),從華邦W25Q128FV的datasheet第85頁看到,芯片的最大頻率是104Mz,但是讀取數據的最大頻率是50Mhz。
- Fifo Threshold = 32 : M7架構的QSPI設計了大小為32的FIFO,都用上。
- Sample Shifting = Sample Shifting Half Cycle :摘自《STM32H7x3編程參考手冊》。
- Flash Size = 23 + 1 : W25Q128的內存大小是16M。(FLASH大小需要擴大一倍,否則內存映射方位最后1個地址時,會異常。)
- Chip Select High Time = 2 :W25Qx都是選2
- Clock Mode = Low : 從datasheet看到,W25Q128FV在CLK上都支持Mode0(LOW)與Mode3(HIGH),所以Clock Mode可以選Low也可以選HIGH,我都測試過。
- Chip Select High Time = 2 :W25Qx都是選2
- Dual Flash = Disable :只有一個FLASH
3.3、QSPI GPIO Setting(大坑)
剛開始調QSPI時,代碼與STM32Cube的配置核對了很多遍都沒有發生問題,但最簡單的通過QSPI方式獲取FALSH的ID卻失敗了。排查了半天,最終發現將GPIO的速度改為Very High后就能正常讀取FLASH ID。事后想了想,QSPI的通訊速度是100M以上,GPIO的輸出速度肯定不能選LOW(低速)。
這里吐槽一下硬石科技的H743教程,在STM32CubuMX的配置里,還是選擇Low。但是實際的代碼卻是用Very High初始化QSPI。
3.4、生成代碼
四、例程代碼
移植例程代碼時,需要先確認現有的工程是否已經具備“重定向printf"的功能,因為bsp.h與bsp.c需要使用到printf。bsp_qspi_w25q128.h與bsp_qspi_w25q128.c又需要調用bsp.h。
云盤里有4個bsp文件,分別是:
4.1、添加代碼到工程
4.2、main.c
程序的流程如下:
第一步:通過函數QSPI_W25Qx_ReadID讀取外部FLASH的ID號碼,保存在變量test_Flash_ID里。(后面通過DEBUG模式看看變量test_Flash_ID里存了什么。)
第二步:擦除外部FLASH的第一個扇區的數據。(擦除后,里面變成全是0xFF。)
第三步:讀取外部FLASH的第一個扇區的8個數據,放到數組test_Read_Buf里。(看看在第一個扇區的位置前面8個數據是不是都是0xFF。)
第四步:往外部FLASH的第一個扇區寫入數組test_buf里的8個數據。(用于后續確認是不是真的把數據寫進去了。)
第五步:再讀取外部FLASH的第一個扇區的8個數據,繼續放到數組test_Read_Buf里。(看看往外部FLASH里寫數組是否真的成功了。)
到這里,通過QSPI串行讀寫外部FLASH的所有功能準備完畢。
4.3、DEBUG
經過第一步后,變量test_Flash_ID的值為0xef4018,這個就是W25Q128FV的制造商ID。表示讀取FLASH ID成功。
經過第二步與第三步之后,從外部FLASH讀到全是0xFF,證明外部FLASH擦除成功。
運行完所有測試代碼后,數組test_Read_Buf等于數組test_buf。表示寫入FLASH再讀取FLASH成功!
總結
以上是生活随笔為你收集整理的STM32H743+CubeMX-QSPI读写外部FLASH(W25Q128JVSQ)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 线程状态_【19期】为什么Ja
- 下一篇: 哪个学校既教计算机教英语翻译,教学计算机