大家好、
我正在使用 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; } }