UPD78F9211/9212/9210 自寫方式編程
UPD78F9211/9212/9210 通過自寫方式對(duì)FLASH 進(jìn)行編程
780K0S/KY1+ 支持自編程功能,可以通過用戶程序來寫入FLASH 存儲(chǔ)器,因此780K0S/KY1+ 具有在線升級(jí)程序的功能。
注意事項(xiàng) 在執(zhí)行自寫入以前,自寫入處理程序必須先被包含在用戶程序中。
備注1. 對(duì)于自編程的使用,請(qǐng)參看16.8.4 前面的例子。
2. 若想用78K0S/KY1+ 的內(nèi)部FLASH當(dāng)作外部EEPROM來存儲(chǔ)數(shù)據(jù)時(shí),請(qǐng)參考《78K0S/Kx1+ EEPROMEmulation Application Note》(U17379E)。
1.1 自編程概述
如要執(zhí)行自編程, 需要將工作模式由用戶程序模式(普通模式)切換到自編程模式。在自編程模式下,先設(shè)置特定寄存器,通過執(zhí)行HALT 指令執(zhí)行擦寫處理程序。當(dāng)程序結(jié)束時(shí),將自動(dòng)退出HALT 狀態(tài)。
關(guān)于通過對(duì)特定寄存器的操作使模式切換到自編程模式的詳情請(qǐng)參考16.8.4 普通模式與自編程模式切換示例。
備注 自編程序?qū)懭霐?shù)據(jù)可參照MOV 指令。
圖16-10 是自編程框圖,圖16-11 是自編程狀態(tài)轉(zhuǎn)換圖,表16-11 列舉了自編程控制命令。
1
備注 命令內(nèi)部驗(yàn)證1 可以通過指定相同block 內(nèi)的任意一個(gè)地址來執(zhí)行,但是如果要向同一個(gè)block 內(nèi)的多個(gè)地址寫入數(shù)據(jù),則推薦使用命令— 內(nèi)部驗(yàn)證2。
1.2 自編程注意事項(xiàng)
當(dāng)自編程命令執(zhí)行時(shí),其它命令都不能執(zhí)行。因此,要先清除和重啟看門狗時(shí)鐘計(jì)數(shù)器,以便在自編程時(shí)計(jì)數(shù)器不會(huì)溢出。關(guān)于執(zhí)行自編程需要的時(shí)間請(qǐng)參考表16-11 。
在自編程期間發(fā)生的中斷,在自編程模式結(jié)束后才能被響應(yīng)。為了避免這種情況,應(yīng)在從普通模式切換到自編程模式之前以一定順序終止中斷服務(wù)(將MK0 設(shè)定為FFH,并執(zhí)行DI 指令)。
當(dāng)執(zhí)行自編程命令時(shí),不須使用RAM。
當(dāng)FLASH 存儲(chǔ)器正在數(shù)據(jù)寫入/擦除過程中,如果電源電壓下降或有復(fù)位信號(hào)輸入,則此次寫入/擦除操作不一定成功。
在block 擦除中空白數(shù)據(jù)的值設(shè)為FFH。
預(yù)先設(shè)置CPU 時(shí)鐘,使在自編程中使CPU 時(shí)鐘大于等于1 MHz。
執(zhí)行指定序列的命令設(shè)定自編程模式后,立即執(zhí)行NOP 和HALT 指令,以執(zhí)行自編程。10 s(最大值)+ 2 CPU時(shí)鐘(fCPU)后HALT 指令被自動(dòng)釋放。[!--empirenews.page--]
如果振蕩器時(shí)鐘/外部時(shí)鐘被選擇為系統(tǒng)時(shí)鐘,執(zhí)行指定序列的命令設(shè)定自編程模式后,立即執(zhí)行NOP 和HALT 指令,在HATL 狀態(tài)釋放后等待8 s,然后執(zhí)行自編程。
通過使用1 位存儲(chǔ)器操作指令驗(yàn)證FPRERR。
自編程模式下和HALT 模式下引腳的狀態(tài)是相同的。
在自編程模式中,禁止通過on-board/off-board 編程設(shè)置安全功能,無論安全功能如何設(shè)定,自編程命令都可執(zhí)行。想要在自編程期間禁止寫入或擦除進(jìn)程,則需要設(shè)定保護(hù)字節(jié)。
在執(zhí)行自編程命令前,確保對(duì)Flash 地址指針H(FLAPH)的第4 ~ 7 位和Flash地址指針H比較寄存器(FLAPHC)清零。如果這些位為1 時(shí)執(zhí)行自編程,設(shè)備將會(huì)故障。
在設(shè)置為自編程模式和普通模式以前,立即將FLCMD 寄存器清零(00H)。
1.3 自編程功能所使用的寄存器
自編程使用以下的寄存器
Flash 編程模式控制寄存器(FLPMC)
Flash 保護(hù)命令寄存器(PFCMD)
Flash 狀態(tài)寄存器(PFS)
Flash 編程命令寄存器(FLCMD)
Flash 地址指針H 和L 寄存器(FLAPH 和FLAPL)
Flash 地址指針H 比較寄存器和FLASH 地址指針L 比較寄存器(FLAPH 和FLAPLC)
Flash 寫入緩存寄存器(FLW)
78K0S/KY1+ 在FLASH 存儲(chǔ)器的0081H 地址有一個(gè)區(qū)域被稱為保護(hù)字節(jié)。
(1)Flash 編程模式控制寄存器(FLPMC)
這個(gè)寄存器用于在自編程模式下向FLASH 存儲(chǔ)器寫入數(shù)據(jù)時(shí)設(shè)定工作模式,并可用于讀取保護(hù)字節(jié)的值。
只有按特定順序(參考16.8.3(2) FLASH 保護(hù)命令寄存器(PFCMD))才能寫入數(shù)據(jù),如此就不會(huì)因?yàn)榕既坏脑肼暩蓴_或者程序掛起等故障導(dǎo)致應(yīng)用系統(tǒng)意外停止。
該寄存器可通過一個(gè)8 位的存儲(chǔ)操作指令來設(shè)置。
復(fù)位后寄存器狀態(tài)值不確定。
注 1. 當(dāng)復(fù)位釋放時(shí),第0 位(FLSPM)被清零。當(dāng)復(fù)位釋放后,保護(hù)字節(jié)的設(shè)定值可從第2 ~6 位(PRSELF0 ~ RESELF4)讀出。
2. 第2 ~ 6 位(PRSELF0 ~ RESELF4)是只讀的。
注意事項(xiàng) 1. 注意在設(shè)定自編程模式的情況下,可參考16.8.2 自編程功能的注意事項(xiàng)。
2. 預(yù)先設(shè)置CPU 時(shí)鐘,使在自編程中使CPU 時(shí)鐘大于等于1 MHz。
3. 執(zhí)行指定序列的命令設(shè)定自編程模式后,立即執(zhí)行NOP 和HALT 指令,以執(zhí)行自編程。10μs(最大值)+ 2 CPU 時(shí)鐘(fCPU)后HALT 指令被自動(dòng)釋放。
4. 如果振蕩器時(shí)鐘/外部時(shí)鐘被選擇為系統(tǒng)時(shí)鐘,執(zhí)行指定序列的命令設(shè)定自編程模式后,立即執(zhí)行NOP 和HALT 指令,在HATL 狀態(tài)釋放后等待8 μs,然后執(zhí)行
自編程。
5. 在設(shè)置為自編程模式和普通模式以前,立即將FLCMD寄存器清零(00H)。
(2)Flash 保護(hù)命令寄存器(PFCMD)
如果由于噪聲或程序掛起等原因引起的故障導(dǎo)致應(yīng)用系統(tǒng)停止,此時(shí)對(duì)FLASH 編程模式控制寄存器(FLPMC)進(jìn)行寫入操作將對(duì)系統(tǒng)產(chǎn)生嚴(yán)重影響。PFCMD 用來保護(hù)FLPMC 的寫入,這樣就不會(huì)使應(yīng)用系統(tǒng)由于疏忽導(dǎo)致停止。
必須按以下順序?qū)LPMC執(zhí)行寫入操作。
<1> 寫入一特定的值(A5H)到PFCMD 中。
<2> 寫入設(shè)定值到FLPMC 的第0 位(FLSPM)中(此時(shí)寫入操作是無效的)。
<3> 將設(shè)定值的反碼寫入FLPMC 的第0 位(FLSPM)(此時(shí)寫入操作是無效的)。
<4> 將設(shè)定值寫入FLPMC 的第0 位(FLSPM)(此時(shí)寫入操作是有效的)。
注意事項(xiàng) 在自編程模式下,不能執(zhí)行中斷服務(wù)。在執(zhí)行指定序列指令設(shè)定自編程模式以前,執(zhí)行指定序列指令設(shè)定工作模式為普通模式以后的兩點(diǎn)之間,停止中斷服務(wù)
(通過在MK0= FFH 時(shí),執(zhí)行DI 指令)。
這樣重復(fù)寫入寄存器,可使寄存器不能被非法寫入。
可以通過FLASH 狀態(tài)寄存器(PFS)的第0 位(FPRERR)來驗(yàn)證是否出現(xiàn)非法的存儲(chǔ)操作。
使用1 位存儲(chǔ)器操作指令驗(yàn)證FPRERR。
每當(dāng)FLPMC的值發(fā)生改變的時(shí)候都必須向PFCMD 寫入值A(chǔ)5H。
PFCMD 的值可通過一個(gè)8 位的存儲(chǔ)器操作指令來設(shè)置。
復(fù)位后寄存器PFCMD 值不確定。
(3) Flash 狀態(tài)寄存器(PFS)
如果數(shù)據(jù)不能按正確順序(寫入FLASH 保護(hù)命令寄存器PFCMD)寫入受保護(hù)的FLASH 編程模式控制寄存器(FLPMC)中,F(xiàn)LPMC不能被寫入并且出現(xiàn)保護(hù)錯(cuò)誤,PFS 的第0 位(FPRERR)將被置1。
當(dāng)FPRERR 爲(wèi)1 時(shí),可以通過直接寫0 來清0。
自編程模式期間可能産生的錯(cuò)誤能夠通過PFS 的第1位(VCERR)和第2 位(WEPRERR)位反應(yīng)出來,(VCERR)和(WEPRERR)可以通過寫0 來清0。
要驗(yàn)證操作是否執(zhí)行正確,PFS 寄存器的必須被預(yù)先清零。
PFS 可以使用1 位或8 位存儲(chǔ)器操作指令設(shè)定。
複位後PFS被置爲(wèi)00H。
注意事項(xiàng) 使用1 位存儲(chǔ)器操作指令驗(yàn)證FPRERR。
1. FPRERR 標(biāo)記的操作條件
< 設(shè)置條件>
剛執(zhí)行的對(duì)周邊寄存器的寫入命令沒有給PFCMD寫入特定值(PFCMD = A5H)時(shí),對(duì)PFCMD進(jìn)行寫入操作。
在<1>之後,如果第一條存儲(chǔ)指令操作的是外部存儲(chǔ)器而不是FLPMC。
在<2>之後,如果第一條存儲(chǔ)指令操作的是外部存儲(chǔ)器而不是FLPMC。
在<2>之後,如果第一條存儲(chǔ)指令所寫的值不同于FLPMC 值的反碼。
在<3>之後,如果第一條存儲(chǔ)指令操作的是外部存儲(chǔ)器而不是FLPMC。
在<3>之後,如果第一條存儲(chǔ)指令所寫的值不同于FLPMC 值(在<2> 中所寫)。
備注 在菱形括號(hào)內(nèi)的數(shù)字對(duì)應(yīng)于(2) Flash 保護(hù)命令字節(jié)(PFCMD)。
< 複位條件>
如果FPRERR 標(biāo)志寫0
複位信號(hào)輸入
2. VCERR標(biāo)志的操作條件
< 設(shè)定條件>
擦除校驗(yàn)錯(cuò)誤
內(nèi)部寫入校驗(yàn)錯(cuò)誤
若VCERR 被設(shè)爲(wèi)1,則說明Flash 沒有被正確的擦除/寫入。在指定的程序裏要再次對(duì)Flash 進(jìn)行擦除/寫入。
備注 當(dāng)發(fā)生擦除/寫入保護(hù)錯(cuò)誤時(shí),VCERR標(biāo)記也會(huì)被置1。
< 複位條件>
VCERR標(biāo)記被置爲(wèi)0
外部複位信號(hào)輸入
3. WEPRERR 標(biāo)記操作條件
< 設(shè)置條件>
使用保護(hù)字節(jié)指定一個(gè)區(qū)域防止該區(qū)域因FLASH 地址指針H(FLAPH)和執(zhí)行相關(guān)命令而引起的數(shù)據(jù)擦除/寫入。
如果“1”被寫入到一個(gè)沒有被擦除的位(一個(gè)爲(wèi)“0”的位)。
< 複位條件>
WEPRERR 標(biāo)記被置0
外部複位信號(hào)輸入
(4)FLASH 編程命令寄存器(FLCMD)
在自編程模式下,F(xiàn)LCMD 被用來確定FLASH 的擦、寫、校驗(yàn)操作。
該寄存器可通過1 位或8 位的操作指令來設(shè)置。
複位後寄存器值置爲(wèi)00H。
[!--empirenews.page--]
注 如果執(zhí)行不同于以上的命令時(shí),命令會(huì)被立即終止,并且Flash 狀態(tài)寄存器(PFS)的第1 或2 位(WEPRERR 或VCERR)會(huì)被置1。
(5)Flash 地址指針H 和L(FLAPH 和FLAPL)
Flash 地址指針H 和L(FLAPH 和FLAPL)用于在自編程模式下指定FLASH 的擦除、寫入、驗(yàn)證的開始地址。
FLAPH 和FLAPL 由計(jì)數(shù)器組成,當(dāng)編程命令不執(zhí)行時(shí),它們遞增直到與FLAPHC 和FLAPLC 的值相等。因此,當(dāng)程序命令執(zhí)行時(shí),PLAPHC 和FLAPLC 的值需要重新設(shè)置。
Flash 地址指針H 和L(FLAPH 和FLAPL)可通過1 位或8 位操作指令來設(shè)置。
複位後寄存器值不確定。
(6) Flash 地址指針H 比較寄存器和FLASH 地址指針L 比較寄存器(FLAPHC和FLAPLC)在自編程模式下校驗(yàn)FLASH 存儲(chǔ)器時(shí),F(xiàn)LASH 地址指針比較寄存器H 和L(FLAPHC 和FLAPLC)用于指定內(nèi)部序列操作的地址範(fàn)圍。
將FLAPH 的值賦給FLAPHC。將FLASH 存儲(chǔ)器校驗(yàn)範(fàn)圍的最末端地址賦給FLAPLC。
FLAPHC 和FLAPLC 使用1 位或8 位存儲(chǔ)器操作指令來設(shè)定。
複位後FLW寄存器值置爲(wèi)00H。
注意事項(xiàng) 1. 在自編程命令執(zhí)行以前,確保FLASH 地址指針H(FLAPH)的第4 ~ 7 位和FLASH 地址指針H 比較寄存器(FLAPHC)清零。如果當(dāng)執(zhí)行自編程命令時(shí)這些
位的值爲(wèi)1。
2. 當(dāng)進(jìn)行block 擦除、校驗(yàn)、空白檢測(cè)時(shí),將block 的序號(hào)(與FLAPH 的值相同)賦值給FLAPHC。
3. 當(dāng)block 擦除完成時(shí)FLAPLC 要清零,當(dāng)block 空白檢測(cè)完成後FLAPLC要設(shè)爲(wèi)FFH。
(7)Flash 寫緩沖寄存器(FLW)
數(shù)據(jù)在寫入FLASH 之前,先存儲(chǔ)在FLW 緩存內(nèi)。
該寄存器值可用1 位或8 位存儲(chǔ)操作指令設(shè)置。
複位後FLW寄存器值置爲(wèi)00H。
(8)保護(hù)字節(jié)
保護(hù)字節(jié)用于指定禁止寫入或擦除區(qū)域。該指定的保護(hù)區(qū)域隻在自編程模式下有效。因爲(wèi)受保護(hù)區(qū)域在自編程模式下是不可用的,所以保護(hù)區(qū)域內(nèi)的數(shù)據(jù)是受保護(hù)的。