寫在前面 Ⅰ
我們都知道FLASH和EEPROM這兩種存儲(chǔ)器,但是大部分人了解的都是專門的FLASH和EEPROM芯片,如:W25Q16和ATAT24C08(外部)儲(chǔ)存芯片。
外部存儲(chǔ)芯片和本文說的內(nèi)部FLASH和EEPROM最大的區(qū)別就是在于:內(nèi)部FLASH和EEPROM是不需要SPI、I2C等進(jìn)行操作,也就是說同等情況下,內(nèi)部FLASH和EEPROM的讀寫要快一點(diǎn)。
STM8的FLASH除了儲(chǔ)存程序代碼之外,就是用于用戶編程(存儲(chǔ)數(shù)據(jù)),不像之前的51芯片不能利用內(nèi)部?jī)?chǔ)存代碼的FLASH。
為方便大家閱讀,本文內(nèi)容已經(jīng)整理成PDF文件:
http://pan.baidu.com/s/1i5uWhJR
片內(nèi)FLASH和EEPROM基礎(chǔ)知識(shí) Ⅱ
STM8內(nèi)部的FLASH程序存儲(chǔ)器和數(shù)據(jù)EEPROM由一組通用寄存器來控制。用戶可以使用這些寄存器來編程或擦除存儲(chǔ)器的內(nèi)容、設(shè)置寫保護(hù)、或者配置特定的低功耗模式。用戶也可以對(duì)器件的選項(xiàng)字節(jié)(Option byte)進(jìn)行編程。
1.關(guān)于存儲(chǔ)的名詞
塊(BLOCK):一個(gè)塊是指可由一個(gè)簡(jiǎn)單編程操作編程或擦除的一組字節(jié)。塊級(jí)的操作非常快,是標(biāo)準(zhǔn)的編程和擦除操作。請(qǐng)參考表4來了解塊的大小。
頁(PAGE):一頁由一組塊組成。 STM8S 器件擁有啟動(dòng)代碼,程序代碼和數(shù)據(jù)EEPROM,這些區(qū)域都由特定的結(jié)構(gòu)所保護(hù)。通過對(duì)特定的選項(xiàng)字節(jié)進(jìn)行操作,這些區(qū)域的大小能夠以頁為單位來進(jìn)行調(diào)整。
2.主要特性
● STM8S分為兩個(gè)存儲(chǔ)器陣列:
─ 最多至 128K字節(jié)的FLASH程序存儲(chǔ)器,不同的器件容量有所不同。
─ 最多至 2K字節(jié)的數(shù)據(jù)EEPROM(包括option byte-選擇字節(jié)),不同的器件容量有所不同。
● 編程模式
─ 字節(jié)編程和自動(dòng)快速字節(jié)編程(沒有擦除操作)
─ 字編程
─ 塊編程和快速塊編程(沒有擦除操作)
─ 在編程/擦除操作結(jié)束時(shí)和發(fā)生非法編程操作時(shí)產(chǎn)生中斷
● 讀同時(shí)寫(RWW)功能。該特性并不是所有STM8S器件都擁有。請(qǐng)參考具體的數(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)。
3.存儲(chǔ)器組織結(jié)構(gòu)
STM8S的EEPROM以32位字長(每字4字節(jié))為基礎(chǔ)組織起來。根據(jù)不同的器件,存儲(chǔ)器組織機(jī)構(gòu)有所不同:
●小容量STM8S器件
─ 8K FLASH 程序存儲(chǔ)器,每頁 64 字節(jié),共 128 頁
─ 640 字節(jié)數(shù)據(jù) EEPROM,每頁 64 字節(jié),共 10 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(64字節(jié))。
●中容量STM8S器件
─ 從 16K 到 32K FLASH 程序存儲(chǔ)器,每頁 512 字節(jié),最多64頁
─ 1K 字節(jié)數(shù)據(jù) EEPROM,每頁 512 字節(jié),共 2 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(512 字節(jié))。
●大容量STM8S器件
─ 從 64K 到 128K FLASH 程序存儲(chǔ)器,每頁 512 字節(jié),最多256頁
─ 從 1K 到 2K 字節(jié)數(shù)據(jù) EEPROM,每頁 512 字節(jié),共 4 頁。數(shù)據(jù) EEPROM 包括一頁的選項(xiàng)字節(jié)(512 字節(jié))。
4.存儲(chǔ)器編程
在嘗試執(zhí)行任何編程操作之前,必須對(duì)主程序存儲(chǔ)器FLASH和DATA區(qū)域解鎖。
編程分類:字節(jié)編程、字編程、塊編程和選項(xiàng)字節(jié)編程。
字節(jié)編程
可以對(duì)主程序存儲(chǔ)器和DATA區(qū)域逐字節(jié)地編程。要對(duì)一個(gè)字節(jié)編程,應(yīng)用程序可直接向目標(biāo)地址寫入數(shù)據(jù)。
● 在主程序存儲(chǔ)器中
當(dāng)字節(jié)編程操作執(zhí)行時(shí),應(yīng)用程序停止運(yùn)行。
● 在DATA區(qū)域中
─ 有 RWW 功能的器件:在 IAP 模式下,應(yīng)用程序不停止運(yùn)行,字節(jié)編程進(jìn)行操作。
─ 無 RWW 功能的器件:當(dāng)字節(jié)編程操作執(zhí)行時(shí),應(yīng)用程序停止運(yùn)行。
要擦除一個(gè)字節(jié),向?qū)?yīng)的字節(jié)簡(jiǎn)單寫入’0x00即可。
應(yīng)用程序可以通過讀FLASH_IAPSR寄存器來校驗(yàn)編程或擦除操作是否已被正確執(zhí)行:
● 在一次成功的編程操作后EOP位被置1。
● 當(dāng)軟件試圖對(duì)一個(gè)被保護(hù)的頁進(jìn)行寫操作時(shí)WP_PG_DIS位被置1。在這種情況下,寫操作不會(huì)被執(zhí)行。
如果FLASH_CR1中的IE位已經(jīng)被預(yù)先使能,則只要這些標(biāo)志位(EOP/WP_PG_DIS)中有一個(gè)被置位就會(huì)產(chǎn)生一個(gè)中斷。
字編程
字寫入操作允許一次對(duì)整個(gè)4字節(jié)的字進(jìn)行編程,從而將編程時(shí)間縮短。
主程序存儲(chǔ)器和DATA EEPROM都可以進(jìn)行字操作。在一些STM8S器件中,也擁有當(dāng)EEPROM在進(jìn)行寫操作時(shí)同時(shí)具備RWW功能。
塊編程
塊編程比字節(jié)編程和字編程都要快。在塊編程操作中,整個(gè)塊的編程或擦除在一個(gè)編程周期就可以完成。
在主程序存儲(chǔ)器FLASH和DATA區(qū)域都可以執(zhí)行塊操作。
● 在主程序存儲(chǔ)器中
用于塊編程的代碼必須全部在RAM中執(zhí)行。
● 在DATA區(qū)域中
─ 有RWW功能的器件: DATA 塊操作可在主程序存儲(chǔ)器中執(zhí)行,然而數(shù)據(jù)裝載階段必須在RAM中執(zhí)行。
─ 無RWW功能的器件:用于塊編程的代碼必須全部在RAM中執(zhí)行。
一共有三種可能的塊操作:
● 塊編程(也叫標(biāo)準(zhǔn)塊編程):整個(gè)塊在編程前被自動(dòng)擦除。
● 快速塊編程:在編程前沒有預(yù)先的塊擦除操作。
● 塊擦除。
在塊編程時(shí),中斷被硬件自動(dòng)屏蔽。
標(biāo)準(zhǔn)塊編程
塊編程操作允許一次對(duì)整個(gè)塊進(jìn)行編程,整個(gè)塊在編程前被自動(dòng)擦除。
快速塊編程
快速塊編程允許不擦除存儲(chǔ)器內(nèi)容就對(duì)塊進(jìn)行編程,因此快速塊編程的編程速度是標(biāo)準(zhǔn)塊編程的兩倍。
警告: 在執(zhí)行快速塊編程之前如果這個(gè)塊不是空的話,不能保證寫入的數(shù)據(jù)無誤。
選項(xiàng)字節(jié)(Option byte)編程
對(duì)選項(xiàng)字節(jié)編程和對(duì)DATA EEPROM區(qū)域編程非常相似。
應(yīng)用程序可直接向目標(biāo)地址進(jìn)行寫操作。利用STM8的RWW功能,在對(duì)選項(xiàng)字節(jié)寫操作的同時(shí)程序不必停下來。
軟件工程源代碼 Ⅲ
1、關(guān)于工程
本文提供的工程代碼是基于前面軟件工程“STM8S-A04_UART基本收發(fā)數(shù)據(jù)”增加FLASH修改而來。初學(xué)的朋友可以參看我前面對(duì)應(yīng)的基礎(chǔ)文章,那些文章講的比較詳細(xì)。
工程源代碼主要實(shí)現(xiàn)功能:寫入FLASH或EEPROM并讀取寫入的數(shù)據(jù),通過UART打印來觀察讀取的數(shù)據(jù)是否和寫入的一直。
提供兩個(gè)工程:STM8S-A07_內(nèi)部FLASH編程和STM8S-A07_內(nèi)部EEPROM編程
這兩個(gè)工程需要注意讀寫操作的地址不同,見下圖:
本文重點(diǎn)的函數(shù)接口:
FLASH_WriteNByte:FLASH寫N字節(jié)
FLASH_ReadNByte: FLASH讀N字節(jié)
EEPROM_WriteNByte:EEPROM寫N字節(jié)
EEPROM_ReadNByte:EEPROM讀N字節(jié)
2.代碼分析說明
A.FLASH_WriteNByte:FLASH寫N字節(jié)
void FLASH_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)
{
FLASH_Unlock(FLASH_MEMTYPE_PROG);
while(FLASH_GetFlagStatus(FLASH_FLAG_PUL) == RESET);
while(nByte--)
{
FLASH_ProgramByte(WriteAddr, *pBuffer);
WriteAddr++;
pBuffer++;
FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG);
}
FLASH_Lock(FLASH_MEMTYPE_PROG);
}
這里需要注意:1.寫之前解鎖,寫完需要上鎖;2.我們提供的代碼是字節(jié)操作,因此,每次操作需要“等待上次寫操作完成”。
B.FLASH_ReadNByte:FLASH讀N字節(jié)
void FLASH_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)
{
while(nByte--)
{
*pBuffer = FLASH_ReadByte(ReadAddr);
ReadAddr++;
pBuffer++;
}
}
讀操作一般都很簡(jiǎn)單,不管是讀FLASH還是EEPROM,基本上操作都類似。為什么我們買的U盤讀取速度遠(yuǎn)大于寫的速度,原因就在這里。
C.EEPROM_WriteNByte:EEPROM寫N字節(jié)
void EEPROM_WriteNByte(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t nByte)
{
FLASH_Unlock(FLASH_MEMTYPE_DATA);
while(FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET);
while(nByte--)
{
FLASH_ProgramByte(WriteAddr, *pBuffer);
WriteAddr++;
pBuffer++;
FLASH_WaitForLastOperation(FLASH_MEMTYPE_DATA);
}
FLASH_Lock(FLASH_MEMTYPE_DATA);
}
和FLASH的寫對(duì)比,可以看得出來,他們之間的差別在于參數(shù):FLASH_MEMTYPE_DATA.
D.EEPROM_ReadNByte:EEPROM讀N字節(jié)
void EEPROM_ReadNByte(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t nByte)
{
while(nByte--)
{
*pBuffer = FLASH_ReadByte(ReadAddr);
ReadAddr++;
pBuffer++;
}
}
E.main函數(shù)讀寫驗(yàn)證
FLASH_WriteNByte(WriteBuf, FLASH_ADDR, BUF_SIZE);
TIMDelay_Nms(500);
FLASH_ReadNByte(ReadBuf, FLASH_ADDR, BUF_SIZE);
UART1_SendNByte(ReadBuf, BUF_SIZE);
通過UART打印“讀BUF”的數(shù)據(jù),可以看得出來,我們從FLASH中寫入的數(shù)據(jù)是否正確。
兩個(gè)工程代碼實(shí)現(xiàn)功能都一樣,注意地址。
打印數(shù)據(jù)如下:
00 00 00 00 00 00 00 00 00 00(打印未讀寫操作之前的“讀BUF”數(shù)據(jù))
41 31 42 32 43 33 44 34 45 35(十六進(jìn)制顯示)
A1B2C3D4E5(字符形式顯示)
下載 Ⅳ
STM8S資料:
http://pan.baidu.com/s/1o7Tb9Yq
軟件源代碼工程(STM8S-A07_內(nèi)部xxx編程):
http://pan.baidu.com/s/1c2EcRo0
提示:如果網(wǎng)盤鏈接失效,可以微信公眾號(hào)“底部菜單”查看更新鏈接。
-
FlaSh
+關(guān)注
關(guān)注
10文章
1656瀏覽量
150612 -
EEPROM
+關(guān)注
關(guān)注
9文章
1061瀏覽量
83012 -
STM8S
+關(guān)注
關(guān)注
16文章
149瀏覽量
31907
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
AN-1383: ADP1046A EEPROM編程

AN-0973: 超級(jí)時(shí)序控制器的EEPROM擦除和編程

EEPROM編程常見錯(cuò)誤及解決方案
ESP32S3的EEPROM是由FLASH虛擬的,直接在arduinoIDE中擦寫EEPROM時(shí)是否在底層自動(dòng)進(jìn)行了磨損平衡?
【GD32F303紅楓派開發(fā)板使用手冊(cè)】第五講 FMC-片內(nèi)Flash擦寫讀實(shí)驗(yàn)

評(píng)論