?STM32系列的芯片里都有個特別的存儲區---FLASH選項字區域,這里簡單聊下該話題并順便給出基于STM32F0芯片的代碼實現及幾點提醒。
這塊特定的FLASH存儲區域,通常用來存放有關芯片內部FLASH讀保護、寫保護、看門狗使能方式、芯片啟動、RAM校驗、電源監控等配置信息。具體內容以及格式因不同的STM32系列可能有差異。
一般來講,各個選項字由選項字節組成,各選項字節由原始字節項和互補字節項組成。如下圖存儲方式,?綠色欄為原始選項字節,黃色欄代碼互補選項字節。不同系列可能有差異。【下文中截圖如無特別說明,均是來自STM32F0芯片的參考手冊。】
FLASH選項字一般安排在某固定地址起始的一塊連續的地址空間。下圖就是STM32FO芯片內部FLASH選項字的地址及內容結構安排。這里包括讀保護選項字節、用戶選項字節、扇區寫保護選項字節。
對于出廠的芯片,FLASH選項字往往具有初始出廠值。下圖就是STM32F0芯片出廠時FLASH選項字的初始值。
但在我們的實際應用中往往需要結合實際應用情況,對FLASH選項字進行重新配置。而對FLASH選項字進行重新配置一般有兩種方式:
第一種,通過編程燒錄工具進行選項字的配置并寫入。
比方使用STLinkUtiliy或STM32CubeProgrammer或其它類似編程工具來實現。這種方式相對較為簡單,一般對操作人員往往有些要求。尤其在有意或無意弄錯配置選項的情況下,沒法快速發現并及時糾正。
另外一種方式就是用戶在應用代碼里根據應用需求做FLASH選項字的配置編程。
這種方式,對開發人員來講會增加了一些工作量。但燒錄時只管燒錄FLASH執行代碼即可,關于芯片配置方面的信息在代碼里自行完成。即使燒錄時出現選項字的誤操作,用戶程序代碼也可以將其自動糾正過來。
不論使用哪種方式修改FLASH選項字的配置,要想新的選項字信息真正起作用,還有個對FLASH選項字信息進行加載的環節,即將FLASH選項字的配置信息加載到選項字寄存器,從而作用于芯片的相關功能,也就是上面提到過的讀保護、寫保護、看門狗使能、電源控制、啟動選擇等功能信息。一般來說,將FLASH選項字信息加載到選擇字寄存器需要借助系統復位或上電復位來完成。【當在調試狀態下修改FLASH選項字時,它的加載需借助上電復位】
在進行FLASH選項字加載之前,芯片硬件會先對選項字信息進行基本地判斷與確認,即將各個原始選項字節與互補選項字節的進行匹配比對。如果比對失敗將產生出錯事件,并將比對失敗的選項字節【原始字節和互補字節】強制修改為0xFF或其它指定值,視不同的STM32系列而定。
比方,下面就是STM32L4系列做選項字加載前發生原始項與互補項信息比對不匹配時的處理原則:
關于FLASH選項字信息地編程修改,這里特別提醒幾點:
第1點,當準備好要修改的選項字信息,在對FLASH選項字進行編程修改之前,需先對FLASH選項字區域進行擦除。發出擦除指令即可。擦除完畢之后再將新的選項字信息寫入選項字區域。
那么為了保障選項字正確有序的編程寫人,在做FLASH選項字的編程時,一定要保持電源的穩定。【比方說,代碼里稍作延時等上電穩定后再操作】如果正在做FLASH選項字編程時發生電源電壓劇烈波動或重啟,很可能發生FLASH選項字區域被擦除了但又沒有正確寫入新的選項字信息的情況。而且,前面也提到了,如果選項字因為沒有被完整地正確寫入,在做FLASH選項字加載前,還會由于原始項與互補項做信息比對失敗而被強行修改為OxFF或其它指定值。
下面兩幅截圖就是使用燒錄工具軟件【STM32CubeProgrammer】,在做flash選項字編程時通過模擬芯片被強行斷電所發生的情形。
本來,開始做FLASH選項字編程時,RDP保護配置都是選擇的LEVEL_0。在選項字編程時芯片被中途斷電重新后連接所看到結果卻是芯片被讀保護了,其它配置字也被擦除了。從截圖中可以看到,此時RDP=0xFF,既不是0xAA也不是0xCC,那么芯片的讀保護等級就相應地變成了LEVEL_1讀保護狀態了。有人碰到此情形時往往感到納悶不解,明明自己沒有修改RDP的配置怎么RDP的保護等級變了呢?就是因為中途斷電,選項字區域剛被擦除又還沒來得及完整、正常寫入。
當然,做FLASH選項字編程時除了要求電源穩定外,編程時序也需遵照手冊介紹的來操作,以保證選項字編程的正確性。
第2點?,對于某些雙BANK的STM32芯片,比如STM32L4,STM32F42X等系列,在做選項字編程調整時,也是先將兩個BANK的用戶選項頁的內容進行擦除,然后依據用戶準備好的選項寄存器的內容對所有選項字內容重新編程更新。
這里要注意的是,我們不能只是單獨地針對雙BANK其中的某一個BANK進行用戶選項字調整,而是需要將BANK1和BANK2的配置信息都準備好并寫入相應的選項字寄存器,從而實現對兩個BANK的選項字信息的編程修改。
第3點?,在做選項字編程過程中,如果修改讀保護選項時,一定要清楚-----如果是從LEVEL_1調整為LEVEL_0將會發生整個芯片內部的FLASH內容被全部擦除的情況。另外,很多STM32系列支持LEVEL_2讀保護,該保護等級具有不可逆性。如果選擇該等級,除非你自己在芯片內部準備好了升級引導代碼,否則你是不能再對片內代碼內容做任何更新,更不可能基于該芯片再做調試了。
好,關于STM32芯片的選項字的編程提醒就聊到這里。感覺上內容應該不多,但由于STM32家族擁有眾多系列,同時各個系列間在選項字這部分內容又或多或少存在著差異,讓內容突然龐雜了很多。這里只能拋磚引玉似地給些提醒,具體應用時請參考各個STM32系列的參考手冊及編程手冊。
下面就以STM32F072芯片為核心的Nucleo板,給出一個實現用戶選項字編程的示例。
先看看STM32F072片內選項字區域的基本內容框架,如下圖:
一、選項字內容的規劃與準備:
這里我將RDP選項字節配置為0xbb,即LEVEL_1,則其互補選項字節內容就是0x44;將USER選項字節下面紅色方框內的三個選項置1,另外兩個保留位置1,那么USER選項字節的內容就是OxEA,它的互補字節就是0x15.
選項域中的Data0字節配置為0x99,則其互補字節nData0則為0x66;
選項域中的Data1字節配置為0x88,則其互補字節nData0則為0x77;
按照上面規劃準備好數據,如下圖所示。各選項數據按原項和互補項組成半字寫入。
【順便說下,這里沒有對扇區寫保護做配置。當然要做也是完全可以的】
二、編寫相應程序代碼,編譯后下載到芯片:
相關代碼不長,較為簡單。按照手冊描述的來編寫。我將上述代碼分成6部分。
第1部分,做有關選項字節內容的判斷,是否均為預期的選項配置內容。
第2部分,對FLASH、OPTION編程做開鎖操作。
第3部分,對選項域進行擦除,然后退出擦除狀態。
第4部分,對欲修改的選項字節進行編程修改。
第5部分,完成選項字的修改與編程后,上鎖并退出。
第6部分,觸發系統復位,將新的選擇域內容加載到選項控制寄存器。
三、運行程序,驗證結果
運行用戶程序實現選項域的編程修改操作。可連接到STLINK Utlity之類的工具查看選項配置結果,看看是否跟預期規劃的一致。
上圖是通過STLINK Utility工具查看到的STM32F072芯片運行用戶程序后的選項域的結果。不難看出,跟我們預期的結果一樣【打勾的選項表示置1的選項】。我們還可以基于STLINK_Utility工具隨意修改RDP選項字以外的其它選項內容,通過它做選項字的修改編程。然后再次運行用戶程序,可以發現各個選項字內容又會回歸到用戶預設的配置內容。
-
芯片
+關注
關注
459文章
52383瀏覽量
439118 -
STM32
+關注
關注
2291文章
11026瀏覽量
363779
原文標題:STM32選項字編程示例及幾點提醒
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
零知開源——STM32F4實現ILI9486顯示屏UI界面系列教程(二):日歷功能實現


STM32與機智云連接實現步驟與技巧(下篇):機智云代碼移植與優化

STM32F103×8/STM32F103×B MCU手冊
STM32F0 SMBus中斷怎么開啟?
STM32F407嵌入式SRAM映射為0x20020000,為什么?
STM32F405xx和STM32F407xx微控制器數據手冊
意法半導體STM32支持RT-Thread開源4+服務,助力企業用戶加速嵌入式開發

評論