STM8 讀同時寫RWW
字節編程
可以對主程序存儲器和DATA區域逐字節地編程。要對一個字節編程,應用程序可直接向目標地址寫入數據。
在主程序存儲器中
當字節編程操作執行時,應用程序停止運行。
在DATA區域中
有RWW功能的器件:在IAP模式下,應用程序不停止運行,字節編程利用RWW功能進行操作。
無RWW功能的器件:當字節編程操作執行時,應用程序停止運行。
要擦除一個字節,向對應的字節簡單寫入0x00即可。
應用程序可以通過讀FLASH_IAPSR寄存器來校驗編程或擦除操作是否已被正確執行:
在一次成功的編程操作后EOP位被置1。
當軟件試圖對一個被保護的頁進行寫操作時WP_PG_DIS位被置1。在這種情況下,寫操作不會被執行。
如果FLASH_CR1中的IE位已經被預先使能,則只要這些標志位(EOP/WP_PG_DIS)中有一個被置位就會產生一個中斷。
STM8自動快速字節編程,根據目標地址的初始化內容的不同,編程持續時間可能也有所不同。如果字(4個字節)中包含不為空的字節,編程前字會被自動擦除。相反,如果字節為空,由于不會執行擦除操作從而編程時間變短。然而,可以通過對FLASH_CR1中的FIX位置1來強迫執行系統擦除操作而不管其內容是否為空,從而使編程時間固定(請參考FLASH控制寄存器)。編程總時間隨之被規定為擦除時間和寫操作時間的和(請參考tPROG參數,在數據手冊的"Flash program memory"表中)。
注意:為了快速寫一個字節(沒有擦除操作),將要被寫入數據的整個字(4個字節)必須被預先擦除。因此不可能對同一個字做連續兩次快速寫操作(在第二次寫之前沒有擦除操作):第一次寫字節操作將是快速操作但針對另外一個字節的第二次寫操作將需要一個擦除操作。
字編程
字寫入操作允許一次對整個4字節的字進行編程,從而將編程時間縮短。
主程序存儲器和DATA EEPROM都可以進行字操作。在一些STM8S器件中,也擁有當DATA EEPROM在進行寫操作時同時具備RWW功能。請參考數據手冊了解更多信息。為了對一個字編程,FLASH_CR2和FLASH_NCR2中的/WPRG/NWPRG位必須預先置位清零來使能字編程模式(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。然后將要被編程字的4個字節必須被從首地址開始裝載。當四個字節都被寫入后,編程周期自動開始。
像字節操作一樣,STM8的FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查操作是否被正確執行完畢。
塊編程
塊編程比字節編程和字編程都要快。在STM8塊編程操作中,整個塊的編程或擦除在一個編程周期就可以完成。請參考(表4)了解具體器件的塊的大小。在主程序存儲器和DATA區域都可以執行塊操作。
在主程序存儲器中
用于塊編程的代碼必須全部在RAM中執行。
在DATA區域中
有RWW功能的器件:DATA塊操作可在主程序存儲器中執行,然而數據裝載階段(下文中有述)必須在RAM中執行。
無RWW功能的器件:用于塊編程的代碼必須全部在RAM中執行。
一共有三種可能的塊操作:
塊編程(也叫標準塊編程):整個塊在編程前被自動擦除。
快速塊編程:在編程前沒有預先的塊擦除操作。
塊擦除。

標準塊編程
塊編程操作允許一次對整個塊進行編程,整個塊在編程前被自動擦除。
為了對整個塊編程,FLASH_CR2和FLASH_NCR2中的PRG/NPRG位必須預先置位/清零來使能標準塊編程(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。然后需要向主程序存儲器或DATA區域的目標地址依次寫入要編程的數據,這樣數據會被鎖存在內部緩存中。為編程整個塊,塊中的所有字節都需要被寫入數據。但要注意,所有被寫入緩存的數據必須位于同一個塊中,這意味著這些數據必須有同樣的高位地址:僅僅低6位的地址可以不一樣。當目標塊的最后一個字節被裝載到緩存后,編程就自動開始了。編程前首先會自動執行一次擦除操作。
當對DTA區域進行塊編程時,應用程序可以檢查FLASH_IAPSR中的HVOFF位確認編程狀態。一旦HVOFF被置0,真正的編程階段就開始了,此時應用程序就可以返回到主程序中去了。FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查操作是否被正確執行完畢。
快速塊編程
STM8快速塊編程允許不擦除存儲器內容就對塊進行編程,因此快速塊編程的編程速度是標準塊編程的兩倍。該模式僅用于被編程部分已經被擦除過的情況,同時這種模式對向空白部分寫入完整的應用代碼特別有用,因為這種模式可以節省相當可觀的時間。
快速塊編程的步驟和標準塊編程的步驟大致一樣,FLASH_CR2和FLASH_NCR2中的FPRG/NFPRG位必須預先置位/清零來使能快速塊編程(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存2(FLASH_NCR2))。FLASH_IAPSR中的EOP與WR_PG_DIS控制位和FLASH中斷相配合,可用于檢查快速塊編程操作是否被正確執行完畢。
警告:在執行快速塊編程之前如果這個塊不是空的話,不能保證寫入的數據無誤。
塊擦除
塊擦除允許擦除整個塊。
為了擦除整個塊,FLASH_CR2和FLASH_NCR2中的ERASE/NERASE位必須預先置位/清零來使能塊擦除(請參考4.9.2 FLASH控制寄存器2(FLASH_CR2)和4.9.3 FLASH互補控制寄存器2(FLASH_NCR2))。通過對塊中所有的字寫入0x00 00 00 00來擦除整個塊。字的起始地址必須以0,4,8,或C作為結尾。
FLASH_IAPSR中_PG_DIS控制位和FLASH中斷相配操作是否被正確執行完畢。
選項字節(Option byte)編程
對選項字節編程和對DATA EEPROM區域編程非常相似。
應用程序可直接向目標地址進行寫操作。利用STM8的RWW功能,在對選項字節寫操作的同時程序不必停下來。
請參考相應的數據手冊來了解選項字節內容的細節。
評論