STM8 選項(xiàng)字節(jié)的寫(xiě)入
STM8的EEPROM在復(fù)位后,要想要寫(xiě)入數(shù)據(jù),必須先解鎖,必然無(wú)法寫(xiě)入數(shù)據(jù)。解鎖就是向 FLASH_DUKR 中先后寫(xiě)入:
第一個(gè)硬件秘鑰:0xAE
第二個(gè)硬件秘鑰:0x56
兩個(gè)字節(jié)的數(shù)據(jù)。
此時(shí)FLASH_IAPSR 中的 DUL 位將會(huì)變?yōu)?,表示 EEPROM 已經(jīng)成功解鎖,可以進(jìn)行寫(xiě)入操作了。如果發(fā)現(xiàn) DUL 位不為 1 ,是可以按順序重復(fù)寫(xiě)入秘鑰的,直到 DUL 位為 1 為止。
但手冊(cè)上是這么說(shuō)的:
中文手冊(cè):
2. 如果密鑰輸入錯(cuò)誤,應(yīng)用程序可以嘗試重新輸入這兩個(gè)MASS密鑰來(lái)對(duì)DATA區(qū)域進(jìn)行解
鎖。
4. 如果密鑰輸入錯(cuò)誤,DATA EEPROM區(qū)域在下一次系統(tǒng)復(fù)位之前將一直保持寫(xiě)保護(hù)狀態(tài)。
在下一次復(fù)位前,再向該寄存器進(jìn)行的任何寫(xiě)操作都會(huì)被系統(tǒng)忽略掉。
英文手冊(cè):
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.
這些說(shuō)明,給人的感覺(jué)是:如果第一個(gè)秘鑰輸入錯(cuò)誤,那么可以重復(fù)輸入,直到解鎖,但如果第一個(gè)秘鑰輸入正確,而第二個(gè)秘鑰輸入錯(cuò)誤,則將永久鎖定,任何對(duì)該寄存器的寫(xiě)入操作都會(huì)被忽略掉,直到復(fù)位后下一次解鎖前。
事實(shí)上,我經(jīng)過(guò)試驗(yàn),無(wú)論第一個(gè)秘鑰錯(cuò)誤,還是第二個(gè)秘鑰錯(cuò)誤,均可以重復(fù)操作直到解鎖為止。
這里要注意的是,2個(gè)密鑰的順序,與STM8的用戶手冊(cè)上是相反的,如果按照手冊(cè)上的順序,就會(huì)停留在do…while循環(huán)中。具體原因,也不是很清楚,也可能是我拿到的手冊(cè)(中文和英文的都一樣)太舊了,或者是理解有誤。
注:
參考資料說(shuō)的解鎖順序的問(wèn)題:
我們來(lái)看看官方給的庫(kù)函數(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時(shí)的順序是不一樣的,中文手冊(cè)上沒(méi)體現(xiàn)這一點(diǎn)。當(dāng)然我們要做的就是直接拿官方的庫(kù)來(lái)用就行了?。?/p>





