《STM8S系列單片機原理與應(yīng)用》課件第3章_第1頁
《STM8S系列單片機原理與應(yīng)用》課件第3章_第2頁
《STM8S系列單片機原理與應(yīng)用》課件第3章_第3頁
《STM8S系列單片機原理與應(yīng)用》課件第3章_第4頁
《STM8S系列單片機原理與應(yīng)用》課件第3章_第5頁
已閱讀5頁,還剩98頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第3章存儲器系統(tǒng)及訪問

3.1存儲器結(jié)構(gòu)3.2存儲器讀寫保護與控制寄存器

3.3FlashROM存儲器IAP編程3.1存儲器結(jié)構(gòu)

在STM8S系統(tǒng)內(nèi),RAM存儲區(qū)、EEPROM存儲區(qū)、引導ROM存儲區(qū)、FlashROM存儲區(qū),以及與外設(shè)有關(guān)的寄存器(包括外設(shè)控制寄存器、狀態(tài)寄存器、數(shù)據(jù)寄存器)均統(tǒng)一安排在16MB線性地址空間內(nèi),即內(nèi)部地址總線為24位,如圖3-1所示。這樣,無論是RAM、EEPROM、FlashROM,還是外設(shè)寄存器,其讀、寫指令的格式與操作數(shù)的尋址方式等完全相同。圖3-1STM8S存儲器組織在圖3-1中,16MB線性地址空間以段(Section)形式組織,每段大小為64KB。內(nèi)部地址總線b23~b16(最高8位)視為段號;而b15~b0被視為段內(nèi)存儲單元的字節(jié)編號,即地址形式為00XXXXH~FFXXXXH。為減小指令碼長度,RAM、EEPROM存儲區(qū)安排在00段內(nèi),這樣堆棧指針SP長度就可以縮減為16位。位于00段內(nèi)的各存儲單元也能用16位地址形式訪問。另外,16MB地址空間也可以按頁(Page)形式組織,每頁大小為256B。這時,內(nèi)部地址總線b23~b8(高16位)被視為頁號;而b7~b0被視為頁內(nèi)存儲單元的字節(jié)編號,即地址形式為0000XXH~FFFFXXH。這樣位于0000頁內(nèi)的存儲單元,即RAM空間內(nèi)的前256字節(jié),可用8位地址形式訪問。RAM地址空間為000000H~003FFFH,目前容量在1~6KB之間(000000H~0017FFH),未來最大可以擴充到16KB,即001800H~003FFFH的地址空間目前保留。EEPROM地址空間為004000H~0047FFH,目前容量在640B~2KB之間。與硬件配置有關(guān)的選項字節(jié)(OptionBytes)用FlashROM作為存儲介質(zhì),地址空間在004800H~00487FH之間,共計128字節(jié)。內(nèi)嵌外設(shè)(包括通用I/O口、定時器、串行通信口以及AD轉(zhuǎn)換器等)的控制寄存器、狀態(tài)寄存器以及數(shù)據(jù)寄存器的映像地址,位于005000H~0057FFH之間,可用16位地址形式訪問。引導ROM存儲區(qū)(BootROM)位于006000H~0067FFH,大小為2KB,主要存放硬件復(fù)位引導程序,即006000H單元是STM8內(nèi)核CPU復(fù)位入口地址。程序存儲器(FlashROM)地址從008000H單元開始。這意味著,對于容量在32KB以內(nèi)的芯片,F(xiàn)lashROM地址空間為008000H~00FFFFH,即全部位于00段內(nèi),可使用16位地址形式訪問;而對于32KB以上FlashROM容量的芯片,須使用24位地址形式訪問。在STM8系統(tǒng)中,存儲單元內(nèi)字、雙字(由四個字節(jié)組成)等的存放規(guī)則是低字節(jié)存放在高地址中,高字節(jié)存放在低地址中,即采用“大端”方式。字存儲單元起始于字的低位地址,對應(yīng)于字存儲單元的高位字節(jié)。字可以按“對齊”方式存放,字低位地址起始于0、2、4、6等偶地址字節(jié);也可以按“非對齊”方式存放,字低位地址起始于1、3、5、7等奇地址字節(jié)。例如:

LDWX,0100H ;將0100H單元內(nèi)容送XH寄存器,將0101H單元內(nèi)容送XL寄存器—對齊

LDWX,0101H ;將0101H單元內(nèi)容送XH寄存器,將0102H單元內(nèi)容送XL寄存器—非對齊可見,字低位地址字節(jié)的a7~a0對應(yīng)于字的高8位b15~b8,字高位地址字節(jié)的a15~a8對應(yīng)于字的低8位b7~b0。3.1.1隨機讀寫RAM存儲區(qū)

STM8S內(nèi)部RAM容量在640B~6KB之間,起始地址為0X00000H,終了地址與芯片內(nèi)RAM存儲器容量有關(guān),可作為用戶RAM存儲區(qū)及堆棧區(qū)。RAM存儲區(qū)內(nèi)各單元地位相同,即讀寫指令、尋址方式相同,只是前256字節(jié)(00H~FFH)支持8位地址形式,指令碼短一些。例如:

LD$10,A ;累加器A送10H(8位地址)單元,指令碼為B710(兩字節(jié))

LD$100,A ;累加器A送0100H(16位地址)單元,指令碼為C70100(三字節(jié))

STM8S堆棧區(qū)位于RAM存儲區(qū)高端,特征是堆棧下向生長,數(shù)據(jù)壓入堆后,堆棧指針SP減??;且為空棧結(jié)構(gòu),數(shù)據(jù)先入堆,后修改堆棧指針SP。例如執(zhí)行“PUSH#$33”指令時,(SP)←33H,然后SP←SP?-?1。復(fù)位后,堆棧指針SP內(nèi)容與芯片內(nèi)部RAM容量有關(guān):含有6KBRAM的STM8S芯片,復(fù)位后SP為017FFH;含有2KBRAM的STM8S芯片,復(fù)位后SP為007FFH;含有1KBRAM的STM8S芯片,復(fù)位后SP為03FFH,即堆棧被安排在RAM存儲區(qū)的上端。3.1.2FlashROM存儲區(qū)

STM8S系列FlashROM存儲器數(shù)據(jù)總線為32位,即以4個字節(jié)作為一個基本的存儲單元—字(字起始地址最低兩位為00),一次可同時訪問4個字節(jié),但也可以只訪問其中的一個字節(jié)。FlashROM存儲區(qū)起始地址為008000H,終了地址與FlashROM存儲器容量有關(guān)。其中中斷向量表占用128個字節(jié),每個中斷向量占用4個字節(jié),用戶監(jiān)控程序可從008080H單元開始存放。為保護用戶關(guān)鍵程序代碼,以及中斷向量不因意外被誤寫,STM8S引入了用戶啟動代碼區(qū)UBC(UserBootCode)保護機制。因此,F(xiàn)lashROM存儲區(qū)可分為UBC(具有二級保護功能)和主程序區(qū)(只有一級保護功能)。為調(diào)節(jié)這兩個存儲區(qū)的相對大小,在FlashROM中引入了“Page”(頁)的概念,將整個FlashROM存儲區(qū)視為由若干頁組成,頁的大小與存儲器容量有關(guān)。為方便快速擦除,F(xiàn)lashROM存儲區(qū)被分成若干塊(Block),塊的大小與片內(nèi)FlashROM存儲器容量有關(guān),如表3-1所示。表3-1FlashROM存儲器頁、塊大小與容量的關(guān)系

1.?UBC存儲區(qū)

UBC存儲區(qū)起始于008000H單元,它是有還是沒有以及其值的大小(即UBC存儲區(qū)包含的Page數(shù)目)由選項字節(jié)OPT1定義,如表3-2所示。表3-2UBC存儲區(qū)大小與OPT1選項字節(jié)內(nèi)容的關(guān)系當OPT1[7:0]取00H、FFH以外的值時,UBC存儲區(qū)存在,大小與芯片F(xiàn)lashROM存儲器容量有關(guān)。例如,對于STM8S207R8芯片來說,當希望把8000H~DFFFH之間存儲區(qū)作為UBC存儲區(qū)時(共計24KB,即48頁),OPT1[7:0]內(nèi)容應(yīng)為46,即2EH。鑒于UBC存儲區(qū)具有二級保護功能,可將中斷向量表、無須修改的程序代碼及數(shù)表劃入UBC區(qū),而將需要通過IAP編程方式改寫的代碼、數(shù)據(jù)放在主存儲區(qū)內(nèi)。

2.主存儲區(qū)

UBC存儲區(qū)外的FlashROM存儲區(qū)稱為主程序區(qū)。如果沒有定義UBC,則主程序區(qū)起始地址為008080H單元,即中斷入口地址表外的所有FlashROM單元均屬于主程序區(qū)。如果定義了UBC存儲區(qū),則UBC存儲區(qū)之上的所有FlashROM單元屬于主程序區(qū)。3.1.3數(shù)據(jù)EEPROM存儲區(qū)數(shù)據(jù)EEPROM存儲區(qū)起始于004000H單元,大小在640B~2KB之間,組織方式與FlashROM相同,即EEPROM中頁、塊的大小與FlashROM相同。它主要用于存放需要經(jīng)常改寫的非易失性數(shù)據(jù),可重復(fù)擦寫30萬次以上,遠高于FlashROM存儲器(1萬次)。3.1.4硬件配置選項區(qū)硬件配置選項字節(jié)位于004800H~00487FH,共計128B。存儲介質(zhì)也是FlashROM存儲器,即具有非易失特性。它主要用于存放系統(tǒng)硬件配置信息,包括存儲器讀保護字節(jié)ROP以及與硬件配置有關(guān)的8個選項寄存器及其反碼寄存器,如表3-3所示。表3-3硬件配置選項字節(jié)在表3-3中:

(1)?OPT0為ROP(Read-OutProtection)。當該選項字節(jié)為0XAAH時,EEPROM、FlashROM存儲器中的信息就處于讀保護狀態(tài)。

(2)?OPT1定義了UBC代碼區(qū)的有無與大小。

(3)?OPTBL選項字節(jié)定義了復(fù)位后啟動方式,是執(zhí)行位于0X6000H開始的引導程序,還是執(zhí)行復(fù)位向量定義的指令碼。3.1.5通用I/O端口及外設(shè)寄存器區(qū)

STM8S通用I/O端口與外設(shè)寄存器(包括外設(shè)控制寄存器、狀態(tài)寄存器以及數(shù)據(jù)寄存器)的地址均位于005000H~0057FFH之間。3.1.6唯一ID號存儲區(qū)

STM8S系列MCU芯片提供了可按字節(jié)方式讀取,長度為96?bit(12Bytes)的唯一器件的ID號。該ID號可作為設(shè)備識別碼,為程序加密、升級安裝提供了身份驗證。不同系列STM8S芯片ID號存放位置略有差異,其中STM8S105、STM8S207、STM8S208系列芯片的ID號位于0048CDH~0048D8H之間,而STM8S103系列芯片的ID號位于004865H~004870H之間。3.2存儲器讀寫保護與控制寄存器3.2.1存儲器讀保護(ROP)選擇在ICP編程狀態(tài)下,如果選項字節(jié)OPT0(ROP)被編程為AAH,則EEPROM(DATA區(qū))、FlashROM(包括UBC和主程序區(qū))均處于讀保護狀態(tài)。用戶可在ICP編程狀態(tài)下,重新指定選項字節(jié)OPT0的內(nèi)容(置為00H),以解除存儲器的讀保護狀態(tài)。不過,一旦取消存儲器讀保護狀態(tài),芯片將自動擦除EEPROM(DATA區(qū))、FlashROM中的全部信息。

3.2.2存儲器寫保護芯片復(fù)位以后,F(xiàn)lash區(qū)、DATA區(qū)、選項字節(jié)就自動處于寫保護狀態(tài),避免意外寫入造成數(shù)據(jù)丟失。當需要對這些區(qū)域進行編程時,可按下述方式解除其寫保護狀態(tài)。通過IAP方式對UBC存儲區(qū)以外的主程序區(qū)進行編程前,必須向FLASH_PUKR寄存器連續(xù)寫入兩個MASS密鑰值(56H、AEH),解除主程序存儲區(qū)的寫保護狀態(tài)。如果輸入的MASS密鑰值不正確,則復(fù)位前主程序區(qū)就一直處于寫保護狀態(tài),再向FLASH_PUKR寄存器寫入的操作無效,即STM8S主存儲器寫保護采用“一錯即鎖”方式,以保證數(shù)據(jù)的可靠性。通過IAP方式對EEPROM數(shù)據(jù)區(qū)寫入前,必須向FLASH_DUKR寄存器連續(xù)寫入兩個MASS密鑰值(AEH、56H),解除EEPROM數(shù)據(jù)區(qū)的寫保護狀態(tài)。

(AEH、56H),解除選項字節(jié)的寫保護狀態(tài)。在FlashROM狀態(tài)寄存器FLASH_CR2的OPT為1、其反碼FLASH_NCR2的NOPT為0的情況下,即可對選項字節(jié)編程。值得注意的是,存儲器讀保護與寫保護特性相互獨立,即讀保護有效與寫保護是否有效無關(guān),反之亦然。3.2.3存儲器控制寄存器

Flash存儲器的特性、編程操作由下列寄存器控制。

1.控制寄存器1(Flash_CR1)

Flash_CR1寄存器主要控制Flash存儲器在不同狀態(tài)的供電。其表示及各位的含義如下:寄存器名:FLASH_CR1偏移地址:0X00H;復(fù)位初值:0X00H

HALT:在HALT狀態(tài)下,F(xiàn)lashROM電源狀態(tài)選擇。該位由軟件置1或清0,若其為0,當MCU處于停機狀態(tài)時,F(xiàn)lash處于掉電狀態(tài)(功耗小一些);若其為1,MCU處于停機狀態(tài)下,F(xiàn)lash處于加電狀態(tài)(功耗大一些)。

IE:Flash中斷允許。該位由軟件置1或清0,若其為0,禁止MCU響應(yīng)Flash編程結(jié)束EOP中斷、向保護頁寫操作錯誤WR_PG_DIS中斷請求(可采用查詢方式);若其為1,允許MCU響應(yīng)這兩個中斷請求。

FIX:編程周期選擇。若其為0,由MCU自動確定編程時間:當待寫入目標單元空白時,自動跳過擦除操作過程,編程時間只有正常時間的1/2;若其為1,無論目標單元是否空白,均執(zhí)行擦除操作,編程時間長。這一項最好設(shè)為0,即由MCU自動選擇編程時間。

2.?Flash控制寄存器2(Flash_CR2與Flash_NCR2)

Flash_CR2寄存器主要涉及Flash存儲器編程方式的選擇,該寄存器具有反碼寄存器Flash_NCR2。其表示及各位的含義如下:寄存器名:FLASH_CR2偏移地址:0X01H;復(fù)位初值:0X00H

OPT:選項字節(jié)編程選擇位(0禁止;1允許)。該位由軟件置1或清0。

WPRG:DataEEPROM和Flash主存儲區(qū)字編程選擇位(0禁止;1允許)。該位可由軟件置1,字編程結(jié)束后由硬件自動清0。

ERASE:塊擦除操作選擇位(0禁止;1允許)。該位可由軟件置1,塊擦除結(jié)束后由硬件自動清0。

FPRG:快速塊編程操作選擇位(0禁止;1允許)。該位可由軟件置1,快速塊編程結(jié)束后由硬件自動清0。

PRG:標準塊編程操作選擇位(0禁止;1允許)。該位可由軟件置1,標準塊編程結(jié)束后由硬件自動清0。由于任何時候只能進行一種操作,因此,最好用“MOV”指令初始化Flash_CR2與Flash_NCR2寄存器。

3.?FlashROM主存儲器寫解鎖密鑰寄存器FLASH_PUKR復(fù)位后,F(xiàn)lashROM主存儲器處于寫保護狀態(tài)(PUL位為0),向該寄存器順序?qū)懭?6H、AEH密鑰后,可解除其寫保護狀態(tài)。

4.?DataEEPROM存儲器寫解鎖密鑰寄存器FLASH_DUKR復(fù)位后,DataEEPROM存儲器、選項字節(jié)等均處于寫保護狀態(tài)(DUL位為0),向該寄存器順序?qū)懭階EH、56H密鑰后,可解除其寫保護狀態(tài)。

5.?Flash存儲器狀態(tài)寄存器(FLASH_IAPSR)

FLASH_IAPSR寄存器記錄了Flash存儲器的當前狀態(tài)。其表示及各位的含義如下:寄存器名:FLASH_IAPSR偏移地址:0X05H;復(fù)位初值:0X40H

HVOFF:編程高壓結(jié)束標志。該位只讀,硬件自動置1與清0。若其為1,表示編程高壓已經(jīng)關(guān)閉;若其為0,表示編程正在進行中。

DUL:“DataEEPROMareaunlockedflag”的簡稱。該位具有“硬件置1,軟件清0”的特征。若其為0,表示DataEEPROM存儲區(qū)處于寫保護狀態(tài);用戶通過MASS方式解除該存儲區(qū)寫保護狀態(tài)后,該位被硬件置1,表明DataEEPROM存儲區(qū)處于非保護狀態(tài)。

PUL:“FlashProgrammemoryunlockedflag”的簡稱。該位具有“硬件置1,軟件清0”的特征。若其為0,表示FlashROM主存儲區(qū)處于寫保護狀態(tài);用戶通過MASS方式解除該存儲區(qū)的寫保護狀態(tài)后,該位被硬件置1,表明FlashROM主存儲區(qū)處于非保護狀態(tài)。

EOP:編程結(jié)束標志,“Endofprogramming(writeoreraseoperation)flag”的簡稱。該位具有“硬件置1,軟件讀清0”的特征。當該位為1時,表示編程結(jié)束;為0時,表示沒有編程結(jié)束事件發(fā)生。

WR_PG_DIS:企圖向保護頁執(zhí)行寫操作錯誤標志,“Writeattemptedtoprotectedpageflag”的簡稱。該位具有“硬件置1,軟件讀清0”的特征。當該位為1時,表示向保護頁執(zhí)行了寫操作。3.3FlashROM存儲器IAP編程

FlsahROM內(nèi)的主程序區(qū)與EEPROM存儲區(qū)均支持單字節(jié)、字(4字節(jié))、塊(64字節(jié)或128字節(jié))擦除及編程。其中每一種編程方式又可分為標準編程方式和快速編程方式:當待寫入的目標存儲單元不是空白時,先擦除再寫入,編程時間包括了擦除時間與寫入時間,這就是所謂的“標準編程方式”;而當待寫入的目標存儲單元為空白時,無須擦除就可以直接寫入,編程時間縮短了一半,這就是所謂的“快速編程方式”。此外,STM8S105、STM8S207、STM8S208系列芯片的EEPROM還支持“讀同時寫”(RWW)操作功能,即允許在程序執(zhí)行過程中進行寫操作。注意:FalshROM主程序區(qū)沒有RWW功能。由于FlashROM一個基本存儲單元為字(4字節(jié)),因此字節(jié)編程時間與字編程時間相同。耗時最小的編程操作是預(yù)先擦除將要編程字節(jié)(字)所在塊,然后從最低地址開始,一次同時寫4字節(jié)。各種編程方式的特征如表3-4所示。表3-4編程特征3.3.1字節(jié)編程

STM8SFlashROM主程序區(qū)、DataFlashROM(EEPROM)存儲區(qū),均支持單字節(jié)擦除與編程操作。

1.DataFlashROM存儲區(qū)字節(jié)編程

DataFlashROM存儲區(qū)單字節(jié)編程操作,可采用查詢方式確定編程操作是否結(jié)束,而對于支持RWW操作的STM8S105、STM8S207、STM8S208子系列芯片,也可以采用中斷方式確定編程操作是否結(jié)束。對于支持RWW功能的芯片,即使采用查詢寫入EEPROM方式,但在寫入過程中依然可以響應(yīng)中斷請求。DataFlashROM存儲區(qū)單字節(jié)編程步驟如下:

(1)初始化編程控制寄存器FLASH_CR1選擇編程結(jié)束檢測方式:是查詢方式,還是中斷方式。

(2)向EEPROM寫保護寄存器FLASH_DUKR連續(xù)寫入AEH、56H,解除EEPROM的寫保護狀態(tài),使FlashROMIAP狀態(tài)寄存器FLASH_IAPSR的DUL位為1。

(3)向指定的EEPROM單元寫入新內(nèi)容即可。如果指定單元內(nèi)容空白,則立即啟動寫操作,寫操作時間較短;如果指定單元內(nèi)容不是空白,擦除后再寫入,只是時間較長(包含了擦除時間)。

(4)可用中斷或查詢方式確定寫入操作是否結(jié)束。

(5)必要時,對寫入信息進行校驗。

(6)清除FlashIAP編程寄存器FLASH_IAPSR的DUL位,避免誤寫入。值得注意的是,對EEPROM、OptionBytes、FlashROM進行IAP編程時,在調(diào)試中不能用單步執(zhí)行方式,否則操作無效。例3-1以查詢方式確定編程操作是否結(jié)束的DATAFlashROM字節(jié)編程操作子程序。

;入口參數(shù):

; :位于EEPROM內(nèi)的目標地址在索引寄存器X中

; :寫入內(nèi)容在累加器A中

;出口參數(shù):操作成功,IAP_OK_Symbol單元不是0

;使用資源:索引寄存器X,累加器A單元.EEPROM_BYTE_WIRE.L ;入口地址標號定義為L類型,以便64?KB以外調(diào)用

BTJTFLASH_IAPSR,#3,eeprom_byte_write_next1;?0,即狀態(tài)寄存器FLASH_IAPSR的DUL(b3)位=0,EEPROM處于寫保護狀態(tài),先解除寫保護狀態(tài)

MOVFLASH_DUKR,#0AEH ;向EEPROM寫保護寄存器FLASH_DUKR連續(xù)寫入;?AEH、56H,解除寫保護MOVFLASH_DUKR,#56Heeprom_byte_write_next1:MOVIAP_OK_Symbol,#4 ;定義重復(fù)操作的最大次數(shù)MOVFLASH_CR1,#00 ;?IE為0,即查詢方式;FIX為0,自動選擇編程周期eeprom_byte_write_LOOP1:LD(X),Aeeprom_byte_write_wait1:BTJFFLASH_IAPSR,#2,eeprom_byte_write_wait1 ;查詢等待編程操作結(jié)束;?校驗寫入信息CPA,(X)JREQeeprom_byte_write_exit ;校驗正確,則退出

;不正確,則重新寫入

DECIAP_OK_SymbolJRNEeeprom_byte_write_LOOP1 ;減1,不等于0,則繼續(xù)eeprom_byte_write_exit:BRESFLASH_IAPSR,#3 ;清除DUL位,恢復(fù)寫保護狀態(tài)RETFRETFRETFRETF

2.FlashROM主存儲區(qū)字節(jié)編程由于FlashROM主存儲區(qū)編程操作執(zhí)行時,CPU停止了應(yīng)用程序的執(zhí)行,因此對主存儲區(qū)進行編程操作時,可采用查詢方式判別編程操作是否結(jié)束。操作步驟與DataFlashROM字節(jié)編程類似,具體如下:

(1)初始化編程控制寄存器1(FLASH_CR1)選擇查詢方式確定編程操作是否結(jié)束。

(2)向FlashROM寫保護寄存器FLASH_PUKR連續(xù)寫入56H、AEH,解除FlashROM主存儲區(qū)的寫保護狀態(tài)(即使FlashROMIAP狀態(tài)寄存器FLASH_IAPSR的PUL位為1)。

(3)向FlashROM主存儲區(qū)目標單元寫入新內(nèi)容即可。如果指定單元內(nèi)容空白,則立即啟動寫操作,寫時間短;如果指定單元的內(nèi)容不是空白,自動擦除后再寫入,只是時間較長(包含了擦除時間)。

(4)查詢編程操作是否結(jié)束。

(5)檢查FLASH_IAPSR的b0(WR_PG_DIS)是否為0,否則表明出現(xiàn)向保護頁寫錯誤。

(6)必要時,對寫入信息進行校驗。

(7)清除FlashIAP編程寄存器FLASH_IAPSR的PUL位,避免誤寫入。例3-2FlashROM主存儲區(qū)字節(jié)編程操作子程序。

;?入口參數(shù):

; :位于FlashROM主存儲區(qū)內(nèi)的目標地址在IAP_First_ADR中

; :寫入內(nèi)容在累加器A中

;?出口參數(shù):操作成功,IAP_OK_Symbol單元不是0與80H(向保護頁進行寫操作標志)

;?使用資源:累加器A,IAP_OK_Symbol單元

;IAP_First_ADR ds.b 3 ;存放eeprom字首地址

;IAP_OK_Symbol ds.b 1 ;?IAP編程成功標志,成功時IAP_OK_Symbol不為0.FlashROM_Byte_Write.L ;入口地址定義為L類型,可以使用CALLF指令調(diào)用PUSHR00BTJTFLASH_IAPSR,#1,FlashROM_byte_write_next1;?0,即狀態(tài)寄存器FLASH_IAPSR的PUL(b1)位=0,F(xiàn)lashROM處于寫保護狀態(tài),先解除寫;保護狀態(tài)MOVFLASH_PUKR,#56H ;向FlashROM解保護寄存器FLASH_DUKR連續(xù)寫入56H、AEH,解除寫保護MOVFLASH_PUKR,#0AEHFlashROM_byte_write_next1:MOVIAP_OK_Symbol,#4 ;定義可重復(fù)操作的最大次數(shù)MOVFLASH_CR1,#00 ;?IE為0,即查詢方式;FIX為0,自動選擇編程周期FlashROM_byte_write_LOOP1:LDR00,A ;暫時保存寫入內(nèi)容到R00中LDF[IAP_First_ADR.e],AFlashROM_byte_write_wait1:LDA,FLASH_IAPSRBCPA,#04H ;僅保留b2位JREQFlashROM_byte_write_wait1 ;?b2位為0,說明編程操作尚未結(jié)束,等待BCPA,#01H ;僅保留b0位JREQFlashROM_byte_write_next2 ;?b0為0,說明沒有向保護寫操作;?b0(WR_PG_DIS)為1,表示向保護頁寫入操作錯誤MOVIAP_OK_Symbol,#80H ;錯誤標志JRTFlashROM_byte_write_exitFlashROM_byte_write_next2:;校驗LDFA,[IAP_First_ADR.e]CPA,R00JREQFlashROM_byte_write_exit;校驗不正確LDA,R00 DECIAP_OK_SymbolJRNEFlashROM_byte_write_LOOP1FlashROM_byte_write_exit:POPR00BRESFLASH_IAPSR,#1 ;清除PUL位,恢復(fù)寫保護狀態(tài)RETFRETFRETF當需要向FlashROM主存儲區(qū)寫入一個字節(jié)信息時,可按如下步驟初始化后,執(zhí)行CALLF指令即可。

MOV{IAP_First_ADR+0},#XXH ;初始化FlashROM字節(jié)地址高16位 MOV{IAP_First_ADR+1},#XXH ;初始化FlashROM字節(jié)地址高8位

MOV{IAP_First_ADR+2},#XXH ;初始化FlashROM字節(jié)地址低8位

LDA,#xxH ;初始化寫入內(nèi)容

CALLFFlashROM_Byte_Write ;調(diào)用FlashROM字節(jié)編程子程序

3.選項字節(jié)編程選項字節(jié)編程操作類似于DataEEprom字節(jié)編程,唯一區(qū)別是它需要通過FLASH控制寄存器FLASH_CR2、FLASH_NCR2開放選項字節(jié)編程操作。例3-3以查詢方式確定編程操作是否結(jié)束的選項字節(jié)編程操作子程序。

;?入口參數(shù):

; :選項字節(jié)地址在索引寄存器X中

; :寫入內(nèi)容在累加器A中

;?出口參數(shù):操作成功,IAP_OK_Symbol單元不是0

;?使用資源:索引寄存器X,累加器A.OPTION_BYTE_WIRE.L BTJTFLASH_IAPSR,#3,option_byte_write_next1 ;?0,即狀態(tài)寄存器FLASH_IAPSR的DUL(b3)位=0,EEPROM處于保護狀態(tài),先解除寫保護狀態(tài)

MOVFLASH_DUKR,#0AEH ;向EEPROM寫保護寄存器FLASH_DUKR連續(xù)寫入;?AEH、56H,解除寫保護

MOVFLASH_DUKR,#56Hoption_byte_write_next1: MOVIAP_OK_Symbol,#4 ;定義重復(fù)操作的最大次數(shù)

MOVFLASH_CR1,#00 ;?IE為0,即查詢方式;FIX為0,自動選擇編程周期 MOVFLASH_CR2,#80H ;將FLASH_CR2寄存器的b7位(OPT)置1,選擇選項編程方式

MOVFLASH_NCR2,#7FH ;將FLASH_NCR2寄存器的b7位(NOPT)清0,選擇選項編程方式option_byte_write_LOOP1: LD(X),Aoption_byte_write_wait1: BTJFFLASH_IAPSR,#2,option_byte_write_wait1 ;查詢等待編程操作結(jié)束

;校驗寫入信息 CPA,(X) JREQoption_byte_write_exit ;校驗正確,則退出

;不正確,則繼續(xù)

DECIAP_OK_Symbol JRNEoption_byte_write_LOOP1 ;減1,不等于0,則繼續(xù)option_byte_write_exit:BRESFLASH_IAPSR,#3 ;清除DUL位,恢復(fù)寫保護狀態(tài) BRESFLASH_CR2,#7 ;將FLASH_CR2寄存器的b7位(OPT)清0,禁止選項編程方式

BSETFLASH_NCR2,#7 ;將FLASH_NCR2寄存器的b7位(NOPT)置1,禁止選項編程方式

RETF RETF RETF RETF可以通過以下指令對指定選項字節(jié)進行編程:LDA,#XXH ;寫入內(nèi)容LDWX,#XXXXH ;指定選項字節(jié)對應(yīng)地址CALLFOPTION_BYTE_WIRE ;調(diào)用選項字節(jié)編程子程序,完成對應(yīng)項字節(jié)編程3.3.2字編程

字編程操作與字節(jié)編程操作規(guī)則相同,通過FLASH控制寄存器FLASH_CR2、FLASH_NCR2選擇字編程后,可一次連續(xù)寫入4個字節(jié),其目標地址必須始于字的首地址,即末位地址必須為00B或十六制的0H、4H、8H、CH,裝入時必須從字的首地址開始。

1.查詢方式例3-4EEPROM存儲區(qū)字編程操作子程序。;?入口參數(shù):; eeprom字首地址在索引寄存器X中(操作結(jié)束后首地址不變); 寫入內(nèi)容在寫入緩沖區(qū)IAP_write_data_buffer;?出口參數(shù):操作成功,IAP_OK_Symbol單元不是0;?使用資源:索引寄存器X,累加器A,IAP_OK_Symbol單元;IAP_OK_Symbol ds.b 1 ;?IAP編程成功標志(成功時IAP_OK_Symbol不為0);IAP_write_data_bufferDS.B128 ;緩沖區(qū)大小為128字節(jié).eeprom_WORD_WIRE.L ;寫入內(nèi)容在寫入緩沖區(qū)IAP_write_data_buffer中eeprom字 ;首地址在索引寄存器X中

BTJTFLASH_IAPSR,#3,eeprom_word_write_next1 ;?0,即狀態(tài)寄存器FLASH_IAPSR的DUL(b3)位=0,EEPROM處于保護狀態(tài),先解除保護狀態(tài)

MOVFLASH_DUKR,#0AEH ;向EEPROM寫保護寄存器FLASH_DUKR連續(xù)寫入

;?AEH、56H,解除寫保護

MOVFLASH_DUKR,#56Heeprom_word_write_next1: MOVIAP_OK_Symbol,#4 ;定義重復(fù)操作的最大次數(shù)

MOVFLASH_CR1,#00 ;?IE為0,即查詢方式;FIX為0,自動選擇編程周期eeprom_word_write_LOOP1: MOVFLASH_CR2,#40H ;將FLASH_CR2寄存器的b6位(WPRG)置1,選擇字編程方式

MOVFLASH_NCR2,#0BFH?;將FLASH_NCR2寄存器的b6位(NWPRG)清0,選擇字編程方式;?裝載 LDA,{IAP_write_data_buffer+0} ;取第0字節(jié)

LD(0,x),A LDA,{IAP_write_data_buffer+1} ;取第1字節(jié)

LD(1,x),A LDA,{IAP_write_data_buffer+2} ;取第2字節(jié)

LD(2,x),A LDA,{IAP_write_data_buffer+3} ;取第3字節(jié) LD(3,x),A;?裝載結(jié)束,內(nèi)部自動啟動寫操作eeprom_word_write_next2: BTJFFLASH_IAPSR,#2,eeprom_word_write_next2 ;查詢等待;?校驗 LD A,(0,X) ;取0號單元

XORA,{IAP_write_data_buffer+0} JRNEeeprom_word_write_next3 LD A,(1,X) ;取1號單元

XORA,{IAP_write_data_buffer+1} JRNEeeprom_word_write_next3 LD A,(2,X) ;取2號單元

XORA,{IAP_write_data_buffer+2} JRNEeeprom_word_write_next3 LD A,(3,X) ;取3號單元

XORA,{IAP_write_data_buffer+3} JREQeeprom_word_write_exit ;最后一個字節(jié)校驗正確eeprom_word_write_next3: ;校驗錯誤,重新裝入

DECIAP_OK_Symbol JRNEeeprom_word_write_LOOP1eeprom_word_write_exit: BRESFLASH_IAPSR,#3 ;清除DUL位,恢復(fù)寫保護狀態(tài)

RETF RETF RETF當需要向EEPROM存儲區(qū)寫入字信息時,可按如下步驟初始化后執(zhí)行CALLF指令即可。;初始化寫入緩沖區(qū)

MOV{IAP_write_data_buffer+0},#XXH MOV{IAP_write_data_buffer+1},#XXH MOV{IAP_write_data_buffer+2},#XXH MOV{IAP_write_data_buffer+3},#XXH ;初始化eeprom字首地址

LDWX,#XXXXH ;?EEPROM字首地址送寄存器X(EEPROM地址空間在

;?64KB范圍內(nèi),可采用16位地址形式) CALLFeeprom_WORD_WIRE ;調(diào)用eeprom字編程對FlashROM主存儲區(qū)字寫入操作,只需將DataFlash控制寄存器(位)更換為對應(yīng)的FlashROM控制寄存器(位)。不過FlashROM存儲區(qū)地址范圍可能超過64KB,需要使用24位地址表示,參考程序如例3-5所示。例3-5FlashROM存儲區(qū)字編程操作子程序。;入口參數(shù):; FlashROM字首地址在IAP_First_ADR中(操作結(jié)束后首地址不變); 寫入內(nèi)容在寫入緩沖區(qū)IAP_write_data_buffer;出口參數(shù):操作成功,IAP_OK_Symbol單元不是0;使用資源:累加器A,IAP_OK_Symbol單元;IAP_First_ADR ds.b 3 ;存放FlashROM塊首地址;IAP_OK_Symbol ds.b 1 ;?IAP編程成功標志(成功時IAP_OK_Symbol不為0);IAP_write_data_bufferDS.B128 ;緩沖區(qū)大小為128字節(jié).FlashROM_WORD_WIRE.L ;寫入內(nèi)容在寫入緩沖區(qū)IAP_write_data_buffer中

;?FlashROM字首地址在IAP_First_ADR中

PUSHR00 ;下面編程操作指令中使用了R00存儲單元

BTJTFLASH_IAPSR,#1,FlashROM_word_write_next1 ;?0,即狀態(tài)寄存器FLASH_IAPSR的PUL(b1)位?=?0,F(xiàn)lashROM處于保護狀態(tài),先解除保護狀態(tài)

MOVFLASH_PUKR,#56H ;向FlashROM解保護寄存器FLASH_PUKR連續(xù)寫入;?56H、AEH,解除寫保護

MOVFLASH_PUKR,#0AEHFlashROM_word_write_next1: MOVIAP_OK_Symbol,#4 ;定義重復(fù)操作的最大次數(shù)

MOVFLASH_CR1,#00 ;?IE為0,即查詢方式;FIX為0,自動選擇編程周期MOVFLASH_CR2,#40H ;將FLASH_CR2寄存器的b6位(WPRG)置1,選擇字編程方式MOVFLASH_NCR2,#0BFH ;將FLASH_NCR2寄存器b6位(NWPRG)清0,選擇字編程方式

MOVR00,{IAP_First_ADR+2} ;把首地址低8位保存在R00單元中FlashROM_word_write_LOOP1:;?裝載

LDA,{IAP_write_data_buffer+0} ;取第0字節(jié)

LDF[IAP_First_ADR.e],A LDA,{IAP_write_data_buffer+1} ;取第1字節(jié)

INC{IAP_First_ADR+2} LDF[IAP_First_ADR.e],A LDA,{IAP_write_data_buffer+2} ;取第2字節(jié)

INC{IAP_First_ADR+2} LDF[IAP_First_ADR.e],A LDA,{IAP_write_data_buffer+3} ;取第3字節(jié)

INC{IAP_First_ADR+2} LDF[IAP_First_ADR.e],A;?裝載結(jié)束,內(nèi)部自動啟動寫操作FlashROM_word_write_next2: BTJFFLASH_IAPSR,#2,FlashROM_word_write_next2 ;查詢等待

MOV{IAP_First_ADR+2},R00 ;取首地址低8位;?校驗 LDFA,[IAP_First_ADR.e] ;取0號單元

XORA,{IAP_write_data_buffer+0} JRNEFlashROM_word_write_next3 INC{IAP_First_ADR+2} ;下移一個Flash存儲單元,指向1號單元

LDFA,[IAP_First_ADR.e] XORA,{IAP_write_data_buffer+1} JRNEFlashROM_word_write_next3 INC{IAP_First_ADR+2} ;下移一個Flash存儲單元,指向2號單元

LDFA,[IAP_First_ADR.e] XORA,{IAP_write_data_buffer+2} JRNEFlashROM_word_write_next3 INC{IAP_First_ADR+2} ;下移一個Flash存儲單元,指向3號單元

LDFA,[IAP_First_ADR.e] XORA,{IAP_write_data_buffer+3} JRNEFlashROM_word_write_next3 ;?校驗正確

MOV{IAP_First_ADR+2},R00 ;取首地址低8位

JRTFlashROM_word_write_exitFlashROM_word_write_next3: MOV{IAP_First_ADR+2},R00 ;取首地址低8位 DECIAP_OK_Symbol JRNEFlashROM_word_write_LOOP1FlashROM_word_write_exit: BRESFLASH_IAPSR,#1 ;清除PUL位,恢復(fù)寫保護狀態(tài)

POPR00 RETF RETF RETF當需要向FlashROM主存儲區(qū)寫入一個字信息時,按下述步驟初始化后,執(zhí)行CALLF指令即可。

MOV{IAP_write_data_buffer+0},#XXH ;初始化緩沖區(qū)

MOV{IAP_write_data_buffer+1},#XXH MOV{IAP_write_data_buffer+2},#XXH MOV{IAP_write_data_buffer+3},#XXH;?初始化FlashROM字首地址

MOV{IAP_First_ADR+0},#XXH ;字首地址高16位

MOV{IAP_First_ADR+1},#XXH ;字首地址高8位

MOV{IAP_First_ADR+2},#XXH ;字首地址低8位

CALLFFlashROM_WORD_WIRE ;調(diào)用FlashROM字編程

2.中斷方式以上例子通過查詢方式確認編程操作是否結(jié)束,由于EEPROM寫入速度慢,因此也可以采用中斷方式確定編程操作是否結(jié)束。不過在每次EEPROM寫入前,必須檢查HVOFF標志位,避免上一次編程高壓操作未結(jié)束時,又啟動新的編程進程,造成數(shù)據(jù)丟失,參考程序如例3-6所示。例3-6EEPROM存儲區(qū)字編程操作子程序(中斷方式)。

IAP_First_ADR ds.b 3 ;存放EEPROM字首地址

IAP_OK_Symbol ds.b 1 ;?IAP編程成功標志(成功時IAP_OK_Symbol不為0)IAP_write_data_bufferds.b4 ;緩沖區(qū)大小為4字節(jié);?EEPROM字編程操作通過中斷確認方式編程操作是否結(jié)束子程序;?入口參數(shù):; EEPROM字首地址在IAP_First_ADR字存儲單元中; 寫入內(nèi)容在寫入緩沖區(qū)IAP_write_data_buffer;?出口參數(shù):操作成功,IAP_OK_Symbol單元不是0;?使用資源:累加器A.EEPROM_Int_WORD_WIRE.Leeprom_Int_word_write_next1:

BTJFFLASH_IAPSR,#6,eeprom_Int_word_write_next1 ;檢查HVOFF標志是否為1(高壓操作結(jié)

;束)編程高壓操作結(jié)束,可以啟動新的編程進程

MOVIAP_OK_Symbol,#4 ;定義可重復(fù)操作的最大次數(shù)

BTJTFLASH_IAPSR,#3,eeprom_Int_word_write_next2 ;?0,即狀態(tài)寄存器FLASH_IAPSR的DUL(b3)位=0,EEPROM處于保護狀態(tài),先解除保護狀態(tài)

MOVFLASH_DUKR,#0AEH ;向EEPROM寫保護寄存器FLASH_DUKR連續(xù)寫入;?AEH、56H,解除寫保護 MOVFLASH_DUKR,#56Heeprom_Int_word_write_next2: MOVFLASH_CR1,#02H ;?IE為1,即中斷方式;FIX為0,自動選擇編程周期

MOVFLASH_CR2,#40H ;將FLASH_CR2寄存器的b6位(WPRG)置1,選擇字編程方式

MOVFLASH_NCR2,#0BFH;將FLASH_NCR2寄存器的b6位(NWPRG)清0,選擇字編程方式;?裝載

PUSHWX LDWX,IAP_First_ADR} ;寫入EEPROM首地址存放在IAP_First_ADR字單元中

LDA,{IAP_write_data_buffer+0};取第0字節(jié)

LD(0,x),A LDA,{IAP_write_data_buffer+1};取第1字節(jié)

LD(1,x),A LDA,{IAP_write_data_buffer+2};取第2字節(jié)

LD(2,x),A LDA,{IAP_write_data_buffer+3};取第3字節(jié)

LD(3,x),A ;送最后一個字節(jié),啟動寫入操作過程

POPWX RETF RETF RETF RETF相應(yīng)的EEPROM中斷服務(wù)參考程序如下:

InterruptEEPROM_Int_ProcEEPROM_Int_Proc.LBTJFFLASH_IAPSR,#2,EEPROM_Int_Proc_exit ;不是編程結(jié)束標志EOP引起,退出

;編程結(jié)束EOP標志為1引起(在讀標志位同時,清除了EOP標志);?校驗 LDWX,IAP_First_ADR ;寫入EEPROM字首地址存放在IAP_First_ADR字單元中

LDA,(0,X) XORA,{IAP_write_data_buffer+0} JRNEEEPROM_Int_Proc_next1 LDA,(1,X) XORA,{IAP_write_data_buffer+1} JRNEEEPROM_Int_Proc_next1 LDA,(2,X) XORA,{IAP_write_data_buffer+2} JRNEEEPROM_Int_Proc_next1 LDA,(3,X) XORA,{IAP_write_data_buffer+3} JREQEEPROM_Int_Proc_exit ;?校驗正確跳轉(zhuǎn)EEPROM_Int_Proc_next1.L DECIAP_OK_Symbol ;寫入次數(shù)減1 JREQEEPROM_Int_Proc_exit ;重新裝入,再次啟動寫操作

LDWX,IAP_First_ADR ;寫入EEPROM首地址存放在IAP_First_ADR字單元中

LDA,{IAP_write_data_buffer+0} ;取第0字節(jié)

LD(0,X),A LDA,{IAP_write_data_buffer+1} ;取第1字節(jié)

LD(1,X),A LDA,{IAP_write_data_buffer+2} ;取第2字節(jié)

LD(2,X),A LDA,{IAP_write_data_buffer+3} ;取第3字節(jié)

LD(3,X),A ;送最后一個字節(jié),啟動寫入操作過程

IRET IRETEEPROM_Int_Proc_exit.L

BRESFLASH_IAPSR,#3 ;清除DUL位,恢復(fù)寫保護狀態(tài)

IRET IRET3.3.3塊編程

DataEEPROM和FlashROM均支持塊編程,效率比字節(jié)、字編程要快得多,畢竟一次可同時寫入一塊(64字節(jié)或128字節(jié))。所不同的是塊編程要求執(zhí)行編程操作的程序代碼必須部分,甚至全部均位于RAM中,給程序編寫帶來了一定的難度。

STM8支持三種塊編程方式:標準塊編程、快速塊編程以及塊擦除,彼此之間差別不大。下面以FlashROM標準塊編程為例,介紹塊編程思路與具體實現(xiàn)方法。對于中高密度芯片來說,塊大小為128?B,需要在RAM空間堆棧段前使用256字節(jié)作為寫入緩沖區(qū)與寫入代碼取存放區(qū),程序段如下:

IAP_First_ADR ds.b 3 ;存放FlashROM塊首地址

IAP_OK_Symbol ds.b 1 ;?IAP編程成功標志(成功時IAP_OK_Symbol不為0) segmentbyteatD00-DFF‘ram2’ ;將D00H~DFFH定義為ram2段

IAP_write_data_bufferDS.B128 ;緩沖區(qū)大小為128字節(jié)

FlashROM_Block_WIRE_CODE.LDS.B128 ;?

FlashROM塊編程代碼區(qū)(必須控制在128?B ;內(nèi))起始位置接著,在程序初始化部分將位于FlashROM中的塊編程代碼拷貝到ram2段中FlashROM塊寫入操作碼起始位置,參考程序如下:

;編程代碼轉(zhuǎn)移指令系列

LDWX,#FlashROM_Block_WIRE LDWY,#FlashROM_Block_WIRE_CODEmain_FlashROM_Block_W_COPY1:

LDA,(X) LD(Y),A CPWX,#FlashROM_Block_WIRE_END JREQmain_FlashROM_Block_W_COPY2 INCWY INCWX JRTmain_FlashROM_Block_W_COPY1main_FlashROM_Block_W_COPY2:位于FlashROM標準塊編程指令系列(不能含有絕對跳轉(zhuǎn)指令,如JP、JPF等)如下:;?FlashROM塊編程操作子程序;?入口參數(shù):; FlashROM塊首地址在IAP_First_ADR中; 寫入內(nèi)容在寫入緩沖區(qū)IAP_w

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論