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