產(chǎn)品詳情
5.3.5 User flash 區(qū)擦除操作
User flash 區(qū)支持以下擦除方式:
l 頁擦除(512 字節(jié))
l 塊擦除(16KB)
l 批量擦除(128KB)
Flash 存儲(chǔ)器在執(zhí)行擦除操作時(shí),不能同時(shí)進(jìn)行讀取操作,需要等待存儲(chǔ)器完成 擦除操作后,讀取操作才能正常進(jìn)行,擦除完成后的 Flash 數(shù)據(jù)為全 1。
5.3.5.1 User flash 區(qū)頁擦除步驟
對(duì) User flash 區(qū)進(jìn)行頁擦除操作(512 字節(jié)),可遵循以下步驟:
1) 檢查 Flash 狀態(tài)寄存器(FLASH_SR)中的 BSY 標(biāo)志,以確認(rèn)當(dāng)前沒有正在執(zhí)行的 Flash 操作;
2) 檢查 FLASH_SR 寄存器,確認(rèn)錯(cuò)誤標(biāo)志均已清除;
3) 解鎖 Flash 控制寄存器(FLASH_CR),使 LOCK 位清 0;(詳見:Flash 控 制寄存器解鎖)
4) 配置 FLASH_CR寄存器中的 ER_MODE[1:0]位域?yàn)?01,進(jìn)入頁擦除模式;
5) 配置 FLASH_CR 寄存器中的 PNB[7:0]位域,選擇待擦除區(qū)域的頁號(hào);
6) 配置 FLASH_CR 寄存器中的 ERASE 位置 1,啟動(dòng) Flash 擦除,同時(shí) BSY 標(biāo)志將自動(dòng)置 1;
7) 查詢并等待 BSY 標(biāo)志清 0,表明擦除操作已完成,此時(shí) ERASE 位也將自 動(dòng)清 0;
8) 如果要對(duì)多個(gè)頁執(zhí)行擦除操作,可重復(fù)執(zhí)行步驟 5 到 7;
9) 配置 FLASH_CR 寄存器中的 ER_MODE[1:0]位域?yàn)?00,退出擦除模式;
10) 配置 FLASH_CR 寄存器中的 LOCK 位置 1,恢復(fù) FLASH_CR 寄存器的寫保護(hù)鎖定狀態(tài)。
5.3.5.2 User flash 區(qū)塊擦除步驟
對(duì) User flash 區(qū)進(jìn)行塊擦除操作(16KB),可遵循以下步驟:
1) 檢查 Flash 狀態(tài)寄存器(FLASH_SR)中的 BSY 標(biāo)志,以確認(rèn)當(dāng)前沒有正在執(zhí)行的 Flash 操作;
2) 檢查 FLASH_SR 寄存器,確認(rèn)錯(cuò)誤標(biāo)志均已清除;
3) 解鎖 Flash 控制寄存器(FLASH_CR),使 LOCK 位清 0;(詳見:Flash 控制寄存器解鎖);
4) 配置 FLASH_CR寄存器中的 ER_MODE[1:0]位域?yàn)?10,進(jìn)入塊擦除模式;
5) 配置 FLASH_CR 寄存器中的 PNB[2:0]位域,選擇待擦除區(qū)域的塊號(hào);
6) 配置 FLASH_CR 寄存器中的 ERASE 位置 1,啟動(dòng) Flash 擦除,同時(shí) BSY 標(biāo)志將自動(dòng)置 1;7) 查詢并等待 BSY 標(biāo)志清 0,表明擦除操作已完成,此時(shí) ERASE 位也將自動(dòng)清 0;
8) 如果要對(duì)多個(gè)塊執(zhí)行擦除,可重復(fù)執(zhí)行步驟 5 到 7;
9) 配置 FLASH_CR 寄存器中的 ER_MODE[1:0]位域?yàn)?00,退出擦除模式;
10) 配置 FLASH_CR 寄存器中的 LOCK 位置 1,恢復(fù) FLASH_CR 寄存器的寫保護(hù)鎖定狀態(tài)。
5.3.5.3 User flash 區(qū)批量擦除步驟
批量擦除用于擦除整個(gè) User flash 區(qū)域(128KB),可遵循以下步驟:
1) 檢查 Flash 狀態(tài)寄存器(FLASH_SR)中的 BSY 標(biāo)志,以確認(rèn)當(dāng)前沒有正在執(zhí)行的 Flash 操作;
2) 檢查 FLASH_SR 寄存器,確認(rèn)錯(cuò)誤標(biāo)志均已清除;
3) 解鎖 Flash 控制寄存器(FLASH_CR),使 LOCK 位清 0(詳見:Flash 控制寄存器解鎖);
4) 配置 FLASH_CR 寄存器中的 ER_MODE[1:0]位域?yàn)?11,進(jìn)入批量擦除模式;
5) 配置 FLASH_CR 寄存器中的 ERASE 位置 1,啟動(dòng) Flash 擦除,同時(shí) BSY標(biāo)志將自動(dòng)置 1;
6) 查詢并等待 BSY 標(biāo)志清 0,表明擦除操作已完成,此時(shí) ERASE 位也將自動(dòng)清 0;
7) 配置 FLASH_CR 寄存器中的 ER_MODE[1:0]位域?yàn)?00,退出擦除模式;
8) 配置 FLASH_CR 寄存器中的 LOCK 位置 1,恢復(fù) FLASH_CR 寄存器的寫保護(hù)鎖定狀態(tài)。
5.3.5.4 User flash 區(qū)擦除錯(cuò)誤
在對(duì) User flash 區(qū)執(zhí)行擦除操作的過程中,可能會(huì)出現(xiàn)以下錯(cuò)誤標(biāo)志:
l Flash 操作序列錯(cuò)誤標(biāo)志 PESERR:
- 在 ERASE 位被置 1 的同時(shí),如果 ER_MODE[1:0] 位域?yàn)?00,則不會(huì)
啟動(dòng)擦除操作,錯(cuò)誤標(biāo)志 PESERR 將置 1;
- 在 ERASE 位被置 1 的同時(shí),如果待擦除的區(qū)域(PNB[7:0])超出了
Flash 的有效空間,則不會(huì)啟動(dòng)擦除操作,錯(cuò)誤標(biāo)志 PESERR 將置 1;
- 當(dāng)有錯(cuò)誤標(biāo)志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時(shí),配置 ERASE 位置 1,則不會(huì)啟動(dòng)擦除操作,錯(cuò)誤標(biāo)志PESERR 將置 1;
- ERASE、OPTSTRT、OBL_LAUNCH 中任意 2 個(gè)以上控制位同時(shí)置 1,
則不會(huì)啟動(dòng)對(duì)應(yīng)的操作,錯(cuò)誤標(biāo)志 PESERR 將置 1。
l 寫保護(hù)錯(cuò)誤標(biāo)志 WRPERR:
- 如果要擦除的區(qū)域受到安全保護(hù)機(jī)制的影響,包含有受保護(hù)的區(qū)域,
則不會(huì)啟動(dòng)擦除操作,F(xiàn)LASH_SR 寄存器中的 WRPERR 標(biāo)志將置 1。
5.3.6 User flash 區(qū)編程操作
對(duì) Flash 存儲(chǔ)器執(zhí)行編程操作,每次能寫入的數(shù)據(jù)長度固定為 32bits(字),不支持其他長度的數(shù)據(jù)寫入。
FLASH 存儲(chǔ)器在執(zhí)行編程操作時(shí),不能同時(shí)進(jìn)行讀取操作,需要等待存儲(chǔ)器完成編程操作后,讀取操作才能正常進(jìn)行。
與 Flash 擦除操作類似,編程操作也會(huì)受到安全保護(hù)機(jī)制的影響:
5.3.6.1 User flash 區(qū)編程操作步驟
對(duì) User flash 區(qū)進(jìn)行編程操作,可遵循以下步驟:
1) 檢查 Flash 狀態(tài)寄存器(FLASH_SR)中的 BSY 標(biāo)志,以確認(rèn)當(dāng)前沒有正在執(zhí)行的 Flash 操作;
2) 檢查 FLASH_SR 寄存器,確認(rèn)錯(cuò)誤標(biāo)志均已清除;
3) 解鎖 Flash 控制寄存器(FLASH_CR),使 LOCK 位清 0(詳見:Flash 控制寄存器解鎖);
4) 配置 FLASH_CR 寄存器中的 PG_MODE 為 1,進(jìn)入 Flash 編程模式;
5) 向 Flash 目標(biāo)地址寫入 32bits 數(shù)據(jù),寫入后 BSY 標(biāo)志將自動(dòng)置 1;
6) 查詢并等待 BSY 標(biāo)志清 0,表明編程操作已完成;7) 如果要對(duì)多個(gè)地址進(jìn)行編程,可重復(fù)步驟 5 和 6;
8) 配置 FLASH_CR 寄存器中的 PG_MODE 位為 0,退出 Flash 編程模式;
9) 配置 FLASH_CR 寄存器中的 LOCK 位置 1,恢復(fù) FLASH_CR 寄存器的寫保護(hù)鎖定狀態(tài)。
5.3.6.2 User flash 區(qū)編程錯(cuò)誤
在對(duì) User flash 區(qū)進(jìn)行編程操作的過程中,可能會(huì)出現(xiàn)以下錯(cuò)誤標(biāo)志:
l 編程錯(cuò)誤標(biāo)志 PROGERR:
- 當(dāng) Flash 地址內(nèi)的數(shù)據(jù)不是 0xFFFF FFFF 時(shí),表明該地址已經(jīng)執(zhí)行過
編程操作,向該地址寫入數(shù)據(jù),則寫入的數(shù)據(jù)會(huì)被忽略,不會(huì)啟動(dòng)編
程操作,錯(cuò)誤標(biāo)志 PROGERR 將置 1;
- 當(dāng) PG_MODE 位為 0 時(shí),向 Flash 地址寫入數(shù)據(jù),則寫入的數(shù)據(jù)會(huì)被
忽略,不會(huì)啟動(dòng)編程操作,錯(cuò)誤標(biāo)志 PROGERR 將置 1;
- 當(dāng)有錯(cuò)誤標(biāo)志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時(shí),向 Flash 地址寫入數(shù)據(jù),則寫入的數(shù)據(jù)會(huì)被忽略,不會(huì)啟動(dòng)編程操作,錯(cuò)誤標(biāo)志 PROGERR 將置 1。
l 編程位寬錯(cuò)誤標(biāo)志 SIZERR:
- 如果向 Flash 地址寫入字節(jié)或半字,則寫入的數(shù)據(jù)會(huì)被忽略,不會(huì)啟
動(dòng)編程操作,錯(cuò)誤標(biāo)志 SIZERR 將置 1。
l 編程地址未對(duì)齊錯(cuò)誤標(biāo)志 PGAERR:
- 如果編程操作的目標(biāo)地址沒有按字對(duì)齊(地址 2 位不為 b00),則
寫入的數(shù)據(jù)會(huì)被忽略,不會(huì)啟動(dòng)編程操作,錯(cuò)誤標(biāo)志 PGAERR 將置 1。
l 寫保護(hù)錯(cuò)誤標(biāo)志 WRPERR:
- 如果要編程的區(qū)域受到安全保護(hù)機(jī)制的影響,處于受保護(hù)的狀態(tài),向
該區(qū)域中的地址寫入數(shù)據(jù),則寫入的數(shù)據(jù)會(huì)被忽略,不會(huì)啟動(dòng)編程操
作,錯(cuò)誤標(biāo)志 WRPERR 將置 1。
5.4 Option bytes 區(qū)操作說明
5.4.1 選項(xiàng)字節(jié)組成
選項(xiàng)字節(jié)存放于 Flash 存儲(chǔ)器的 Option bytes 區(qū),用于保存與芯片硬件功能相關(guān)的配置項(xiàng),用戶可根據(jù)應(yīng)用對(duì)選項(xiàng)字節(jié)進(jìn)行配置,以實(shí)現(xiàn)特定的硬件功能。
為了校驗(yàn)選項(xiàng)字節(jié)的正確性,在 Option bytes 區(qū)的每個(gè)字(32bits)被拆分成兩
部分,低 16bits 存放選項(xiàng)字節(jié),高 16bits 存放選項(xiàng)字節(jié)的反碼。
復(fù)位后,硬件會(huì)自動(dòng)將 Option bytes 區(qū)中的內(nèi)容,加載到寄存器里,這些寄存器被稱為選項(xiàng)字節(jié)加載寄存器,選項(xiàng)字節(jié)中各控制位的作用,可查看以下寄存器的詳細(xì)描述:
l FLASH_OPTR1:選項(xiàng)字節(jié)寄存器 1
l FLASH_OPTR2:選項(xiàng)字節(jié)寄存器 2
l FLASH_PCROP1AS:代碼讀出保護(hù)區(qū) 1A 起始地址寄存器
l FLASH_PCROP1AE:代碼讀出保護(hù)區(qū) 1A 結(jié)束地址寄存器
l FLASH_PCROP1BS:代碼讀出保護(hù)區(qū) 1B 起始地址寄存器
l FLASH_PCROP1BE:代碼讀出保護(hù)區(qū) 1B 結(jié)束地址寄存器
l FLASH_WRP1AS:寫保護(hù)區(qū) A 起始地址寄存器
l FLASH_WRP1AE:寫保護(hù)區(qū) A 結(jié)束地址寄存器
l FLASH_WRP1BS:寫保護(hù)區(qū) B 起始地址寄存器
l FLASH_WRP1BE:寫保護(hù)區(qū) B 結(jié)束地址寄存器
l FLASH_SECR:用戶安全配置寄存器
5.4.2 選項(xiàng)字節(jié)更新
Option bytes 區(qū)與 User flash 區(qū)不同,用戶不能直接對(duì) Option bytes 區(qū)執(zhí)行擦除或編程操作,而是要通過對(duì)應(yīng)的選項(xiàng)字節(jié)加載寄存器進(jìn)行更新。
對(duì)選項(xiàng)字節(jié)的更新遵循以下步驟:
1) 檢查 Flash 狀態(tài)寄存器(FLASH_SR)中的 BSY 標(biāo)志位,以確認(rèn)當(dāng)前沒有正在執(zhí)行的 Flash 操作;
2) 檢查 FLASH_SR 寄存器,確認(rèn)錯(cuò)誤標(biāo)志均已清除;
3) 解鎖 Flash 選項(xiàng)字節(jié)的寫保護(hù),使 Flash 控制寄存器(FLASH_CR)中的
OPTLOCK 位清 0(詳見:Flash 選項(xiàng)字節(jié)解鎖);
4) 配置 FLASH_CR 寄存器中的 PG_MODE 為 1,進(jìn)入 Flash 編程模式;
5) 配置選項(xiàng)字節(jié)加載寄存器;
6) 將 FLASH_CR 寄存器中的 OPTSTRT 位置 1,啟動(dòng)選項(xiàng)字節(jié)的更新,同時(shí)BSY 標(biāo)志將自動(dòng)置 1;
7) 查詢并等待 BSY 標(biāo)志清 0,表明選項(xiàng)字節(jié)已更新完成,此時(shí) OPTSTRT 位也將被自動(dòng)清 0;
8) 配置 FLASH_CR 寄存器中的 PG_MODE 位為 0,退出 Flash 編程模式;
9) 配置 FLASH_CR 寄存器中的 OPTLOCK 位置 1,恢復(fù)選項(xiàng)字節(jié)的寫保護(hù)鎖定狀態(tài);
10) 此時(shí) FLASH_CR 寄存器處于解鎖狀態(tài),可根據(jù)需要配置 FLASH_CR 寄存器中的 LOCK 位置 1,將其恢復(fù)成寫保護(hù)鎖定狀態(tài)。
在啟動(dòng)選項(xiàng)字節(jié)更新后,將對(duì) Option bytes 區(qū)進(jìn)行擦除,并自動(dòng)生成選項(xiàng)字節(jié)的反碼,隨后會(huì)將選項(xiàng)字節(jié)及其反碼更新到 Option bytes 區(qū)。
在完成對(duì)選項(xiàng)字節(jié)的更新后,直接讀取 Option bytes 區(qū),可獲取更新后的選項(xiàng)字節(jié)值。但是更新后的選項(xiàng)字節(jié)此時(shí)并未生效,如果讀取選項(xiàng)字節(jié)加載寄存器,獲得的仍將是最近一次已加載生效的選項(xiàng)字節(jié)值。在對(duì)選項(xiàng)字節(jié)進(jìn)行更新的過程中,可能會(huì)出現(xiàn)以下錯(cuò)誤標(biāo)志:
l Flash 操作序列錯(cuò)誤標(biāo)志 PESERR:
- 在 OPTSTRT 位被置 1 的同時(shí),如果 PG_MODE 位為 0,則不會(huì)啟動(dòng)
選項(xiàng)字節(jié)更新,錯(cuò)誤標(biāo)志 PESERR 將置 1;
- 當(dāng)有錯(cuò)誤標(biāo)志(PESERR、PROGERR、SIZERR、PGAERR、WRPERR)
未被清除時(shí),配置 OPTSTRT 位置 1,則不會(huì)啟動(dòng)選項(xiàng)字節(jié)更新,錯(cuò)誤
標(biāo)志 PESERR 將置 1;
- ERASE、OPTSTRT、OBL_LAUNCH 中任意 2 個(gè)以上控制位同時(shí)置 1,
則不會(huì)啟動(dòng)對(duì)應(yīng)的操作,錯(cuò)誤標(biāo)志 PESERR 將置 1。
5.4.3 選項(xiàng)字節(jié)加載
要使 Option bytes 區(qū)中選項(xiàng)字節(jié)生效,可通過以下方式對(duì)選項(xiàng)字節(jié)進(jìn)行加載:
l 以下復(fù)位將觸發(fā)加載:
- POR/PDR 復(fù)位
- 退出 Standby 模式復(fù)位
l 配置 FLASH_CR 寄存器中 OBL_LAUNCH 位為 1 啟動(dòng)加載,加載執(zhí)行時(shí)BSY 標(biāo)志將自動(dòng)置 1,加載完成后該標(biāo)志將自動(dòng)清 0 并觸發(fā)系統(tǒng)復(fù)位。
如果 ERASE、OPTSTRT、OBL_LAUNCH 中任意 2 個(gè)以上控制位同時(shí)置 1,則不會(huì)啟動(dòng)對(duì)應(yīng)的操作,錯(cuò)誤標(biāo)志 PESERR 將置 1。
在選項(xiàng)字節(jié)加載過程中,將自動(dòng)對(duì)選項(xiàng)字節(jié)及其反碼進(jìn)行校驗(yàn),如果出現(xiàn)錯(cuò)誤,將維持復(fù)位狀態(tài)不再執(zhí)行任何操作,直到發(fā)生 POR/PDR 復(fù)位。
當(dāng)選項(xiàng)字節(jié)加載生效后,Option bytes 區(qū)中的選項(xiàng)字節(jié)將被自動(dòng)復(fù)制到對(duì)應(yīng)的加載寄存器。讀取選項(xiàng)字節(jié)加載寄存器,獲得的總是加載生效后的選項(xiàng)字節(jié)值。
5.5 Flash 安全保護(hù)機(jī)制
Flash 存儲(chǔ)器支持以下安全保護(hù)機(jī)制:
l Flash 讀出保護(hù)(RDP):通過配置不同 RDP 保護(hù)等級(jí),對(duì)存儲(chǔ)器的操作權(quán)限進(jìn)行限制。
l Flash 代碼讀出保護(hù)(PCROP):禁止對(duì)受保護(hù)的區(qū)域執(zhí)行讀取、編程或擦
除操作,僅允許取指操作。
l Flash 寫入保護(hù)(WRP):禁止對(duì)受保護(hù)的區(qū)域執(zhí)行編程或擦除操作,但允
許取指和讀取操作。
l Flash 用戶安全區(qū)域:在復(fù)位后,用戶安全區(qū)域處于未保護(hù)狀態(tài),可執(zhí)行
取指、讀取、編程和擦除操作。當(dāng)安全區(qū)域使能后,該區(qū)域不可見,禁止
對(duì)該區(qū)域執(zhí)行任何操作,直到重新復(fù)位。
5.5.1 Flash 讀出保護(hù)
5.5.1.1 RDP 保護(hù)權(quán)限
Flash 讀出保護(hù)(RDP),共有三種保護(hù)等級(jí):
RDP0:
l 從 User flash/SRAM 啟動(dòng)
- User flash 區(qū):允許取指、讀取、編程、擦除
- System memory 區(qū):僅允許取指
- Option bytes 區(qū):允許讀取、更新(通過選項(xiàng)字節(jié)加載寄存器)
- OTP 區(qū):允許讀取、編程(每個(gè)字僅可編程一次)
- 備份寄存器:允許讀取、寫入
l 從 Bootloader 啟動(dòng)
- User flash 區(qū):允許取指、讀取、編程、擦除
- System memory 區(qū):允許取指、讀取
- Option bytes 區(qū):允許讀取、更新(通過選項(xiàng)字節(jié)加載寄存器)
- OTP 區(qū):禁止執(zhí)行任何操作
- 備份寄存器:禁止執(zhí)行任何操作
l 調(diào)試接口
- User flash 區(qū):允許取指、讀取、編程、擦除
- System memory 區(qū):僅允許取指
- Option bytes 區(qū):允許讀取、更新(通過選項(xiàng)字節(jié)加載寄存器)
- OTP 區(qū):允許讀取、編程(每個(gè)字僅可編程一次)
- 備份寄存器:允許讀取、寫入
注意: 從 Bootloader 啟動(dòng)時(shí),禁用調(diào)試接口。
RDP1:
l 從 User flash 啟動(dòng)
- User flash 區(qū):允許取指、讀取、編程、擦除
- System memory 區(qū):僅允許取指
- Option bytes 區(qū):允許讀取、更新(通過選項(xiàng)字節(jié)加載寄存器)
- OTP 區(qū):允許讀取、編程(每個(gè)字僅可編程一次)
- 備份寄存器:允許讀取、寫入
l 從 Bootloader 啟動(dòng)
- User flash 區(qū):僅允許取指
- System memory 區(qū):允許讀取、取指
- Option bytes 區(qū):允許讀取、更新(通過選項(xiàng)字節(jié)加載寄存器)
- OTP 區(qū):禁止執(zhí)行任何操作
- 備份寄存器:禁止執(zhí)行任何操作
l 禁止從 SRAM 啟動(dòng)
l 禁用調(diào)試接口
RDP2:
l 從 User flash 啟動(dòng)
- User flash 區(qū):允許取指、讀取、編程、擦除
- System memory 區(qū):僅允許取指
- Option bytes 區(qū):僅允許讀取-
OTP 區(qū):允許讀取、編程(每個(gè)字僅可編程一次)
- 備份寄存器:允許讀取、寫入
l 禁止從 Bootloader 啟動(dòng)
l 禁止從 SRAM 啟動(dòng)
l 禁用調(diào)試接口
對(duì)于 Flash 存儲(chǔ)器,當(dāng) Flash 控制器檢測(cè)到無權(quán)限的非法操作時(shí),F(xiàn)LASH_SR 寄 存器中的 ACERR 錯(cuò)誤標(biāo)志將立刻置 1,非法操作會(huì)被立刻終止,并產(chǎn)生總線訪 問錯(cuò)誤,觸發(fā) HardFault 中斷。
對(duì) Option bytes 區(qū)的更新,必須通過相應(yīng)的選項(xiàng)字節(jié)加載寄存器來完成。當(dāng)保護(hù)等級(jí)為 RDP2 時(shí),不允許更新該區(qū)域,此時(shí)如果 FLASH_CR 寄存器中的
OPTSTRT 位被置 1,則 FLASH_SR 寄存器中的 ACERR 錯(cuò)誤標(biāo)志將置 1,對(duì) Option bytes 區(qū)的操作將被終止,并產(chǎn)生總線訪問錯(cuò)誤,觸發(fā) HardFault 中斷。
沈陽芯碩科技有限公司是華大電子專業(yè)代理商,有技術(shù)問題可咨詢芯虎論壇.