大家好、
我正在使用 MSP430FR6922控制器 RTC 模块。 我正在使用 RTC_C 模块。想使用 RTC 模块每隔1秒生成一次中断。我已经从 Resource Explorer">dev.ti.com/.../node 获取了 RTC 的示例代码
有人能不能详细解释一下如何产生1秒中断。 请详细说明计算...
谢谢
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
我正在使用 MSP430FR6922控制器 RTC 模块。 我正在使用 RTC_C 模块。想使用 RTC 模块每隔1秒生成一次中断。我已经从 Resource Explorer">dev.ti.com/.../node 获取了 RTC 的示例代码
有人能不能详细解释一下如何产生1秒中断。 请详细说明计算...
谢谢
您好、Sayali、
在此示例中、RTC_C 外设处于计数器模式、并设置为在8位溢出或256个计数时触发事件。
您的 ACLK 为32768Hz、它使用计时器0分频器进行8分频、然后再次使用计时器1分频器进行16分频。 根据 RTCCTL1寄存器中的 RTCSSELx 位、这个时钟被用作 RTC 的输入时钟。
因此、32768Hz/8/16 = 256Hz。 因此、要触发8位溢出事件、您需要256个计数/256Hz 或1秒。
此致、
Brandon Fisher
非常感谢 Bradon
那么、如果我现在想每0.125秒生成一次中断、我的计算如下:-
ACLK=32768/8/2=2048...SO、对于一个8位溢出256个计数/2048Hz=0.125秒
这是正确的吗?
我附上了供参考的代码:-
-
void RTC(void)
{
// Setup RTC Timer
RTCCTL0_H = RTCKEY_H; // Unlock RTC
// RTCCTL0_L = RTCTEVIE; // RTC event interrupt enable
RTCCTL1 = RTCSSEL_2 | RTCTEV_0 | RTCHOLD; // Counter Mode, RTC1PS, 8-bit ovf
RTCPS0CTL = RT0PSDIV1; // ACLK, /8
RTCPS1CTL = RT1SSEL1 | RT1PSDIV_0; // out from RT0PS, /2
RTCCTL1 &= ~(RTCHOLD); // Start RTC
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=RTC_VECTOR
__interrupt void RTC_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(RTC_VECTOR))) RTC_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch(__even_in_range(RTCIV, RTCIV_RT1PSIFG))
{
case RTCIV_NONE: break; // No interrupts
case RTCIV_RTCOFIFG: break; // RTCOFIFG
case RTCIV_RTCRDYIFG: break; // RTCRDYIFG
case RTCIV_RTCTEVIFG: // RTCEVIFG
count++;
if(count==8)
{
second++;
count=0;
}
// if(count==FinalDelaytime)
// {
// //timer stop
// TA0CCTL0 &= ~CCIE;
// //rtc disabled
// RTCPS1CTL &= ~RT1PSIE;
//
// P7OUT&=~ BIT0; // Relay off
// }
break;
case RTCIV_RTCAIFG: break; // RTCAIFG
case RTCIV_RT0PSIFG: break; // RT0PSIFG
case RTCIV_RT1PSIFG: break; // RTCRDYIFG
default: break;
}
}