STM8 存儲FLASH、EEPROM、存儲保護
STM8內(nèi)部的FLASH程序存儲器和數(shù)據(jù)EEPROM由一組通用寄存器來控制。用戶可以使用這些寄存器來編程或擦除存儲器的內(nèi)容、設(shè)置寫保護、或者配置特定的低功耗模式。用戶也可以對器件的選項字節(jié)(Option byte)進行編程。
本文引用地址:http://m.butianyuan.cn/article/201611/316699.htm- STM8S EEPROM分為兩個存儲器陣列:
- 最多至 128K字節(jié)的FLASH程序存儲器,不同的器件容量有所不同。請參考4.4存儲器組織結(jié)構(gòu)了解更多細節(jié)。
- 最多至 2K字節(jié)的數(shù)據(jù)EEPROM(包括option byte-選擇字節(jié)),不同的器件容量有所不同。請參考4.4存儲器組織結(jié)構(gòu)了解更多細節(jié)。
- 編程模式
- 字節(jié)編程和自動快速字節(jié)編程(沒有擦除操作)
- 字編程
- 塊編程和快速塊編程(沒有擦除操作)
- 在編程/擦除操作結(jié)束時和發(fā)生非法編程操作時產(chǎn)生中斷
- 讀同時寫(RWW)功能。該特性并不是所有STM8S器件都擁有。請參考ATM8具體的數(shù)據(jù)手冊了解更多細節(jié)。
- 在應(yīng)用編程(IAP)和在線編程(ICP)能力。
- 保護特性
- 存儲器讀保護(ROP)
- 基于存儲器存取安全系統(tǒng)(MASS密鑰)的程序存儲器寫保護
- 基于存儲器存取安全系統(tǒng)(MASS密鑰)的數(shù)據(jù)存儲器寫保護
- 可編程的用戶啟動代碼區(qū)域(UBC)寫保護
- 在待機(Halt)模式和活躍待機(Active-halt)模式下,存儲器可配置為運行狀態(tài)和掉電狀態(tài)。
存儲器組織結(jié)構(gòu)
STM8S的EEPROM以32位字長(每字4字節(jié))為基礎(chǔ)組織起來。根據(jù)不同的器件,存儲器組織機 構(gòu)有所不同:
- 小容量STM8S器件
- 8K FLASH程序存儲器,每頁 64字節(jié),共 128頁
- 640字節(jié)數(shù)據(jù) EEPROM,每頁 64字節(jié),共 10頁。數(shù)據(jù) EEPROM包括一頁的選項字節(jié)(64字節(jié))。
- 中容量STM8S器件
- 從 16K到 32K FLASH程序存儲器,每頁 512字節(jié),最多 64頁
- 1K字節(jié)數(shù)據(jù)EEPROM,每頁 512字節(jié),共 2頁。數(shù)據(jù) EEPROM包括一頁的選項字節(jié)(512字節(jié))。
- 大容量STM8S器件
- 從 64K到 128K FLASH程序存儲器,每頁 512字節(jié),最多 256頁
- 從 1K到 2K字節(jié)數(shù)據(jù) EEPROM,每頁 512字節(jié),共 4頁。數(shù)據(jù) EEPROM包括一頁的選項字節(jié)(512字節(jié))。
頁的大小定義了用戶啟動代碼區(qū)域(UBC)大小的最小可調(diào)整值。請參考4.4.1用戶啟動區(qū)域 (UBC)。 圖3和圖4展示了STM8S系列FLASH存儲器和數(shù)據(jù)EEPROM的組織機構(gòu)。
用戶啟動區(qū)域(UBC)
用戶啟動區(qū)域(UBC)包含有復(fù)位和中斷向量表,它可用于存儲IAP及通訊程序。UBC有一個兩級保護結(jié)構(gòu)可保護用戶代碼及數(shù)據(jù)在IAP編程中免于無意的擦除或修改。這意味著該區(qū)域總是寫保護的,而且寫保護不能通過使用MASS密鑰來解鎖。
在ICP模式下(使用SWIM接口)可以通過修改選項字節(jié)來配置UBC的大小。UBC選項字節(jié)指定了分配在UBC中的頁的數(shù)量。UBC區(qū)域的起始地址是0x00 8000。 可以通過讀取UBC選項字節(jié)來獲得UBC區(qū)域的大小。請參考圖6,圖7和圖8來了解UBC區(qū)域的存儲器映射。對于選項字節(jié)部分,請參考相應(yīng)的數(shù)據(jù)手冊了解更多的UBC選項字節(jié)的細節(jié)。
2. 頭兩頁(128字節(jié))包含中斷向量表。
1. UBC[7:0]=0x00意味著沒有定義用戶啟動區(qū)域。請參考相應(yīng)的數(shù)據(jù)手冊了解UBC選項字節(jié)的細節(jié)。
2. 頭兩頁(1K字節(jié))包含中斷向量表。中斷向量表只占用128字節(jié)(32個中斷向量)。
2. 頭兩頁(1K字節(jié))包含中斷向量表。中斷向量表只占用128字節(jié)(32個中斷向量)。
存儲器保護
讀保護
當(dāng)選項字節(jié)中的ROP字節(jié)被編程為0xAA時,讀保護就生效了。這種情況下,無論寫保護是否生效,在ICP模式中(使用SWIM接口)讀取或修改FLASH程序存儲器和DATA區(qū)域都是被禁止的。即使認為沒有什么保護是完全不可破解的,對于一個通用微處理器來說,STM8的讀保護的特性也提供了一個非常高水平的保護級別。可以在ICP模式中通過對選項字節(jié)中的ROP字節(jié)重新編程來解除程序存儲器、UBC和DATA區(qū)域的讀保護。在這種情況下,程序存儲器、UBC、DATA區(qū)域以及選項字節(jié)都被自動擦除,器件也可以被重新編程了。
存儲器存取安全系統(tǒng)(MASS)
STM8在復(fù)位以后,主程序和DATA區(qū)域都被自動保護以防止無意的寫操作。在試圖修改其內(nèi)容前必須對其解鎖,而解鎖的機制由存儲器存取安全系統(tǒng)(MASS)來管理。UBC區(qū)域的特性指明了在UBC中的內(nèi)容一直是寫保護的一旦存儲器內(nèi)容被修改完畢,推薦將寫保護使能以防止數(shù)據(jù)被破壞。
對主程序存儲器的寫操作
在器件復(fù)位后,可以通過向FLASH_PUKR寄存器連續(xù)寫入兩個被叫作MASS密鑰的值來解除主程序存儲器的寫保護。這兩個寫人FLASH_PUKR的值會和下兩個硬件密鑰相比較:
● 第一個硬件密鑰:0b0101 0110 (0x56)
● 第二個硬件密鑰:0b1010 1110 (0xAE)
需要通過如下步驟來解除主程序存儲器區(qū)域的寫保護:
向FLASH_PUKR寫入第一個8位密鑰。在系統(tǒng)復(fù)位后,當(dāng)這個寄存器被首次寫入值時,數(shù)據(jù)總線上的值沒有被直接鎖存到這個寄存器中,而是和第一個硬件密鑰值(0x56)相比較。
如果密鑰輸入錯誤,F(xiàn)LASH_PUKR寄存器在下一次系統(tǒng)復(fù)位之前將一直被鎖住。在下一次復(fù)位前,再向該寄存器進行的任何寫操作都會被系統(tǒng)忽略掉。
如果第一個硬件密鑰正確,當(dāng)這個寄存器被第二次寫入值時,數(shù)據(jù)總線上的值沒有被直接鎖存到這個寄存器中,而是和第二個硬件密鑰值(0xAE)相比較。
如果密鑰輸入錯誤,F(xiàn)LASH_PUKR寄存器在下一次系統(tǒng)復(fù)位之前將一直被鎖住。在下一次復(fù)位前,再向該寄存器進行的任何寫操作都會被系統(tǒng)忽略掉。
如果第二個硬件密鑰正確,主程序存儲器寫保護被解除,同時FLASH_IAPSR中的PUL位為1。
在開始編程之前,應(yīng)用程序可以校驗PUL位是否被有效地置1。應(yīng)用程序可以在任意時刻通過清PUL位來重新禁止對FLASH程序區(qū)域的寫操作。
對DATA區(qū)域的寫操作
在STM8復(fù)位后,可以通過向FLASH_DUKR寄存器連續(xù)寫入兩個被叫作MASS密鑰的值來解除DATA區(qū)域的寫保護。這兩個寫入FLASH_DUKR的值會和以下兩個硬件密鑰值相比:
● 第一個硬件密鑰:0b0101 0110 (0x56)
● 第二個硬件密鑰:0b1010 1110 (0xAE)
需要通過如下步驟來解除數(shù)據(jù)區(qū)域的寫保護:
向FLASH_DUKR寫入第一個8位密鑰。在系統(tǒng)復(fù)位后,當(dāng)這個寄存器被首次寫入值時,數(shù)據(jù)總線上的值沒有被直接鎖存到這個存儲器中,而是和第一個硬件密鑰值(0x56)相比較。
如果密鑰輸入錯誤,應(yīng)用程序可以嘗試重新輸入這兩個MASS密鑰來對DATA區(qū)域進行解鎖。
如果第一個硬件密鑰正確,當(dāng)這個寄存器被第二次寫入值時,數(shù)據(jù)總線上的值沒有被直接鎖存到這個寄存器中,而是和第二個硬件密鑰值(0xAE)相比較。
如果密鑰輸入錯誤,DATA EEPROM區(qū)域在下一次系統(tǒng)復(fù)位之前將一直保持寫保護狀態(tài)。在下一次復(fù)位前,再向該寄存器進行的任何寫操作都會被系統(tǒng)忽略。
如果第二個硬件密鑰正確,DATA區(qū)域的寫保護被解除,同時FLASH_IAPSR中的DUL位為1。
在開始編程之前,應(yīng)用程序可以通過校驗DUL位是否被有效地置1來確認DATA區(qū)域已經(jīng)將寫保護解鎖。應(yīng)用程序可以在任意時刻通過清空DUL位來重新禁止對DATA區(qū)域的寫操作。
對選項字節(jié)的寫操作的步驟和對DATA EEPROM的操作大致相同。但是要注意到FLASH_CR2中的OPT位要位1以及FLASH_NCR中的NOPT位要為0,這樣才可以對選項字節(jié)進行寫操作。
評論