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