5748G学习(1)——PIT
- Periodic Interrupt Timer-Real Time Interrupt Timer (PIT-RTI)
- Register 简介
- 示例代码
- 官方示例代码
Periodic Interrupt Timer-Real Time Interrupt Timer (PIT-RTI)
5748G有PIT_0到PIT_15,共16个PIT channels。它们可以用于产生Interrupt,也可以用做特定外设的触发器。如图:
The PIT module is an array of timers that can be used to raise interrupts and triggers. It includes a dedicated Real Time Interrupt Timer (RTI), which runs on a separate clock and can be used for system wakeup in STOP mode.
Features
• One RTI (Real-Time Interrupt) timer to wakeup the CPU in stop mode
• Ability of timers to generate trigger pulses
• Ability of timers to generate interrupts
• Maskable interrupts
• Option to raise RTI interrupt, even when the bus clock is switched off
• Power saving with a separate input clock for the RTI timer. All other timers share.
one common core clock.
• Independent timeout periods for each timer
Register 简介
PIT Module Control Register (PIT_MCR)
PIT Upper Lifetime Timer Register (PIT_LTMR64H) and PIT Lower Lifetime Timer Register (PIT_LTMR64L)
当timer0与timer1链接时,用于获取当前值。
Timer Load Value Register (PIT_RTI_LDVAL)
设置定时器的起始值。
Current Timer Value Register (PIT_RTI_CVAL)
Timer Control Register (PIT_RTI_TCTRL)
Timer Flag Register (PIT_RTI_TFLG)
保存PIT的中断标志。在触发中断后,通过向此寄存器写1来清除中断标志。
Timer Load Value Register (PIT_LDVALn)
Current Timer Value Register (PIT_CVALn)
Timer Control Register (PIT_TCTRLn)
Timer Flag Register (PIT_TFLGn)
示例代码
官方示例代码
Initialization and application
// turn on PIT
PIT_MCR = 0x00;
// RTI
PIT_RTI_LDVAL = 0x004C4B3F; // setup RTI for 5000000 cycles
PIT_RTI_TCTRL = PIT_TIE; // let RTI generate interrupts
PIT_RTI_TCTRL |= PIT_TEN; // start RTI
// Timer 1
PIT_LDVAL1 = 0x0003E7FF; // setup timer 1 for 256000 cycles
PIT_TCTRL1 = TIE; // enable Timer 1 interrupts
PIT_TCTRL1 |= TEN; // start Timer 1
// Timer 3
PIT_LDVAL3 = 0x0016E35F; // setup timer 3 for 1500000 cycles
PIT_TCTRL3 |= TEN; // start Timer 3
configuration for chained timers
// turn on PIT
PIT_MCR = 0x00;
// Timer 2
PIT_LDVAL2 = 0x00000009; // setup Timer 2 for 10 counts
PIT_TCTRL2 = TIE; // enable Timer 2 interrupt
PIT_TCTRL2 |= CHN; // chain Timer 2 to Timer 1
PIT_TCTRL2 |= TEN; // start Timer 2
// Timer 1
PIT_LDVAL1 = 0x23C345FF; // setup Timer 1 for 600 000 000 cycles
PIT_TCTRL1 = TEN; // start Timer 1
configuration for the lifetime timer
// turn on PIT
PIT_MCR = 0x00;
// Timer 1
PIT_LDVAL1 = 0xFFFFFFFF; // setup timer 1 for maximum counting period
PIT_TCTRL1 = 0x0; // disable timer 1 interrupts
PIT_TCTRL1 |= CHN; // chain timer 1 to timer 0
PIT_TCTRL1 |= TEN; // start timer 1
// Timer 0
PIT_LDVAL0 = 0xFFFFFFFF; // setup timer 0 for maximum counting period
PIT_TCTRL0 = TEN; // start timer 0
//read first LTMR64H and then LTMR64L.
current_uptime = PIT_LTMR64H<<32;
current_uptime = current_uptime + PIT_LTMR64L;
PIT通道0初始化(基于官方例程)
void PIT0_init(uint32_t LDVAL) {
PIT.TIMER[0].LDVAL.R = LDVAL; /* Load # Pit clocks to count */
PIT.TIMER[0].TCTRL.B.TIE = 1; /* Enable interrupt */
// INTC.PSR[226].B.PRC_SELN0 = 0x8; /* IRQ sent to Core 0 ERROR!*/
INTC.PSR[226].B.PRC_SELN0 = 1; /* IRQ sent to Core 0 */
INTC.PSR[226].B.PRIN =10; /* IRQ priority = 10 (15 = highest) */
PIT.TIMER[0].TCTRL.B.TEN = 1; /* enable channel */
}
中断函数
void PIT0_isr(void) {
LED_DS4 = ~LED_DS4; /* Toggle DS4 LED port */
PIT.TIMER[0].TFLG.R = 1; /* Clear interrupt flag */
}
main函数中调用初始化函数
PIT0_init(40000000); /* Initialize PIT channel 0 for desired SYSCLK counts*/
/* timeout= 40M PITclks x 4 sysclks/1 PITclk x 1 sec/160Msysck */
/* = 40M x 4 / 160M = 160/160 = 1 sec. */
效果LED_DS4一秒一闪。