關于STM32片上Flash讀寫操作,之前很多朋友遇到過坑,也問過很多相關的問題,這里再簡單總結一下。
1寫在前面
STM32片上Flash除了存儲我們的代碼,多余的空間還可以供我自己編程(讀寫)。比如,存儲標志位、字庫等。
如果對片上Flash讀寫操作不當,將會導致不可挽回的結局。比如:修改了應用程序代碼導致程序跑飛,非對其操作導致異常中斷等。
因此,我們對片上Flash讀寫操作時,一定要避免一些錯誤的做法。下面將講述一些關于STM32片上Flash的知識,讓大家掌握更多相關知識。
2
Flash閃存接口
STM32片上Flash閃存接口是在AHB協議上實現了對指令和數據的訪問,它通過對存儲器的預取緩存,加快了存儲器的訪問;
閃存接口還實現了在所有工作電壓下對閃存編程和擦除所需的邏輯電路,這里還包括訪問和寫入保護以及選項字節的控制。
內置閃存模塊可以在通用地址空間直接尋址,任何32位數據的讀操作都能訪問閃存模塊的內容并得到相應的數據。
3
STM32片上Flash容量
STM32片上Flash容量大小與芯片的型號有關,具體大小可以參看命名規則:
而我們也可以通過讀取Flash容量寄存器,或通過STM32 ST-LINK Utility工具獲取芯片容量。具體可以參看我的另一篇文章《關于STM32的這幾個寄存器》
4
Flash閃存模塊的組織
STM32的Flash,有的是分頁,而有的卻是分塊,具體可以查閱“參考手冊”。
比如:STM32F0、 F1、 F3、 L1等就是按Page頁來劃分的,如下圖:
而像STM32F2、F4等就是按Sector扇區來劃分,如下圖:
所以,如果移植代碼,從Page頁移植到Sector扇區,或者從Sector扇區移植到Page頁,這部分底層代碼必須要修改才行。
5
非對其寫操作
STM32為32位的MCU,即4個字節。如果不是按照4個字節的寫Flash,將導致Faults異常。
寫Flash過程:
這里大家可以參看我之前分享的文章:
1.位帶別名區最低有效位
2.談談STM32(CM3)的Faults異常
6
寫操作不響應代碼或數據讀取
對STM32內部FLash的寫操作,相對于執行指令是比較耗時的。從數據手冊可以得出16位數據編程時間再40 --- 70us。
從STM32編程手冊中,可以知道:在進行寫或擦除操作時,不能進行代碼或數據的讀取操作。
比如:你在寫Flash期間有接收串口數據,很有可能會丟串口數據。
因為比較耗時,所以,在寫數據時,CPU不會執行其他操作。
簡單說:在寫Flash時,CPU 不能取指令,導致中斷得不到及時響應,從而發生接收到的數據未及時讀走而被覆蓋的現象。
遇到這種情況,解決的辦法:使用DMA。DMA不需要CPU干預,一旦 USART 有數據接收到,由 DMA 負責將其傳輸至循環緩沖區中。軟件定期檢測循環緩沖區中是否有接收到的數據,如果有則加以處理。
提示:
如果你的代碼會反復讀Flash,建議使用外部Flash。
-
mcu
+關注
關注
146文章
17824瀏覽量
360236 -
FlaSh
+關注
關注
10文章
1662瀏覽量
150964 -
STM32
+關注
關注
2289文章
11011瀏覽量
362300
發布評論請先 登錄
MCU片上Flash
STM32L476 Flash擦除失敗的原因?
S32K311如何在Flash上測試ECC?
使用DLP3479+DLP4710+DLPA3005開發光機遇到一些疑問求解
EEPROM輕量級的簡易類文件的數據讀寫庫:EEPROMFS

分享一些常見的電路

評論