我在IAR EW 5.10中使用MSP430F5418。我想在up模式下使用定时器B。
我想使用两个中断。TimerB0(1 ms)和TimerB1(1秒)。
我的配置是
TBCTL = MC__UP + TBSSEL__ACLK + TBCLR;
TB0CCTL0 = CCIE;
TB0CCR0 = 32;
TB0CCTL1 = CCIE;
TB0CCR1 = 32768;在ISR上,我只切换了两个引脚。但只有TB0CCR0的引脚在切换。我的Pin配置是正确的。有人能告诉我为什么吗??
发布于 2012-06-14 18:45:57
我想你的问题是计时器周期。
MC__UP Up mode: Timer counts up to TBxCL0
所以当计时器达到TBxCL0时,你的计时器TBxR将重置为0,这似乎就是TB0CCR0的值。
所以它永远不会达到32768的值。
您可以使用TB0CCR1切换TB0CCR0,因此您的周期将为1秒。
为了获得1ms的中断,你需要每次递增你的TB0CCR1。
INTERRUPT ISR_1MS()
{
TB0CCR1 = (TB0CCR1 + 32) & 0x7FFF;
}但通常情况下,你不需要第二个计时器来进行第二次中断。
你可以简单地数出你的1ms间隔的1000倍。
INTERRUPT ISR_1MS()
{
ms_count++;
if (ms_count >= 1000)
{
ms_count=0;
// Do your second stuff
}
}如果你需要更多不同的intervalls,你可以换成另一种型号。
设置为系统时钟时间,并仅对照此时间进行检查。
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;
}https://stackoverflow.com/questions/11028327
复制相似问题