STM8的EEPROM在復位后,要想要寫入數(shù)據(jù),必須先解鎖,必然無法寫入數(shù)據(jù)。解鎖就是向 FLASH_DUKR 中先后寫入:
第一個硬件秘鑰:0xAE
第二個硬件秘鑰:0x56
兩個字節(jié)的數(shù)據(jù)。
此時FLASH_IAPSR 中的 DUL 位將會變?yōu)?,表示 EEPROM 已經(jīng)成功解鎖,可以進行寫入操作了。如果發(fā)現(xiàn) DUL 位不為 1 ,是可以按順序重復寫入秘鑰的,直到 DUL 位為 1 為止。
但手冊上是這么說的:
中文手冊:
2. 如果密鑰輸入錯誤,應用程序可以嘗試重新輸入這兩個MASS密鑰來對DATA區(qū)域進行解
鎖。
4. 如果密鑰輸入錯誤,DATA EEPROM區(qū)域在下一次系統(tǒng)復位之前將一直保持寫保護狀態(tài)。
在下一次復位前,再向該寄存器進行的任何寫操作都會被系統(tǒng)忽略掉。
英文手冊:
2. If the key available on the data bus is incorrect, the FLASH_PUKR register remains
locked until the next reset. Any new write commands sent to this address are
discarded.
4. If the key available on the data bus is incorrect, the data EEPROM area remains write
protected until the next reset. Any new write command sent to this address is ignored.
這些說明,給人的感覺是:如果第一個秘鑰輸入錯誤,那么可以重復輸入,直到解鎖,但如果第一個秘鑰輸入正確,而第二個秘鑰輸入錯誤,則將永久鎖定,任何對該寄存器的寫入操作都會被忽略掉,直到復位后下一次解鎖前。
事實上,我經(jīng)過試驗,無論第一個秘鑰錯誤,還是第二個秘鑰錯誤,均可以重復操作直到解鎖為止。
這里要注意的是,2個密鑰的順序,與STM8的用戶手冊上是相反的,如果按照手冊上的順序,就會停留在do…while循環(huán)中。具體原因,也不是很清楚,也可能是我拿到的手冊(中文和英文的都一樣)太舊了,或者是理解有誤。
注:
參考資料說的解鎖順序的問題:
我們來看看官方給的庫函數(shù)stm8s_flash.c文件中
void FLASH_Unlock(FLASH_MemType_TypeDef MemType)
{
/* Check parameter */
assert_param(IS_MEMORY_TYPE_OK(MemType));
/* Unlock program memory */
if (MemType == FLASH_MEMTYPE_PROG)
{
FLASH->PUKR = FLASH_RASS_KEY1;//KEY1:0x56
FLASH->PUKR = FLASH_RASS_KEY2;//KEY2:0xAE
}
/* Unlock data memory */
else
{
FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */
FLASH->DUKR = FLASH_RASS_KEY1;
}
}
從上面的函數(shù)可以看到解鎖FLASH和DATA EEPROM時的順序是不一樣的,中文手冊上沒體現(xiàn)這一點。當然我們要做的就是直接拿官方的庫來用就行了??!