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