2

我正在MSP430F5418使用IAR EW 5.10. 我想在 up 模式下使用 Timer B。

我想使用两个中断。TimerB0(1 毫秒)和 TimerB1(1 秒)。

我的配置是

TBCTL = MC__UP + TBSSEL__ACLK + TBCLR;
TB0CCTL0 = CCIE;
TB0CCR0 = 32;

TB0CCTL1 = CCIE;
TB0CCR1 = 32768;

在 ISR 上,我只是切换了两个引脚。但只有 TB0CCR0 的引脚在切换。我的引脚配置是正确的。谁能告诉我为什么??

4

1 回答 1

2

我想你的问题是定时器周期。
MC__UP Up mode: Timer counts up to TBxCL0

所以当你的定时器 TBxR 到达 TBxCL0 时,它会重置为 0,这似乎是 TB0CCR0 的值。

所以它永远无法达到 32768 的值。

您可以将 TB0CCR0 与 TB0CCR1 切换,因此您的周期将为 1 秒。
为了获得 1ms 的中断,您需要每次增加 TB0CCR1。

INTERRUPT ISR_1MS()
{
  TB0CCR1 = (TB0CCR1 + 32) & 0x7FFF;
}

但通常你不需要第二个计时器来进行第二个间隔。
您可以简单地计算 1000 次 1ms 间隔。

INTERRUPT ISR_1MS()
{
  ms_count++;
  if (ms_count >= 1000)
  {
    ms_count=0;
    // Do your second stuff
  }
}

如果您需要更多不同的间隔,您可以更改为另一个模型。
到系统时钟时间并仅检查该时间。

volatile unsigned int absolute_time=0;

INTERRUPT ISR_1MS()
{
  absolute_time++;
}

unsigned int systime_now(void)
{
    unsigned int result;
    di();
    result = absolute_time;
    ei();
    return result;
}

uint8_t systime_reached(unsigned int timeAt)
{
   uint8_t result;
   result = (systime_now() - timeAt ) < 0x1000;
   return result;
}
于 2012-06-14T10:45:56.693 回答