本文主要是關(guān)于lpc2000的相關(guān)介紹,并著重對(duì)lpc2000的原理及其作用進(jìn)行了詳盡的闡述。
lpc2000
LPC2000系列的向量中斷控制器(VIC)支持32個(gè)中斷請(qǐng)求輸入,也即是支持32個(gè)中斷源,見表5.1。這32個(gè)中斷按順序稱為VIC通道0,VIC通道1,…,VIC通道31。
每一個(gè)VIC通道都支持軟件中斷與硬件中斷,即每個(gè)中斷均可由軟件或硬件中斷產(chǎn)生,軟件中斷與對(duì)應(yīng)通道上的硬件中斷是邏輯“或”的關(guān)系。軟件中斷可通過置位VICSoftInt寄存器相應(yīng)位來產(chǎn)生,也可通過置位VICSoftIntClear寄存器相應(yīng)位來清除。
LPC2000具有3類中斷:FIQ、向量IRQ和非向量IRQ。LPC2000系列可通過對(duì)VICIntSelect和VICVectCntlx(x=0,1,…,15)這兩類寄存器的設(shè)置,將以上的32個(gè)中斷源設(shè)置為這三類中斷的任何一種。其中,
快速中斷請(qǐng)求FIQ具有最高優(yōu)先級(jí)。建議只分配一個(gè)中斷請(qǐng)求給FIQ以減少中塅處理程序的延遲。當(dāng)然,VIC支持多個(gè)FIQ中斷。
向量IRQ具有中等優(yōu)先級(jí)。該級(jí)別最多可分配32個(gè)請(qǐng)求中的16個(gè)。32個(gè)請(qǐng)求中的任何一個(gè)都可以分配到16個(gè)向量IRQslot中的任意一個(gè)。其中,slot0具有最高優(yōu)先級(jí),而slot15則為最低優(yōu)先級(jí)。
非向量IRQ具有最低優(yōu)先級(jí)。
如何初始化某個(gè)中斷源為三類中斷中的一類
通過VICIntSelect中斷選擇寄存器將32個(gè)中斷請(qǐng)求分配為FIQ或IRQ(包括向量IRQ與非向量IRQ);通過VICVectCntlx(x=0,1,…,15)來選擇32個(gè)中斷請(qǐng)求中的某個(gè)為向量IRQ并設(shè)定此中斷請(qǐng)求為IRQ slotx(x對(duì)應(yīng)于VICVectCntlx中的x)。若某個(gè)中斷源被設(shè)定為IRQ,但卻未通過VICVectCntlx使能,則該中斷源將被默認(rèn)為非向量IRQ。
中斷處理過程中斷處理過程如下所示:
初始化:設(shè)置中斷源為3種中斷源之一,設(shè)置中斷地址,使能中斷,然后正常運(yùn)行用戶程序;
當(dāng)有IRQ中斷產(chǎn)生時(shí),VIC將會(huì)根據(jù)中斷源設(shè)置VICVectAddr寄存器為相應(yīng)中斷服務(wù)程序的地址,切換處理器工作模式為IRQ模式,并跳轉(zhuǎn)到IRQ中斷入口0x00000018處;
異常中斷向量表中0x00000018處使用“LDR PC, [PC, #-0xFF0]”,使得程序跳轉(zhuǎn)到(0x00000018+8-0x00000FF0=0xFFFFF030)存儲(chǔ)器處保存的地址。0xFFFFF030是VICVectAddr寄存器地址。也即是說:通過該指令,程序跳轉(zhuǎn)到VICVectAddr寄存器所指向的中斷服務(wù)程序的地址;
中斷服務(wù)程序執(zhí)行相應(yīng)的中斷處理,清除中斷。建議用__irq關(guān)鍵字定義中斷服務(wù)程序;
中斷服務(wù)完成后,即可返回原中斷點(diǎn)。返回時(shí)要同時(shí)切換處理器工作模式。
注意:退出中斷前,一定要對(duì)VICVectAddr寄存器寫0,通知VIC中斷結(jié)束;建議用__irq關(guān)鍵字定義中斷服務(wù)程序,這樣的話,該函數(shù)將自動(dòng)切換處理器工作模式,但該函數(shù)不能返回參數(shù)或者數(shù)值。
IRQ中斷
IRQ中斷有向量IRQ和非向量IRQ中斷兩種類型,當(dāng)IRQ中斷產(chǎn)生時(shí):
若是向量IRQ中斷,由于之前VIC已經(jīng)將最高優(yōu)先級(jí)請(qǐng)求的IRQ服務(wù)程序地址VICVectAddrx(x=0,1,…,15)裝入VICVectAddr,故程序跳入該中斷服務(wù)程序繼續(xù)執(zhí)行。
若是非向量IRQ中斷,VIC提供默認(rèn)服務(wù)程序地址VICDefVectAddr,IRQ中斷入口程序可通過讀取VIC的向量地址寄存器VICVectAddr來取得該地址,然后跳轉(zhuǎn)到相應(yīng)服務(wù)程序繼續(xù)執(zhí)行。該默認(rèn)服務(wù)程序由所有非向量IRQ公用,默認(rèn)服務(wù)程序可讀取IRQ狀態(tài)寄存器以確定哪個(gè)IRQ被激活。
lpc2000的工作原理
嵌入式處理器是嵌入式系統(tǒng)硬件最核心的部分,飛利浦推出十余款基于 ARM7 的高性能低功耗LPC2000系列微控制器,來滿足不斷增長的嵌入式市場(chǎng)需求。LPC2000系列微處理器工作頻率為60MHz,采用基于ARMTDMI內(nèi)核的32位RISC。LPC2000的外設(shè)接口非常豐富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。
這一系列微控制器LPC2114/2124/2119/2129/2194、LPC2210/2212/2214、LPC2290 /2292/2294借助片上存儲(chǔ)器加載模塊實(shí)現(xiàn)了“零等待訪問”高速閃存功能,提高了指令執(zhí)行的效率。在高性能低功耗的基礎(chǔ)上提供了增強(qiáng)的通信功能和片上代碼保護(hù)機(jī)制。由于內(nèi)置了寬范圍的串行通信接口,它們也非常適用于通信網(wǎng)關(guān)、協(xié)議轉(zhuǎn)換器、嵌入式軟調(diào)制解調(diào)器等。6通道的PWM更能用于復(fù)雜的馬達(dá)控制應(yīng)用。
LPC2000系列微控制器能夠?qū)崿F(xiàn)零等待訪問的高速閃存,這主要?dú)w功于片上的存儲(chǔ)器加速模塊。圖2為存儲(chǔ)器加速模塊的結(jié)構(gòu)框圖。128位寬度的閃存陣列通過單獨(dú)的局部總線與處理器接口,每周期可為ARM內(nèi)核提供四條32位指令。這使得MCU無需經(jīng)過等待狀態(tài)就可直接從閃存上執(zhí)行指令,從而消除了一般閃存讀取時(shí)的等待時(shí)間。為了解決指令序列的變化,指令和數(shù)據(jù)的不同處理帶來的等待時(shí)間,模塊內(nèi)部實(shí)現(xiàn)了預(yù)取緩沖器、避免數(shù)據(jù)讀/寫打亂地址序列的數(shù)據(jù)旁路和跳轉(zhuǎn)跟蹤緩沖器三個(gè)功能塊的聯(lián)合工作,并用兩組128位寬度的存儲(chǔ)器來進(jìn)行并行訪問,消除延時(shí)。
存儲(chǔ)器加速模塊的作用取決于系統(tǒng)時(shí)鐘的大小。LPC2000系列片上閃存的訪問時(shí)間為50nS,對(duì)于系統(tǒng)時(shí)鐘不高于20MHZ的應(yīng)用,在1個(gè)周期內(nèi)就可將閃存的內(nèi)容讀出,此時(shí)沒必要使用存儲(chǔ)器加速模塊。時(shí)鐘頻率越高,當(dāng)直接執(zhí)行閃存中的代碼時(shí),系統(tǒng)性能受影響越大,此時(shí)使能存儲(chǔ)器加速模塊,可以得到接近4倍速度的加速,真正實(shí)現(xiàn)零等待高速閃存。由于LPC2000可直接從閃存執(zhí)行指令,無需引導(dǎo)期間將代碼傳送到SRAM,這不僅省掉了耗時(shí)又耗能的系統(tǒng)啟動(dòng)步驟,還節(jié)省了昂貴的SRAM。
對(duì)片內(nèi)閃存的編程可通過幾種方法來實(shí)現(xiàn):通過內(nèi)置的串行JTAG 接口,通過串口進(jìn)行在系統(tǒng)編程(ISP),或通過在應(yīng)用編程(IAP)。
矢量中斷控制器
LPC2000系列的矢量中斷控制器可以支持最多32個(gè)中斷請(qǐng)求,可根據(jù)需要將其編程分為3 類:FIQ、矢量IRQ 和非矢量IRQ。快速中斷請(qǐng)求(FIQ)要求具有最高優(yōu)先級(jí)。矢量IRQ 具有中等優(yōu)先級(jí)。該級(jí)別可分配32個(gè)請(qǐng)求中的16個(gè)。非矢量IRQ 的優(yōu)先級(jí)最低。這種可編程分配機(jī)制意味著不同外設(shè)的中斷優(yōu)先級(jí)可以動(dòng)態(tài)分配并調(diào)整。對(duì)于任意矢量中斷,一旦發(fā)出請(qǐng)求,CPU可在一個(gè)周期內(nèi)過讀取VIC并跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序的入口地址,這將中斷延時(shí)降低到最小。
對(duì)lpc2000系列微控制器片內(nèi)flash編程的方法
1.LPC2000的Flash簡(jiǎn)介
Flash存儲(chǔ)器系統(tǒng)包含128kB Flash器件的16個(gè)扇區(qū)和256kB Flash器件的17個(gè)扇區(qū)。Flash存儲(chǔ)器從地址0開始并向上增加。Flash boot裝載程序同時(shí)提供片內(nèi)Flash存儲(chǔ)器的ISP和IAP編程接口。IAP、ISP和RealMonitor程序都位于boot扇區(qū)。boot扇區(qū)存在于所有的器件當(dāng)中。ISP和IAP命令不允許對(duì)boot扇區(qū)執(zhí)行寫/擦除/運(yùn)行操作。在128kB Flash器件中只有120kB Flash可供用戶程序使用。器件共包含256kB的Flash,其中,248kB的Flash可供用戶程序使用。Boot Block一般位于片內(nèi)Flash存儲(chǔ)器頂端。在128kB Flash中,它是第16個(gè)扇區(qū)(對(duì)應(yīng)的扇區(qū)號(hào)是15),在256kB Flash中,它是第18個(gè)扇區(qū)(對(duì)應(yīng)的扇區(qū)號(hào)是17)。Boot Block占有的Flash存儲(chǔ)器扇區(qū)不能用來存放用戶數(shù)據(jù)。
LPC2000系列提供在在應(yīng)用中編程IAP,最終用戶代碼直接執(zhí)行在應(yīng)用編程 (IAP)對(duì)片內(nèi)Flash存儲(chǔ)器進(jìn)行擦除和編程操作。Falsh可以擦寫10000次,512字節(jié)行編程時(shí)間為1ms。單扇區(qū)或整片擦除時(shí)間為400ms。
Flash存儲(chǔ)器在寫或擦除操作過程中不可被訪問。
執(zhí)行Flash寫/擦除操作的IAP命令使用片內(nèi)RAM頂端的32個(gè)字節(jié)空間。如果應(yīng)用程序中允許IAP編程,那么用戶程序不應(yīng)使用該空間。
很多8位單片機(jī)中有頁的概念,頁為Flash編程的最小單位,每次可以擦除和編程一個(gè)頁的內(nèi)容,由于頁中包含的字節(jié)較少,在這種情況下把Flash用作EEPROM靈活性會(huì)很好。而LPC2000系列沒有頁的概念,它只有扇區(qū)這個(gè)最小的Flash編程單位,即用戶即使是只修改一個(gè)字節(jié),也需要首先擦除8K的Flash。
把Flash當(dāng)作EEPROM的過程,其實(shí)就是對(duì)Flash進(jìn)行讀-修改-寫的過程。
2.向Flash中寫數(shù)據(jù)
Flash必須遵循選擇扇區(qū),擦除,選擇扇區(qū),寫的過程,具體到程序的編寫,必須先后有下面的代碼:
SelSector(1,1); // 選擇扇區(qū)1
EraseSector(1,1); // 擦除扇區(qū)1
SelSector(1,1); // 選擇扇區(qū)1
for(i=0;i《512;i++)
source[i]=0x41;
RamToFlash(0x00002000, (uint32)source, 512); // 寫數(shù)據(jù)到扇區(qū)1
應(yīng)用的時(shí)候需要注意下面幾點(diǎn):
1)如果寫之前沒有選擇扇區(qū),是不能正確寫入的。
2)如果寫之前沒有擦除,寫入是不正確的。
3)最少寫512字節(jié),寫入的字節(jié)數(shù)應(yīng)當(dāng)為512 或 1024 或 4096 或 8192.
4)Flash在擦寫時(shí)不能訪問,這也是IAP是要關(guān)閉中斷的原因。關(guān)中斷可以用下面的語句來實(shí)現(xiàn):__asm{MSR CPSR_c, #0xdf},與此對(duì)應(yīng),開中斷可以下面的語句:__asm{MSR CPSR_c, #0x5f}。
另外,經(jīng)常有人問如何將一個(gè)常量的數(shù)值定義在Flash的特定地址上,我覺得這個(gè)功能不太實(shí)用,因?yàn)槊看尾脸淖钚挝皇?K,到不如直接寫數(shù)據(jù)到Flash的一個(gè)地址,這個(gè)地址是在一個(gè)空扇區(qū)中,讀和寫都以這個(gè)地址為基址。由于編譯后的代碼是向下靠緊的,所以你可以查看一下編譯后的代碼量,然后選擇靠上的地址做為用的變量區(qū)。如果實(shí)在想把數(shù)組定義在Flash的特定位置好像可以用分散加載。
3. 從Flash中讀數(shù)據(jù)
從Flash中讀數(shù)據(jù)比較簡(jiǎn)單,可以定義一個(gè)指針變量,該指針變量指向特定的Flash地址,例如可以寫成下面的樣子:
uint32 i;
uint8 * p;
p=(uint8 *)0x1C000;
for(i=0;i《400;i++)
{
Puthexbyte(*(p++));
}
4. Flash的加密
代碼讀保護(hù) 這是Bootloader修訂版1.61的特性。代碼讀保護(hù)通過向Flash地址單元0x1FC(用戶Flash扇區(qū)0)寫入0x87654321(十進(jìn)制表示為2271560481)來使能。地址單元0x1FC用來允許為fiq異常處理程序保留部分空間。當(dāng)JTAG調(diào)試端口的代碼讀保護(hù)被使能時(shí),外部存儲(chǔ)器引導(dǎo)和以下ISP命令將被禁能:
? 讀存儲(chǔ)器
? 寫RAM
? 運(yùn)行
? 將RAM內(nèi)容復(fù)制到Flash
上述ISP命令終止時(shí)返回CODE_READ_PROTECTION_ENABLED。代碼讀保護(hù)使能時(shí),ISP擦除命令只允許擦除用戶扇區(qū)的內(nèi)容。這種限制是代碼讀保護(hù)不使能時(shí)所沒有的。IAP命令不受代碼讀保護(hù)的影響。
采用工程模板的RelInFlash會(huì)自動(dòng)加密。
5. 采用工程模板時(shí)需要注意的地方
采用ZLG的工程模板時(shí)需要注意下面幾點(diǎn):
1)修改堆棧,在STARTUP.S文件中的初始化堆棧為 StackUsr-20*4
2)設(shè)置編譯參數(shù)-apcs/intervork,需要注意是修改 Language Settings/ARM C Compiler/ATPS下面的。我一開始的時(shí)候不小心選擇的語言設(shè)置是ARM Assembler ,結(jié)果運(yùn)行程序后一寫Flash就錯(cuò),大家要選準(zhǔn)語言設(shè)置。
3)變量定義,由于一次至少寫512個(gè)字節(jié),所以跟讀寫操作的變量最好定義為uint32類型的,我犯的一個(gè)錯(cuò)誤是將變量定義為uint8類型的,如下面:
uint8 i;
for(i=0;i《512;i++)
source[i]=0x41;
RamToFlash(0x00002000, (uint32)source, 512); // 寫數(shù)據(jù)到扇區(qū)1
結(jié)果可想而知,一直在for循環(huán)中運(yùn)行而跳不出來,這到給我們一個(gè)IAP不好用的假象
結(jié)語
關(guān)于lpc2000的相關(guān)介紹就到這了,如有不足之處歡迎指正。
-
控制器
+關(guān)注
關(guān)注
112文章
16376瀏覽量
178194 -
lpc2000
+關(guān)注
關(guān)注
0文章
16瀏覽量
12741
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論