5.3.5User flash區(qū)擦除操作
User flash區(qū)支持以下擦除方式:
l頁擦除(512字節(jié))
l塊擦除(16KB)
l批量擦除(128KB)
Flash存儲器在執(zhí)行擦除操作時,不能同時進行讀取操作,需要等待存儲器完成 擦除操作后,讀取操作才能正常進行,擦除完成后的Flash數據為全1。
5.3.5.1User flash區(qū)頁擦除步驟
對User flash區(qū)進行頁擦除操作(512字節(jié)),可遵循以下步驟:
1) 檢查Flash狀態(tài)寄存器(FLASH_SR)中的BSY標志,以確認當前沒有正在執(zhí)行的Flash操作;
2) 檢查FLASH_SR寄存器,確認錯誤標志均已清除;
3) 解鎖Flash控制寄存器(FLASH_CR),使LOCK位清0;(詳見:Flash控 制寄存器解鎖)
4) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為01,進入頁擦除模式;
5) 配置FLASH_CR寄存器中的PNB[7:0]位域,選擇待擦除區(qū)域的頁號;
6) 配置FLASH_CR寄存器中的ERASE位置1,啟動Flash擦除,同時BSY標志將自動置1;
7) 查詢并等待BSY標志清0,表明擦除操作已完成,此時ERASE位也將自 動清 0;
8) 如果要對多個頁執(zhí)行擦除操作,可重復執(zhí)行步驟5到7;
9) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為00,退出擦除模式;
10) 配置FLASH_CR寄存器中的LOCK位置1,恢復FLASH_CR寄存器的寫保護鎖定狀態(tài)。
5.3.5.2User flash區(qū)塊擦除步驟
對User flash區(qū)進行塊擦除操作(16KB),可遵循以下步驟:
1) 檢查Flash狀態(tài)寄存器(FLASH_SR)中的BSY標志,以確認當前沒有正在執(zhí)行的Flash操作;
2) 檢查FLASH_SR寄存器,確認錯誤標志均已清除;
3) 解鎖Flash控制寄存器(FLASH_CR),使LOCK位清0;(詳見:Flash控制寄存器解鎖);
4) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為10,進入塊擦除模式;
5) 配置FLASH_CR寄存器中的PNB[2:0]位域,選擇待擦除區(qū)域的塊號;
6) 配置FLASH_CR寄存器中的ERASE位置1,啟動Flash擦除,同時BSY標志將自動置1;7) 查詢并等待BSY標志清0,表明擦除操作已完成,此時ERASE位也將自動清0;
8) 如果要對多個塊執(zhí)行擦除,可重復執(zhí)行步驟5到7;
9) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為00,退出擦除模式;
10) 配置FLASH_CR寄存器中的LOCK位置1,恢復FLASH_CR寄存器的寫保護鎖定狀態(tài)。
5.3.5.3User flash區(qū)批量擦除步驟
批量擦除用于擦除整個User flash區(qū)域(128KB),可遵循以下步驟:
1) 檢查Flash狀態(tài)寄存器(FLASH_SR)中的BSY標志,以確認當前沒有正在執(zhí)行的Flash操作;
2) 檢查FLASH_SR寄存器,確認錯誤標志均已清除;
3) 解鎖Flash控制寄存器(FLASH_CR),使LOCK位清0(詳見:Flash控制寄存器解鎖);
4) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為11,進入批量擦除模式;
5) 配置FLASH_CR寄存器中的ERASE位置1,啟動Flash擦除,同時BSY標志將自動置1;
6) 查詢并等待BSY標志清0,表明擦除操作已完成,此時ERASE位也將自動清 0;
7) 配置FLASH_CR寄存器中的ER_MODE[1:0]位域為00,退出擦除模式;
8) 配置FLASH_CR寄存器中的LOCK位置1,恢復FLASH_CR寄存器的寫保護鎖定狀態(tài)。
5.3.5.4User flash區(qū)擦除錯誤
在對User flash區(qū)執(zhí)行擦除操作的過程中,可能會出現以下錯誤標志:
lFlash操作序列錯誤標志PESERR:
-在ERASE位被置1的同時,如果ER_MODE[1:0]位域為00,則不會
啟動擦除操作,錯誤標志PESERR將置1;
-在ERASE位被置1的同時,如果待擦除的區(qū)域(PNB[7:0])超出了
Flash的有效空間,則不會啟動擦除操作,錯誤標志PESERR將置1;
-當有錯誤標志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時,配置ERASE位置1,則不會啟動擦除操作,錯誤標志PESERR將置1;
-ERASE、OPTSTRT、OBL_LAUNCH中任意2個以上控制位同時置1,
則不會啟動對應的操作,錯誤標志PESERR將置1。
l寫保護錯誤標志WRPERR:
-如果要擦除的區(qū)域受到安全保護機制的影響,包含有受保護的區(qū)域,
則不會啟動擦除操作,FLASH_SR寄存器中的WRPERR標志將置1。
5.3.6User flash區(qū)編程操作
對Flash存儲器執(zhí)行編程操作,每次能寫入的數據長度固定為 32bits(字),不支持其他長度的數據寫入。
FLASH存儲器在執(zhí)行編程操作時,不能同時進行讀取操作,需要等待存儲器完成編程操作后,讀取操作才能正常進行。
與Flash擦除操作類似,編程操作也會受到安全保護機制的影響:
5.3.6.1User flash區(qū)編程操作步驟
對User flash區(qū)進行編程操作,可遵循以下步驟:
1) 檢查Flash狀態(tài)寄存器(FLASH_SR)中的BSY標志,以確認當前沒有正在執(zhí)行的Flash操作;
2) 檢查FLASH_SR寄存器,確認錯誤標志均已清除;
3) 解鎖Flash控制寄存器(FLASH_CR),使LOCK位清0(詳見:Flash控制寄存器解鎖);
4) 配置FLASH_CR寄存器中的PG_MODE為1,進入Flash編程模式;
5) 向Flash目標地址寫入32bits數據,寫入后BSY標志將自動置1;
6) 查詢并等待BSY標志清0,表明編程操作已完成;7) 如果要對多個地址進行編程,可重復步驟5和6;
8) 配置FLASH_CR寄存器中的PG_MODE位為0,退出Flash編程模式;
9) 配置FLASH_CR寄存器中的LOCK位置1,恢復FLASH_CR寄存器的寫保護鎖定狀態(tài)。
5.3.6.2User flash區(qū)編程錯誤
在對User flash區(qū)進行編程操作的過程中,可能會出現以下錯誤標志:
l編程錯誤標志PROGERR:
-當Flash地址內的數據不是 0xFFFF FFFF時,表明該地址已經執(zhí)行過
編程操作,向該地址寫入數據,則寫入的數據會被忽略,不會啟動編
程操作,錯誤標志PROGERR將置1;
-當PG_MODE位為0時,向Flash地址寫入數據,則寫入的數據會被
忽略,不會啟動編程操作,錯誤標志PROGERR將置1;
-當有錯誤標志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時,向Flash地址寫入數據,則寫入的數據會被忽略,不會啟動編程操作,錯誤標志 PROGERR將置1。
l編程位寬錯誤標志SIZERR:
-如果向Flash地址寫入字節(jié)或半字,則寫入的數據會被忽略,不會啟
動編程操作,錯誤標志SIZERR將置1。
l編程地址未對齊錯誤標志PGAERR:
-如果編程操作的目標地址沒有按字對齊(地址2位不為b00),則
寫入的數據會被忽略,不會啟動編程操作,錯誤標志PGAERR將置1。
l寫保護錯誤標志WRPERR:
-如果要編程的區(qū)域受到安全保護機制的影響,處于受保護的狀態(tài),向
該區(qū)域中的地址寫入數據,則寫入的數據會被忽略,不會啟動編程操
作,錯誤標志WRPERR將置1。
5.4.1選項字節(jié)組成
選項字節(jié)存放于Flash存儲器的Option bytes區(qū),用于保存與芯片硬件功能相關的配置項,用戶可根據應用對選項字節(jié)進行配置,以實現特定的硬件功能。
為了校驗選項字節(jié)的正確性,在Option bytes區(qū)的每個字(32bits)被拆分成兩
部分,低16bits存放選項字節(jié),高16bits存放選項字節(jié)的反碼。
復位后,硬件會自動將Option bytes區(qū)中的內容,加載到寄存器里,這些寄存器被稱為選項字節(jié)加載寄存器,選項字節(jié)中各控制位的作用,可查看以下寄存器的詳細描述:
lFLASH_OPTR1:選項字節(jié)寄存器 1
lFLASH_OPTR2:選項字節(jié)寄存器 2
lFLASH_PCROP1AS:代碼讀出保護區(qū) 1A起始地址寄存器
lFLASH_PCROP1AE:代碼讀出保護區(qū) 1A結束地址寄存器
lFLASH_PCROP1BS:代碼讀出保護區(qū) 1B起始地址寄存器
lFLASH_PCROP1BE:代碼讀出保護區(qū) 1B結束地址寄存器
lFLASH_WRP1AS:寫保護區(qū)A起始地址寄存器
lFLASH_WRP1AE:寫保護區(qū)A結束地址寄存器
lFLASH_WRP1BS:寫保護區(qū)B起始地址寄存器
lFLASH_WRP1BE:寫保護區(qū)B結束地址寄存器
lFLASH_SECR:用戶安全配置寄存器
5.4.2選項字節(jié)更新
Option bytes區(qū)與User flash區(qū)不同,用戶不能直接對 Option bytes區(qū)執(zhí)行擦除或編程操作,而是要通過對應的選項字節(jié)加載寄存器進行更新。
對選項字節(jié)的更新遵循以下步驟:
1) 檢查Flash狀態(tài)寄存器(FLASH_SR)中的BSY標志位,以確認當前沒有正在執(zhí)行的Flash操作;
2) 檢查FLASH_SR寄存器,確認錯誤標志均已清除;
3) 解鎖Flash選項字節(jié)的寫保護,使Flash控制寄存器(FLASH_CR)中的
OPTLOCK位清0(詳見:Flash選項字節(jié)解鎖);
4) 配置FLASH_CR寄存器中的PG_MODE為1,進入Flash編程模式;
5) 配置選項字節(jié)加載寄存器;
6) 將FLASH_CR寄存器中的OPTSTRT位置1,啟動選項字節(jié)的更新,同時BSY標志將自動置1;
7) 查詢并等待BSY標志清0,表明選項字節(jié)已更新完成,此時OPTSTRT位也將被自動清 0;
8) 配置FLASH_CR寄存器中的PG_MODE位為0,退出Flash編程模式;
9) 配置FLASH_CR寄存器中的OPTLOCK位置1,恢復選項字節(jié)的寫保護鎖定狀態(tài);
10) 此時FLASH_CR寄存器處于解鎖狀態(tài),可根據需要配置FLASH_CR寄存器中的LOCK位置1,將其恢復成寫保護鎖定狀態(tài)。
在啟動選項字節(jié)更新后,將對Option bytes區(qū)進行擦除,并自動生成選項字節(jié)的反碼,隨后會將選項字節(jié)及其反碼更新到Option bytes區(qū)。
在完成對選項字節(jié)的更新后,直接讀取Option bytes區(qū),可獲取更新后的選項字節(jié)值。但是更新后的選項字節(jié)此時并未生效,如果讀取選項字節(jié)加載寄存器,獲得的仍將是最近一次已加載生效的選項字節(jié)值。在對選項字節(jié)進行更新的過程中,可能會出現以下錯誤標志:
lFlash操作序列錯誤標志PESERR:
-在OPTSTRT位被置1的同時,如果PG_MODE位為0,則不會啟動
選項字節(jié)更新,錯誤標志PESERR將置1;
-當有錯誤標志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時,配置OPTSTRT位置1,則不會啟動選項字節(jié)更新,錯誤
標志PESERR將置1;
-ERASE、OPTSTRT、OBL_LAUNCH中任意2個以上控制位同時置1,
則不會啟動對應的操作,錯誤標志PESERR將置1。
5.4.3選項字節(jié)加載
要使Option bytes區(qū)中選項字節(jié)生效,可通過以下方式對選項字節(jié)進行加載:
l以下復位將觸發(fā)加載:
-POR/PDR復位
-退出Standby模式復位
l配置FLASH_CR寄存器中OBL_LAUNCH位為1啟動加載,加載執(zhí)行時BSY標志將自動置1,加載完成后該標志將自動清0并觸發(fā)系統復位。
如果ERASE、OPTSTRT、OBL_LAUNCH中任意2個以上控制位同時置1,則不會啟動對應的操作,錯誤標志PESERR將置1。
在選項字節(jié)加載過程中,將自動對選項字節(jié)及其反碼進行校驗,如果出現錯誤,將維持復位狀態(tài)不再執(zhí)行任何操作,直到發(fā)生POR/PDR復位。
當選項字節(jié)加載生效后,Option bytes區(qū)中的選項字節(jié)將被自動復制到對應的加載寄存器。讀取選項字節(jié)加載寄存器,獲得的總是加載生效后的選項字節(jié)值。
5.5Flash安全保護機制
Flash存儲器支持以下安全保護機制:
lFlash讀出保護(RDP):通過配置不同RDP保護等級,對存儲器的操作權限進行限制。
lFlash代碼讀出保護(PCROP):禁止對受保護的區(qū)域執(zhí)行讀取、編程或擦
除操作,僅允許取指操作。
lFlash寫入保護(WRP):禁止對受保護的區(qū)域執(zhí)行編程或擦除操作,但允
許取指和讀取操作。
lFlash用戶安全區(qū)域:在復位后,用戶安全區(qū)域處于未保護狀態(tài),可執(zhí)行
取指、讀取、編程和擦除操作。當安全區(qū)域使能后,該區(qū)域不可見,禁止
對該區(qū)域執(zhí)行任何操作,直到重新復位。
5.5.1Flash讀出保護
5.5.1.1RDP保護權限
Flash讀出保護(RDP),共有三種保護等級:
RDP0:
l從User flash/SRAM啟動
-User flash區(qū):允許取指、讀取、編程、擦除
-System memory區(qū):僅允許取指
-Option bytes區(qū):允許讀取、更新(通過選項字節(jié)加載寄存器)
-OTP區(qū):允許讀取、編程(每個字僅可編程一次)
-備份寄存器:允許讀取、寫入
l從Bootloader啟動
-User flash區(qū):允許取指、讀取、編程、擦除
-System memory區(qū):允許取指、讀取
-Option bytes區(qū):允許讀取、更新(通過選項字節(jié)加載寄存器)
-OTP區(qū):禁止執(zhí)行任何操作
-備份寄存器:禁止執(zhí)行任何操作
l調試接口
-User flash區(qū):允許取指、讀取、編程、擦除
-System memory區(qū):僅允許取指
-Option bytes區(qū):允許讀取、更新(通過選項字節(jié)加載寄存器)
-OTP區(qū):允許讀取、編程(每個字僅可編程一次)
-備份寄存器:允許讀取、寫入
注意:從Bootloader啟動時,禁用調試接口。
RDP1:
l從User flash啟動
-User flash區(qū):允許取指、讀取、編程、擦除
-System memory區(qū):僅允許取指
-Option bytes區(qū):允許讀取、更新(通過選項字節(jié)加載寄存器)
-OTP區(qū):允許讀取、編程(每個字僅可編程一次)
-備份寄存器:允許讀取、寫入
l從Bootloader啟動
-User flash區(qū):僅允許取指
-System memory區(qū):允許讀取、取指
-Option bytes區(qū):允許讀取、更新(通過選項字節(jié)加載寄存器)
-OTP區(qū):禁止執(zhí)行任何操作
-備份寄存器:禁止執(zhí)行任何操作
l禁止從SRAM啟動
l禁用調試接口
RDP2:
l從User flash啟動
-User flash區(qū):允許取指、讀取、編程、擦除
-System memory區(qū):僅允許取指
-Option bytes區(qū):僅允許讀取-
OTP區(qū):允許讀取、編程(每個字僅可編程一次)
-備份寄存器:允許讀取、寫入
l禁止從Bootloader啟動
l禁止從SRAM啟動
l禁用調試接口
對于Flash存儲器,當Flash控制器檢測到無權限的非法操作時,FLASH_SR寄 存器中的 ACERR錯誤標志將立刻置1,非法操作會被立刻終止,并產生總線訪 問錯誤,觸發(fā) HardFault中斷。
對Option bytes區(qū)的更新,必須通過相應的選項字節(jié)加載寄存器來完成。當保護等級為 RDP2時,不允許更新該區(qū)域,此時如果FLASH_CR寄存器中的
OPTSTRT位被置1,則FLASH_SR寄存器中的ACERR錯誤標志將置1,wo對Option bytes區(qū)的操作將被終止,并產生總線訪問錯誤,觸發(fā)HardFault中斷。
-
mcu
+關注
關注
146文章
17141瀏覽量
351077 -
FlaSh
+關注
關注
10文章
1634瀏覽量
147973 -
存儲器
+關注
關注
38文章
7487瀏覽量
163798
發(fā)布評論請先 登錄
相關推薦
評論