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