定时器A有两个中断向量
- CCR0 的中断向量
- TAxIV 的中断向量。TAxIV 是中断管理器,类似 8259 芯片。除了 CCR0 以外的 CCRx 的中断和 TAx 的中断都由 TAxIV 代理请求,它们自己不能直接请求。TAxIV占用一个中断向量,而不是多个。无论哪个中断源产生中断,进入的都是同一个中断服务程序。这时候要在中断服务程序中查询 TAxIV 寄存器的值来判断是哪个中断源引起中断,然后执行相应的程序。在 C 语言中可以使用 switch - case 语句。
TAxCCR0 CCIFG的优先级最高。
在捕获模式时,TAxCCRn 中被放入捕获值时就会置位对应的 CCIFG 中断标志位。在比较模式时,计数值达到 TAxCCRn中的值时就会置位对应的 CCIFG 中断标志位。只有TAxCCR0 CCIFG能自己发送中断请求,其他的 TAxCCRn CCIFG都由TAxIV代理。
定时器计数值达到某个数时,继续计数发生溢出,计数到 0H 时,会置位 TAIFG 中断标志位,由 TAxIV 代理请求中断。
在头文件中,对这两个中断向量的宏定义如下
#ifdef __ASM_HEADER__ /* Begin #defines for assembler */
#define TIMER0_A1_VECTOR ".int52" /* 0xFFE8 Timer0_A5 CC1-4, TA */
#else
#define TIMER0_A1_VECTOR (52 * 1u) /* 0xFFE8 Timer0_A5 CC1-4, TA */
#endif
#ifdef __ASM_HEADER__ /* Begin #defines for assembler */
#define TIMER0_A0_VECTOR ".int53" /* 0xFFEA Timer0_A5 CC0 */
#else
#define TIMER0_A0_VECTOR (53 * 1u) /* 0xFFEA Timer0_A5 CC0 */
#endif
TIMER0_A0_VECTOR 是 CCR0 的中断向量,TIMER0_A1_VECTOR 是 TAxIV 的中断向量。
F5529 的中断服务函数的定义方式如下
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR (void)
{
__delay_cycles(20);
GPIO_toggleOutputOnPin(GPIO_PORT_P1,GPIO_PIN0);
}
#pragma vector 后面的源操作数必须是头文件中的宏定义。
第二行中的函数名随便取,前面要有 __interrupt 标号
TAxIV 寄存器中的值在头文件中也有定义
/* T0A5IV Definitions */
#define TA0IV_NONE (0x0000) /* No Interrupt pending */
#define TA0IV_TACCR1 (0x0002) /* TA0CCR1_CCIFG */
#define TA0IV_TACCR2 (0x0004) /* TA0CCR2_CCIFG */
#define TA0IV_TACCR3 (0x0006) /* TA0CCR3_CCIFG */
#define TA0IV_TACCR4 (0x0008) /* TA0CCR4_CCIFG */
#define TA0IV_5 (0x000A) /* Reserved */
#define TA0IV_6 (0x000C) /* Reserved */
#define TA0IV_TAIFG (0x000E) /* TA0IFG */