鬆翰微控制器--SN8F5702學習筆記(六)TIMER2
定時器2是一個16位向上計數定時器,它有幾個可選的擴充套件:指定的過載值,比較輸出(PWM)和捕獲功能。定時器2由專用的16位組成計數器/定時器和四個16位捕獲/比較模組。 每個捕獲/比較模組都有它啟用時自己關聯的I / O.每個捕獲/比較模組可以配置為獨立執行在3種模式中的一種:比較,捕獲與上升沿或捕獲註冊寫。
1、Timer 2 向上計數控制
定時器2的時鐘源有三種工作模式:指定fcpu時鐘(fcpu / 12和fcpu / 24),使用停止控制和外部時鐘輸入指定fcpu時鐘。 下表對這些進行了分類三種操作模式及其相關暫存器(T2I1,T2I0和T2PS)。 一旦計時器的計數器是溢位(從0xFFFF到0x0000計數),TF2將立即發出,可以讀/寫通過韌體。 定時器2中斷功能由ET2控制。
T2I1 | T2I0 | T2PS | Timer 2 時鐘源 |
---|---|---|---|
0 | 0 | x | 關閉Timer2 |
0 | 1 | 0 | fcpu/12 |
0 | 1 | 1 | fcpu/24 |
1 | 1 | 0 | fcpu/12(T2引腳為低電平時停止計數,T2為高電平時恢復) |
1 | 1 | 1 | fcpu/24(T2引腳為低電平時停止計數,T2為高電平時恢復) |
1 | 0 | x | T2引腳上升沿(T2引腳時鐘速率≤0.5* fcpu) |
2、指定Timer2過載值
指定的過載值是一個可選功能,它可以通過溢位或重新載入定時器2計數器外部控制引腳。如果選擇了溢位過載,定時器2將CRCH / CRCL值複製到其計數器(TH2 / TL2)自動溢位訊號。 最終,定時器2將從CRCH / CRCL重複計數值為0xFFFF。另一方面,外部引腳T2RL的下降沿(與P2.0共用)也可以選擇為a過載訊號。 在這種情況下,如果T2RL,定時器2通常將其計數器從0x0000計數到0xFFFF引腳保持穩定,但計數器值將隨時由CRCH / CRCL值替換為只要T2RL引腳有下降訊號。 隨後,定時器2繼續其計數程式如果啟用了中斷功能,將發出CRCH / CRCL值和外部過載標誌(TF2RL)(ET2RL和ET2均已設定)。 外部過載中斷向量與定時器2中斷共享向量並通過韌體識別事件。
3、比較輸出
定時器2最多有四組比較輸出。 每組(CRC / CC1 / CC2 / CC3)獨立地將其值與定時器2計數器(TH2 / TL2)進行比較,並將T2COM0上的比較結果輸出到T2COM3引腳(與P00,P01,P03和P0.4共用)。 比較結果有兩種輸出方式:直接輸出和間接輸出。
直接方法是,如果CRC / CC1 / CC2 / CC3暫存器低於定時器2計數器,則對映引腳輸出低電平狀態;如果暫存器值等於/大於定時器2計數器,則輸出高電平狀態。 因此,輸出狀態在交叉點處改變兩次。 由於CRC / CC1 / CC2 / CC3暫存器等於定時器2計數器,因此發出TF2C0 / TF2C1 / TF2C2 / TF2C3標誌,可以通過韌體進行讀/寫。 比較中斷功能由ET2C0 / ET2C1 / ET2C2 / ET2C3控制。
相反,間接輸出方法是保持對映引腳先前輸出設定的事件,直到定時器2計數器超過CRC / CC1 / CC2 / CC3暫存器值。 在此模式下,輸出訊號的轉換可由軟體配置。 換句話說,當TH2 / TL2等於CRC暫存器時,P0.0暫存器位會影響T2COM0 / P0.0引腳。 定時器2溢位不會導致輸出更改。
4、捕獲功能
捕捉功能類似於秒錶的分割/圈數按鈕。 當定時器2計數器(TH2 / TL2)例行計數時,分離事件記錄CRC / CC1 / CC2 / CC3暫存器中的計數器值。
拆分事件可以來自硬體或軟體。 T2CC0引腳可觸發硬體分裂事件,該事件將TH2 / TL2值複製到CRCH / CRCL暫存器,而T2CC1,T2CC2和T2CC3分別控制CC1至CC3暫存器。
通過將任意值寫入CRCL / CCL1 / CCL2 / CCL3暫存器來觸發軟體拆分事件。 在對這些暫存器執行寫入指令時,當前的TH2 / TL2值將記錄在配對的暫存器中。
5、暫存器
暫存器 | Bit7 | Bit6 | Bit5 | Bit4 | Bit3 | Bit2 | Bit1 | Bit0 |
---|---|---|---|---|---|---|---|---|
T2CON | T2PS | I3FR | - | T2R1 | T2R0 | T2CM | T2I1 | T2I0 |
CCEN | COCA31 | COCA30 | COCA21 | COCA20 | COCA11 | COCA10 | COCA01 | COCA00 |
TH2 | TH27 | TH26 | TH25 | TH24 | TH23 | TH22 | TH21 | TH20 |
TL2 | TL27 | TL26 | TL25 | TL24 | TL23 | TL22 | TL21 | TL20 |
CRCH | CRCH7 | CRCH6 | CRCH5 | CRCH4 | CRCH3 | CRCH2 | CRCH1 | CRCH0 |
CRCL | CRCL7 | CRCL6 | CRCL5 | CRCL4 | CRCL3 | CRCL2 | CRCL1 | CRCL0 |
CCH3 | CCH37 | CCH36 | CCH35 | CCH34 | CCH33 | CCH32 | CCH31 | CCH30 |
CCL3 | CCL37 | CCL36 | CCL35 | CCL34 | CCL33 | CCL32 | CCL31 | CCL30 |
CCH2 | CCH27 | CCH26 | CCH25 | CCH24 | CCH23 | CCH22 | CCH21 | CCH20 |
CCL2 | CCL27 | CCL26 | CCL25 | CCL24 | CCL23 | CCL22 | CCL21 | CCL20 |
CCH1 | CCH17 | CCH16 | CCH15 | CCH14 | CCH13 | CCH12 | CCH11 | CCH10 |
CCL1 | CCL17 | CCL16 | CCL15 | CCL14 | CCL13 | CCL12 | CCL11 | CCL10 |
IEN0 | EAL | - | ET2 | ES0 | ET1 | - | ET0 | EX0 |
IEN1 | ET2RL | - | ET2C3 | ET2C2 | ET2C1 | ET2C0 | ESPI | EI2C |
IRCON | TF2RL | TF2 | TF2C3 | TF2C2 | TF2C1 | TF2C0 | - | - |
(1)T2CON暫存器
位 | 域 | 描述 |
---|---|---|
7 | T2PS | 定時器2預標量,0 是fcpu/12,1 是fcpu/24 |
6 | I3FR | 在比較模式下:0:當產生COM0中斷時 Timer2的內容變得不等於CRCregister。1:當產生COM0中斷時Timer2的內容變為等於CRC暫存器。在捕獲模式0:0:定時器2的內容將被鎖存到CRC中T2CC0的暫存器是下降沿。1:定時器2的內容將被鎖存到CRC中T2CC0暫存器正在上升沿。 |
5 | 保留 | |
4…3 | T2R | 指定的定時器2過載值。00:禁用 ,01:禁用,10:通過計數器溢位將CRCH / CRCL載入到TH2 / TL2,11:通過T2RL引腳將CRCH / CRCL載入到TH2 / TL2 |
2 | T2CM | 定時器2比較輸出。0:直接輸出方法,1:間接輸出,可以指定下一個輸出狀態 |
1…0 | T2I | 定時器2向上計數控制。00:禁用,01:時鐘速率由T2PS定義,10:時鐘源為T2引腳,11:時鐘速率由T2PS定義,具有T2引腳門控制 |
(2)CCEN暫存器
位 | 域 | 描述 |
---|---|---|
7…6 | COCA3 | CC3的比較和捕獲功能。00:禁用,01:通過T2CC3引腳上升沿捕獲,10:比較功能,11:通過寫CCL3暫存器進行捕獲 |
5…4 | COCA2 | CC3的比較和捕獲功能。00:禁用,01:通過T2CC2引腳上升沿捕獲,10:比較功能,11:通過寫CCL2暫存器進行捕獲 |
3…2 | COCA1 | CC3的比較和捕獲功能。00:禁用,01:通過T2CC1引腳上升沿捕獲,10:比較功能,11:通過寫CCL1暫存器進行捕獲 |
1…0 | COCA0 | CRC的比較和捕獲功能。00:禁用,01:通過T2CC0引腳上升沿捕獲,10:比較功能,11:通過寫入RCCL暫存器進行捕獲 |
(3)IEN0
位 | 域 | 描述 |
---|---|---|
7 | EAL | 中斷使能,參考中斷部分知識 |
5 | ET2 | 定時器2中斷使能 |
(4)IEN1
位 | 域 | 描述 |
---|---|---|
7 | ET2RL | T2定時器外部過載中斷控制位。0:禁用,1:啟用 |
6 | 保留 | 0 |
5 | ET2C3 | T2定時器COM3中斷控制位。0:禁用,1:啟用 |
4 | ET2C2 | T2定時器COM2中斷控制位。0:禁用,1:啟用 |
3 | ET2C1 | T2定時器COM1中斷控制位。0:禁用,1:啟用 |
2 | ET2C0 | T2定時器COM0中斷控制位。0:禁用,1:啟用 |
其他 | 參考其他章節 |
(5)IRCON暫存器
位 | 域 | 描述 |
---|---|---|
7 | TF2RL | T2定時器外部過載中斷請求標誌。 0:無TF2RL中斷請求,1:TF2RL中斷請求。 |
6 | TF2 | T2定時器中斷請求標誌。 0:無T2中斷請求,1:T2中斷請求 |
5 | TF2C3 | T2定時器 COM3中斷請求標誌位。0:無T2COM3中斷請求,1:T2COM3中斷請求。 |
4 | TF2C2 | T2定時器 COM2中斷請求標誌位。0:無T2COM2中斷請求,1:T2COM2中斷請求。 |
3 | TF2C1 | T2定時器 COM1中斷請求標誌位。0:無T2COM1中斷請求,1:T2COM1中斷請求。 |
2 | TF2C0 | T2定時器 COM0中斷請求標誌位。0:無T2COM0中斷請求,1:T2COM0中斷請求。 |
Else | Reserved |
(6)其他暫存器
暫存器 | 位 | 域 | 描述 |
---|---|---|---|
TH2/TL2 | 7…0 | TH2/TL2 | 定時器2 16位計數器暫存器 |
CRC | 7…6 | CRCH[15:0] | 16位比較/捕獲暫存器 |
CCH3/CCL3 | 7…6 | CCH3/CCL3 | 16位比較/捕獲暫存器 |
CCH2/CCL2 | 7…6 | CCH2/CCL2 | 16位比較/捕獲暫存器 |
CCH1/CCL1 | 7…6 | CCH1/CCL1 | 16位比較/捕獲暫存器 |
程式碼:
//=============================================================================
// Time = T2=1.5MS (65536 - 0xfc18)*12/16
//=============================================================================
#define TH2_Value 0xF8 //65536 - 63536 = 2000 2000 * 1/Fclk = 2000 * 12/16M = 1500us
#define TL2_Value 0x30
void scs_pwm_init(void)
{
T2CON = 0x01; //Fclk = Fcpu/12 = 167K
TH2 = TH2_Value; // Initial values
TL2 = TL2_Value;
ET2 = 1; // Timer2 interrupt enable
EAL = 1; // Golbal Interrupt enable
}
//-----------------------------------------------------------------------------
// Timer2 ISR
//-----------------------------------------------------------------------------
void Timer2_ISR(void) interrupt ISRTimer2 // Vector @ 0x2B
{
TF2 = 0; // Clear Timer2 overflow flag
TH2 = TH2_Value; // Initial values
TL2 = TL2_Value;
P20 = ~ P20; // P2.6 toggle
}