有人使用STM32L476芯片開發(fā)產(chǎn)品,他想在內(nèi)部FLASH空間特定位置寫些數(shù)據(jù),發(fā)現(xiàn)總是失敗,并補(bǔ)充說之前使用STM32F1系列、STM32L1系列卻沒有類似問題。
其實,針對STM32L4的內(nèi)部FLASH編程,跟STM32F1/L1系列是不同的,其中STM32F1的內(nèi)部FLASH編程僅支持半字編程,STM32L1的內(nèi)部FLASH編程主要支持字編程或半頁編程。而STM32L4系列的內(nèi)部FLASH編程所支持的則是64位雙字編程或以32個雙字為單位的快速行編程。
對于少量的零星數(shù)據(jù)編程自然會選擇64位雙字編程模式,即每次改寫Flash內(nèi)容必須以64位為單位。硬件還針對這64位數(shù)據(jù)做了8位的ECC,我們用戶看不到而已。下面簡單介紹下64位雙字編程過程。
在基于64位雙字編程時,如果只是就字節(jié)或半字進(jìn)行編程則會產(chǎn)生錯誤;或者盡管使用雙字編程卻沒有遵循雙字地址對齊【8字節(jié)對齊】時也會產(chǎn)生錯誤。
這里我使用ARM MDK V2.9開發(fā)環(huán)境,借助于STM32L476_NUCELO開發(fā)板演示一下對內(nèi)部FLASH某個位置寫幾個64位數(shù)據(jù)的實現(xiàn)過程【寫之前相關(guān)區(qū)域已經(jīng)被擦除過了】。
我通過IDE將內(nèi)部FLASH最后的0x1000地址空間預(yù)留出來用于填寫些數(shù)據(jù),即我將內(nèi)部FLASH分成2塊,將最后的0x1000的FLASH空間劃了出來。如下圖所示:【這里的芯片是STM32L476RGT6,下面只演示寫三個64位數(shù)據(jù)?!?/p>
我將特定數(shù)據(jù)區(qū)定義在內(nèi)部FLASH空間0x80ff000開始的地方。
#define Address_Const (0x80FF000)
另外還定義了一個64位地址指針和一個64位數(shù)據(jù)數(shù)組。
相關(guān)執(zhí)行參考代碼如下:
代碼是基于STM32Cube庫來組織的,連續(xù)寫了三個64位的數(shù)據(jù)到指定的FLASH空間。其中主要涉及到一個FLASH編程函數(shù)HAL_FLASH_Program(),它有三個變量,分別是編程模式,待編程的FLASH地址以及用于編程的數(shù)據(jù)。
代碼比較簡單,對欲編程的地址做檢查確認(rèn),然后進(jìn)行FLASH編程開鎖,清除可能存在的各種掛起狀態(tài)標(biāo)志,進(jìn)行雙字編程,之后對FLASH寄存器訪問進(jìn)行上鎖。
現(xiàn)在基于上面的代碼看看運行結(jié)果:
我們可以看到在指定的FLASH地址空間寫三個64位數(shù)據(jù)。
在上面介紹64位雙字編程規(guī)則時,可能有人會問,如果我遵循了8字節(jié)地址對齊,待寫的數(shù)據(jù)也不是字節(jié)或半字,而是一個字會怎么樣呢?那你也得湊成2個字來寫,方能完成一次寫操作。
比方基于上面測試代碼,僅僅將每次待寫的數(shù)據(jù)改為32位字,最后結(jié)果便是高位字被填0了。就像下面這樣:
好,關(guān)于STM32L4系列內(nèi)部FLASH雙字編程模式就介紹到這里。整個過程應(yīng)該說不難,只要注意到各個細(xì)節(jié)就好。
趁此再拋磚引玉似地做些提醒:STM32系列眾多,各個系列的內(nèi)部FLASH編程模式以及頁或扇區(qū)的容量規(guī)劃、地址安排往往各有差異,在FLASH編程時千萬別跟著慣性或感覺走。還有,不同的編程模式往往對芯片的電源電壓有不同的要求,這點也要特別特別特別注意。
-
編程
+關(guān)注
關(guān)注
88文章
3689瀏覽量
95273 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4381瀏覽量
64911 -
STM32L4
+關(guān)注
關(guān)注
1文章
42瀏覽量
9693
原文標(biāo)題:STM32L4系列內(nèi)部FLASH雙字編程示例
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
STM32F3系列、STM32F4系列、STM32L4系列和STM32L4+系列Cortex-M4編程手冊
STM32F40xxx和STM32f41xx flash編程手冊
手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測、智能控制系統(tǒng)(STM32L4、服務(wù)器、安卓源碼)實例項目打包下載
手機(jī)APP遠(yuǎn)程控制,智能家居監(jiān)測、智能控制系統(tǒng)(STM32L4、服務(wù)器、安卓源碼)
昂科燒錄器支持ST意法半導(dǎo)體的超低功耗微控制器STM32L4S5VIT

請問STM32U3系列的定位是怎樣的?
STM32L476 Flash擦除失敗的原因?
請問STM32U3系列的定位是怎樣的?
cubeide的代碼怎么編譯到內(nèi)部+外部FLASH里面去?
AN-881: 通過LIN—協(xié)議4進(jìn)行Flash/EE存儲器編程

STM32WB55RG開發(fā)(2)----STM32CubeProgrammer燒錄

在mmWave SDK增加QSPI Flash驅(qū)動的示例

評論