这是我MSP430F5529开发板上的代码:
#include "msp430f5529.h"
#include "MSP-EXP430F5529_HAL\HAL_Dogs102x6.h"
int n = 0, temp = 0;
#pragma vector = TIMER0_A0_VECTOR
__interrupt void Time_A(void)
{
n++; //进中断时间累加1秒
//当进入TACCR0中断后,TACCR0 CCIFG标志自动复位。
Dogs102x6_intDraw(0, 0, n, DOGS102x6_DRAW_NORMAL);
}
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(TA0IV) //TA0IV在被访问后会自动归零
case TA0IV_TA0CCR1:
{
temp = TA0CCR1; //TA0CCR1=0;
Dogs102x6_intDraw(1, 0, temp, DOGS102x6_DRAW_NORMAL);
P8OUT ^= BIT1; //进中断小灯取反
//TA0IV = 0;
break;
}
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
uint16_t i, j;
TA0CTL |= TASSEL__ACLK + TACLR + MC_1; //Time A0定时/计数器时钟来源选择
//以及清除时钟分频器和计数方向
//设定增计数模式
P1SEL |= BIT1;
TA0CCTL0 |= CCIE; //计数/定时器中断使能
TA0CCTL1 |= CM_1 + CCIE + CAP + SCS; //设置TA0CCR1为捕获模式,上升沿捕获,允许中断,同步捕获
TA0CCR0 = 32768; //TA0CCR0的计数周期:"1/32768"*16384*2=1s
P8DIR |= BIT1; //将P8.1设置为输出
Dogs102x6_init();
Dogs102x6_backlightInit();
Dogs102x6_clearScreen();
Dogs102x6_setBacklight(11);
_EINT(); //打开总中断
for(;;)
{
//LPM3; //进入低功耗模式3
TA0CCTL1 |= CCIS_2; //软件模拟CCR1给入GND
for(i=0;i<100;i++)
for(j=0;j<10;j++);
TA0CCTL1 |= CCIS_3; //软件模拟CCR1给入VCC,模拟上升沿脉冲
_NOP();
}
return 0;
}
为什么我的捕获程序只能捕获第一次下降沿?TA0CCTL1 |= CM_1不是上升沿吗?而且第一次进了A1中断后就进不了第二次了,就算我将TA0IV置0也没有用,这是为何?
另外我还发现一个现象,在A0中断的时候强制TA0CCR1=0;液晶显示屏上的数任然不是0,这是为何?