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