在程序中,需要延時(shí)的時(shí)候,通常狀況下有兩種方法:1、循環(huán)語句實(shí)現(xiàn),這種方法簡單易用,但是無法得到一個(gè)精確的延時(shí)時(shí)間;2、定時(shí)器定時(shí),可達(dá)到精確延時(shí)。
什么是中斷:CPU在處理某一事件A時(shí),發(fā)生的另外某一事件B請求CPU去處理(產(chǎn)生了中斷),隨后CPU暫時(shí)中斷當(dāng)前正在執(zhí)行的任務(wù),去對事件B進(jìn)行處理,CPU處理完事件B后再返回之前中斷的位置繼續(xù)執(zhí)行原來的事件A,這一過程總稱為中斷。
中斷流程示意圖
使CPU中斷的事件稱中斷源。中斷源向CPU發(fā)出中斷請求,CPU暫時(shí)中斷原來執(zhí)行的事件A轉(zhuǎn)去做事件B。事件B處理完畢后繼續(xù)返回原先中斷的地方(該過程稱中斷返回,原先中斷的地方為斷點(diǎn)),繼續(xù)執(zhí)行原先的事件。
中斷的優(yōu)先級
中斷的好處
(1):提高了CPU的效率
CPU是計(jì)算機(jī)的指揮中心,它與外圍設(shè)備(如:按鍵,顯示器等)通訊的方法有查詢和中斷2種
1:查詢:無論外圍i/o是否需要服務(wù),CPU每隔一段時(shí)間都要依次查詢一遍,這種查詢的方法,CPU需要花費(fèi)一些時(shí)間在做查詢的服務(wù)工作
2:中斷:在外圍設(shè)備需要通訊服務(wù)時(shí)主動告訴CPU,CPU停下當(dāng)前工作去處理中斷程序,從而提高了CPU的工作效率。
(2):可以實(shí)現(xiàn)實(shí)時(shí)處理
外設(shè)任何時(shí)候都可能發(fā)出請求中斷的信號,CPU接到請求后及時(shí)處理,以滿足實(shí)時(shí)系統(tǒng)的需要
(3):可以及時(shí)處理故障
計(jì)算機(jī)系統(tǒng)運(yùn)行過程中難免會出現(xiàn)故障,eg:電源中斷,存儲器出錯(cuò),外圍設(shè)備工作不正常等,這時(shí)可以通過中斷系統(tǒng)向中斷源的CPU發(fā)出請求,以便解決故障。
1.打開總中斷:
EA(ENABLE ALL) = 1;
2.設(shè)置定時(shí)器工作方式:
TMOD寄存器:定時(shí)器/計(jì)數(shù)器模式控制寄存器
其中M1和M0是定時(shí)器工作方式的設(shè)置位,共可設(shè)置4種工作方式。
方式0(M1M0 = 00):13位定時(shí)/計(jì)數(shù)器
方式1(M1M0 = 01):16位定時(shí)/計(jì)數(shù)器 //通常采用方式1
方式2(M1M0 = 10):8位自動重裝定時(shí)/計(jì)數(shù)器
方式3(M1M0 = 11):T0分為兩個(gè)獨(dú)立的8為定時(shí)/計(jì)數(shù)器;T1在此方式停止計(jì)數(shù)
3.定時(shí)器填裝初值
填裝初值要點(diǎn):
①單片機(jī)晶振頻率:12M,震蕩周期為1/12us
②標(biāo)準(zhǔn)的51單片機(jī)為12T,即12個(gè)時(shí)鐘周期, 12 x 1/12 us = 1us,即加一次1us。
例如:將定時(shí)器設(shè)置在工作方式1,初值設(shè)為10ms:
TMOD = 0x01;
TH0 = (65536 - 10000);//10000代表10000個(gè)1us
TL0 = (65536 - 10000);
4.打開定時(shí)器中斷
ET0 = 1:ENABLE TIME0
ET1 = 1: ENABLE TIME1
5.打開定時(shí)器(開始計(jì)數(shù))
TR0 = 1:打開定時(shí)器0
TR1 = 1:打開定時(shí)器1
6.寫中斷服務(wù)函數(shù)(ISR)
注意:中斷服務(wù)函數(shù)不能有參數(shù)和返回值
注意:
1:定時(shí)器和中斷都屬于單片機(jī)的內(nèi)部資源,在開發(fā)板上是沒有芯片的,同時(shí)定時(shí)器的初始化程序一旦溢出,會自動去執(zhí)行定時(shí)器中斷子程序,而不需要我們自己去調(diào)用,這些都是由硬件直接控制的。
2:定時(shí)器計(jì)算的是固定脈沖,其定時(shí)時(shí)間是可以計(jì)算出來的。它比延時(shí)函數(shù)有更好的作用,能提高CPU 的效率,因?yàn)檠訒r(shí)函數(shù)是需要耗費(fèi)CPU去執(zhí)行的,在此期間,CPU是不能執(zhí)行其它功能的,而定時(shí)器是需要用到 的時(shí)候,CPU自動調(diào)用。
系統(tǒng)時(shí)鐘
首先,應(yīng)先了解s3c2440的時(shí)鐘系統(tǒng)。MCU的主時(shí)鐘源主要是外部晶振或外部時(shí)鐘,目前用的最多的是外部晶振。MINI2440開發(fā)板使用一個(gè)12MHz的外部晶振,如果CPU只工作在12MHz頻率下,開發(fā)板的使用效率非常低,所有依賴系統(tǒng)時(shí)鐘工作的硬件,其工作效率也非常低,如果想提高CPU的工作效率,則需要對輸入時(shí)鐘進(jìn)行一系列處理,其流程如下:
晶振頻率通過PLL(鎖相環(huán))進(jìn)行倍頻處理。s3c2440有兩個(gè)PLL,分別是UPLL和MPLL。UPLL專用于USB模塊,提供48MHz,MPLL提供FCLK、HCLK和PCLK。FCLK是主頻時(shí)鐘,用于ARM920T內(nèi)核;HCLK用于AHB總線設(shè)備,如內(nèi)存控制、中斷控制、LCD控制、DMA以及USB主模塊;PCLK用于APB總線設(shè)備,如外圍設(shè)備的看門狗,IIS,I2C,PWM,MMC接口,ADC,UART,GPIO,RTC以及SPI。
s3c2440支持FCLK、HCLK和PCLK之間的分頻比例選擇,該比例由CLKDIVN寄存器中的HDIVN和PDIVN來決定。因此,我們只需確定FCLK,即可通過設(shè)定HDIVN和PDIVN來確定HCLK和PCLK。
FCLK與輸入時(shí)鐘Fin之間的倍數(shù)關(guān)系(即晶振頻率通過PLL倍頻)是通過MPLLCON寄存器(如圖1所示)來設(shè)置的,MPLLCON寄存器中包含3個(gè)參數(shù):MDIV、PDIV、SDIV,公式如下:
MPLL(FCLK) = (2*m*Fin) / (p*2^s)
其中:m = MDIV + 8 , p = PDIV + 2 ,s = SDIV
圖1 MPLLCON寄存器
總結(jié)一下,時(shí)鐘產(chǎn)生流程為:外部時(shí)鐘源→通過寄存器MPLLCON得到FCLK→再通過寄存器CLKDIVN得到HCLK和PCLK。
定時(shí)器
s3c2440有5個(gè)16-bit的定時(shí)器,定時(shí)器0、1、2、3具有PWM功能;定時(shí)器4只有一個(gè)內(nèi)部定時(shí)而沒有關(guān)聯(lián)到輸出管腳上;同時(shí),定時(shí)器0有一個(gè)dead-zeno產(chǎn)生器,用于大電流設(shè)備。
定時(shí)器的輸入時(shí)鐘頻率信號跟預(yù)分頻器(prescaler)和分頻器(divider)相關(guān)。如圖2所示。
預(yù)分頻器:定時(shí)器0和1共享一個(gè)8-bit預(yù)分頻器,定時(shí)器2、3、4共享另一個(gè)8-bit預(yù)分頻器,預(yù)分頻器數(shù)值由TCFG0配置,取值范圍是0~255。
分頻器:同時(shí),每一個(gè)定時(shí)器都分別有一個(gè)時(shí)鐘分頻器,這樣就可以產(chǎn)生5個(gè)不同的分頻信號,分頻器數(shù)值由TCFG1配置,取值只能是2、4、8、16,或者外部TCLKn。
圖2 定時(shí)器輸入時(shí)鐘框圖
具體公式為:
定時(shí)器輸入時(shí)鐘頻率=PCLK ÷ (prescaler+1) ÷ divider
比如,已知PCLK=50MHz,我們希望某一個(gè)定時(shí)器的輸入時(shí)鐘頻率為25KHz,那么我們就需要配置prescaler=249,divider=8,則遞減計(jì)數(shù)器每減一次1,時(shí)間就過去0.04ms(1÷25000×1000)。
TCONn為定時(shí)器控制寄存器,控制定時(shí)器的開啟與關(guān)閉。
定時(shí)計(jì)數(shù)緩沖寄存器TCNTBn用于存儲定時(shí)器的初始值,當(dāng)定時(shí)器啟動時(shí),TCNTBn里的數(shù)值會被加載到遞減計(jì)數(shù)器TCNTn中。
定時(shí)比較緩沖寄存器TCMPBn用于存儲定時(shí)器的比較值,TCMPBn的數(shù)值會被加載到比較寄存器TCMPn里來跟遞減計(jì)數(shù)器進(jìn)行比較。
工作原理為:
(1)將定時(shí)器的初始值和比較值裝入寄存器TCNTBn和TCMPBn中。
(2)設(shè)置定時(shí)器控制寄存器TCON,啟動定時(shí)器。此時(shí),TCMPBn和TCNTBn中的值會加載到寄存器TCMPn和TCNTn中。
(3)定時(shí)器會減1計(jì)數(shù),即TCNTn進(jìn)行減1計(jì)數(shù),當(dāng)TCMPn=TCNTn時(shí),TOUTn引腳輸出取反。
在通常應(yīng)用中,TCMPBn的值用于PWM,當(dāng)遞減計(jì)數(shù)器和比較計(jì)數(shù)器數(shù)值相等時(shí),電平會翻轉(zhuǎn),從而達(dá)到改變占空比的目的。如果僅僅是用于定時(shí)中斷,那么將TCMPBn設(shè)置為0,則當(dāng)遞減計(jì)數(shù)器達(dá)到0時(shí),定時(shí)器中斷請求通知CPU定時(shí)器操作已經(jīng)完成。當(dāng)定時(shí)器計(jì)數(shù)器到達(dá)零時(shí), 相應(yīng)的 TCNTBn的值將自動被加載到遞減計(jì)數(shù)器以繼續(xù)下一次操作。然而,如果定時(shí)器停止了,例如,在定時(shí)器運(yùn)行模式期間清除TCONn的定時(shí)器使能位, TCNTBn的值將不會被重新加載到計(jì)數(shù)器中。
s3c2440的定時(shí)器有一個(gè)雙緩沖功能,保證下次定時(shí)器操作時(shí)重加載的值改變時(shí)無需停止當(dāng)前的定時(shí)器操作。所以新的定時(shí)器的值設(shè)定,當(dāng)前的定時(shí)器操作也可以成功完成。定時(shí)器的值可以寫到TCNTBn中,定時(shí)器的當(dāng)前計(jì)數(shù)值可以從TCNTOn中讀到。TCNTBn被讀取的值,不表明計(jì)數(shù)器的當(dāng)前狀態(tài),而是下一次定時(shí)器持續(xù)期間的重加載值。當(dāng)TCNTn為0,自動重加載操作會復(fù)制TCNTBn到TCNTn中。但是,如果TCNTn為0,而自動重加載的使能位為0,那么TCNTn不會再操作了。
配置完定時(shí)器相關(guān)內(nèi)容,接下來是配置中斷,如設(shè)置中斷模式(IRQ或FIQ),將定時(shí)器執(zhí)行函數(shù)對應(yīng)定時(shí)中斷入口地址等等,這里不多加贅述。