STM8 讀同時寫RWW
字節(jié)編程
可以對主程序存儲器和DATA區(qū)域逐字節(jié)地編程。要對一個字節(jié)編程,應(yīng)用程序可直接向目標(biāo)地址寫入數(shù)據(jù)。
在主程序存儲器中
當(dāng)字節(jié)編程操作執(zhí)行時,應(yīng)用程序停止運行。
在DATA區(qū)域中
有RWW功能的器件:在IAP模式下,應(yīng)用程序不停止運行,字節(jié)編程利用RWW功能進行操作。
無RWW功能的器件:當(dāng)字節(jié)編程操作執(zhí)行時,應(yīng)用程序停止運行。
要擦除一個字節(jié),向?qū)?yīng)的字節(jié)簡單寫入0x00即可。
應(yīng)用程序可以通過讀FLASH_IAPSR寄存器來校驗編程或擦除操作是否已被正確執(zhí)行:
在一次成功的編程操作后EOP位被置1。
當(dāng)軟件試圖對一個被保護的頁進行寫操作時WP_PG_DIS位被置1。在這種情況下,寫操作不會被執(zhí)行。
如果FLASH_CR1中的IE位已經(jīng)被預(yù)先使能,則只要這些標(biāo)志位(EOP/WP_PG_DIS)中有一個被置位就會產(chǎn)生一個中斷。
STM8自動快速字節(jié)編程,根據(jù)目標(biāo)地址的初始化內(nèi)容的不同,編程持續(xù)時間可能也有所不同。如果字(4個字節(jié))中包含不為空的字節(jié),編程前字會被自動擦除。相反,如果字節(jié)為空,由于不會執(zhí)行擦除操作從而編程時間變短。然而,可以通過對FLASH_CR1中的FIX位置1來強迫執(zhí)行系統(tǒng)擦除操作而不管其內(nèi)容是否為空,從而使編程時間固定(請參考FLASH控制寄存器)。編程總時間隨之被規(guī)定為擦除時間和寫操作時間的和(請參考tPROG參數(shù),在數(shù)據(jù)手冊的"Flash program memory"表中)。
注意:為了快速寫一個字節(jié)(沒有擦除操作),將要被寫入數(shù)據(jù)的整個字(4個字節(jié))必須被預(yù)先擦除。因此不可能對同一個字做連續(xù)兩次快速寫操作(在第二次寫之前沒有擦除操作):第一次寫字節(jié)操作將是快速操作但針對另外一個字節(jié)的第二次寫操作將需要一個擦除操作。
字編程
字寫入操作允許一次對整個4字節(jié)的字進行編程,從而將編程時間縮短。
主程序存儲器和DATA EEPROM都可以進行字操作。在一些STM8S器件中,也擁有當(dāng)DATA EEPROM在進行寫操作時同時具備RWW功能。請參考數(shù)據(jù)手冊了解更多信息。為了對一個字編程,F(xiàn)LASH_CR2和FLASH_NCR2中的/WPRG/NWPRG位必須預(yù)先置位清零來使能字編程模式(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。然后將要被編程字的4個字節(jié)必須被從首地址開始裝載。當(dāng)四個字節(jié)都被寫入后,編程周期自動開始。
像字節(jié)操作一樣,STM8的FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查操作是否被正確執(zhí)行完畢。
塊編程
塊編程比字節(jié)編程和字編程都要快。在STM8塊編程操作中,整個塊的編程或擦除在一個編程周期就可以完成。請參考(表4)了解具體器件的塊的大小。在主程序存儲器和DATA區(qū)域都可以執(zhí)行塊操作。
在主程序存儲器中
用于塊編程的代碼必須全部在RAM中執(zhí)行。
在DATA區(qū)域中
有RWW功能的器件:DATA塊操作可在主程序存儲器中執(zhí)行,然而數(shù)據(jù)裝載階段(下文中有述)必須在RAM中執(zhí)行。
無RWW功能的器件:用于塊編程的代碼必須全部在RAM中執(zhí)行。
一共有三種可能的塊操作:
塊編程(也叫標(biāo)準(zhǔn)塊編程):整個塊在編程前被自動擦除。
快速塊編程:在編程前沒有預(yù)先的塊擦除操作。
塊擦除。
標(biāo)準(zhǔn)塊編程
塊編程操作允許一次對整個塊進行編程,整個塊在編程前被自動擦除。
為了對整個塊編程,F(xiàn)LASH_CR2和FLASH_NCR2中的PRG/NPRG位必須預(yù)先置位/清零來使能標(biāo)準(zhǔn)塊編程(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。然后需要向主程序存儲器或DATA區(qū)域的目標(biāo)地址依次寫入要編程的數(shù)據(jù),這樣數(shù)據(jù)會被鎖存在內(nèi)部緩存中。為編程整個塊,塊中的所有字節(jié)都需要被寫入數(shù)據(jù)。但要注意,所有被寫入緩存的數(shù)據(jù)必須位于同一個塊中,這意味著這些數(shù)據(jù)必須有同樣的高位地址:僅僅低6位的地址可以不一樣。當(dāng)目標(biāo)塊的最后一個字節(jié)被裝載到緩存后,編程就自動開始了。編程前首先會自動執(zhí)行一次擦除操作。
當(dāng)對DTA區(qū)域進行塊編程時,應(yīng)用程序可以檢查FLASH_IAPSR中的HVOFF位確認(rèn)編程狀態(tài)。一旦HVOFF被置0,真正的編程階段就開始了,此時應(yīng)用程序就可以返回到主程序中去了。FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查操作是否被正確執(zhí)行完畢。
快速塊編程
STM8快速塊編程允許不擦除存儲器內(nèi)容就對塊進行編程,因此快速塊編程的編程速度是標(biāo)準(zhǔn)塊編程的兩倍。該模式僅用于被編程部分已經(jīng)被擦除過的情況,同時這種模式對向空白部分寫入完整的應(yīng)用代碼特別有用,因為這種模式可以節(jié)省相當(dāng)可觀的時間。
快速塊編程的步驟和標(biāo)準(zhǔn)塊編程的步驟大致一樣,F(xiàn)LASH_CR2和FLASH_NCR2中的FPRG/NFPRG位必須預(yù)先置位/清零來使能快速塊編程(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存2(FLASH_NCR2))。FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查快速塊編程操作是否被正確執(zhí)行完畢。
警告:在執(zhí)行快速塊編程之前如果這個塊不是空的話,不能保證寫入的數(shù)據(jù)無誤。
塊擦除
塊擦除允許擦除整個塊。
為了擦除整個塊,F(xiàn)LASH_CR2和FLASH_NCR2中的ERASE/NERASE位必須預(yù)先置位/清零來使能塊擦除(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。通過對塊中所有的字寫入0x00 00 00 00來擦除整個塊。字的起始地址必須以0,4,8,或C作為結(jié)尾。
FLASH_IAPSR中_PG_DIS控制位和FLASH中斷相配操作是否被正確執(zhí)行完畢。
選項字節(jié)(Option byte)編程
對選項字節(jié)編程和對DATA EEPROM區(qū)域編程非常相似。
應(yīng)用程序可直接向目標(biāo)地址進行寫操作。利用STM8的RWW功能,在對選項字節(jié)寫操作的同時程序不必停下來。
請參考相應(yīng)的數(shù)據(jù)手冊來了解選項字節(jié)內(nèi)容的細(xì)節(jié)。
評論