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