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