|
launchpad430--TIMER--系列1
[复制链接]
技术说明
如图所示。。。在使用定时器之前,我们首先应该清楚我们将用这个定时器干什么,430的定时器功能比较丰富,
有定时、比较、捕获。
定时很好理解,就是设定好输入时钟以及计数个数后,定时器就会在输入时钟周期个数达到设定个数后发生中断,
你可以在中断中添加自己的处理程序。
定时器的模式有几种方式:STOP、UP、Continuous、UP/DOWN
这种模式就是定时器计数个数达到TACCR0寄存器中的数目时,发生TACCR0 CCIFG中断。
注意:此模式在定时器从TACCR0到0转变时也会发生TAIFG中断。
其他模式类似。
提示:建议在修改寄存器前,停止定时器。
定时器在设置除STOP外都立即开始计数。
信号源的选择
如果使用外部输入信号,在硬件设计上就应该连接这个引脚。
相关设置
- CCTL0 = CCIE; // CCR0 interrupt enabled
- CCR0 = 50000;
- TACTL = TASSEL_2 + MC_1; // SMCLK, upmode
从代码来看,我们应先设置相关的寄存器,然后启动定时器,也就是说定时的启动应该在最后。
多个中断的写法
查看头文件TAIV = TA0IV,这里只有CCR1、CCR2的中断,CCR0有自己的中断。
具体一点说
CCR0对应中断TIMER0_A0_VECTOR;CCR1、CCR2、TA0溢出对应TIMER0_A1_VECTOR。
- // Timer_A3 Interrupt Vector (TA0IV) handler
- #pragma vector=TIMER0_A1_VECTOR
- __interrupt void Timer_A(void)
- {
- switch( TA0IV )
- {
- case 2:
- // CCR1_hander();
- break; // CCR1 not used
- case 4:
- // CCR2_hander();
- break; // CCR2 not used
- case 10: P1OUT ^= 0x01; // overflow
- break;
- }
- }
完整例程
- #include
-
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
- P1SEL |= 0x06; // P1.1 - P1.2 option select
- P1DIR |= 0x07; // P1.0 - P1.2 outputs
- CCTL0 = OUTMOD_4 + CCIE; // CCR0 toggle, interrupt enabled
- CCTL1 = OUTMOD_4 + CCIE; // CCR1 toggle, interrupt enabled
- TACTL = TASSEL_2 + MC_2 + TAIE; // SMCLK, Contmode, int enabled
-
- _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
- }
-
- // Timer A0 interrupt service routine
- #pragma vector=TIMER0_A0_VECTOR
- __interrupt void Timer_A0 (void)
- {
- CCR0 += 200; // Add Offset to CCR0
- }
-
- // Timer_A2 Interrupt Vector (TA0IV) handler
- #pragma vector=TIMER0_A1_VECTOR
- __interrupt void Timer_A1(void)
- {
- switch( TA0IV )
- {
- case 2: CCR1 += 1000; // Add Offset to CCR1
- break;
- case 10: P1OUT ^= 0x01; // Timer_A3 overflow
- break;
- }
- }
该例程开启了三个中断CCR0、CCR1和TAC,且工作在Continue Mode,所以CCR0是每200时钟中断、CCR1是每1000时钟中断、TAC是每次溢出的时候中断。
|
|