利用外部中断测量GPS的PPS脉冲信号,计算得到32.768k晶振频率误差,当RTC设置为日历模式时,修正后误差小于1ppm,而RTC设置为COUNTER模式时,修正值不能生效
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.
利用外部中断测量GPS的PPS脉冲信号,计算得到32.768k晶振频率误差,当RTC设置为日历模式时,修正后误差小于1ppm,而RTC设置为COUNTER模式时,修正值不能生效
void set_rtc_calibration(int16_t ppm)
{
if(ppm >= 0)
{
RTC_C_setCalibrationData(RTC_C_BASE,RTCOCALS,ppm);
}
else
{
RTC_C_setCalibrationData(RTC_C_BASE,(!(RTCOCALS)),-ppm);
}
}
int hw_rtc_init(void)
{
RTC_C_holdClock(RTC_C_BASE);
RTC_C_initCounter(RTC_C_BASE,RTC_C_CLOCKSELECT_RT1PS,RTC_C_COUNTERSIZE_32BIT);
RTC_C_initCounterPrescale(RTC_C_BASE,RTC_C_PRESCALE_0,RTC_C_PSCLOCKSELECT_ACLK,RTC_C_PSDIVIDER_256);
RTC_C_initCounterPrescale(RTC_C_BASE,RTC_C_PRESCALE_1,RTC_C_PSCLOCKSELECT_RT0PS,RTC_C_PSDIVIDER_128);
// RTC_C_definePrescaleEvent(RTC_C_BASE,RTC_C_PRESCALE_1,RTC_C_PSEVENTDIVIDER_128);
// /*温度补偿*/
// RTC_C_setTemperatureCompensation(RTC_C_BASE,RTC_C_COMPENSATION_DOWN1PPM,200);
// //清中断
// RTC_C_clearInterrupt(RTC_C_BASE,RTCRDYIFG + RTCTEVIFG + RTCAIFG);
//
// //中断打开
// RTC_C_enableInterrupt(RTC_C_BASE, RTC_C_OSCILLATOR_FAULT_INTERRUPT + RTC_C_PRESCALE_TIMER1_INTERRUPT);
//启动rtc
RTC_C_startClock(RTC_C_BASE);
return 0;
}void set_rtc_calibration(int16_t ppm)
{
if(ppm >= 0)
{
RTC_C_setCalibrationData(RTC_C_BASE,RTCOCALS,ppm);
}
else
{
RTC_C_setCalibrationData(RTC_C_BASE,(!(RTCOCALS)),-ppm);
}
}
int hw_rtc_init(void)
{
RTC_C_holdClock(RTC_C_BASE);
// RTC_C_setCalibrationFrequency(RTC_C_BASE,RTC_C_CALIBRATIONFREQ_512HZ);
// /*配置rtcclk引脚,count mode 无法使用该功能*/
// GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1,GPIO_PIN0,GPIO_SECONDARY_MODULE_FUNCTION);
// /*温度补偿*/
// RTC_C_setTemperatureCompensation(RTC_C_BASE,RTC_C_COMPENSATION_UP1PPM,60);
/*设置事件*/
RTC_C_definePrescaleEvent(RTC_C_BASE,RTC_C_PRESCALE_1,RTC_C_PSEVENTDIVIDER_128);
//清中断
RTC_C_clearInterrupt(RTC_C_BASE,RTC_C_OSCILLATOR_FAULT_INTERRUPT + RTC_C_CLOCK_READ_READY_INTERRUPT);
//中断打开
RTC_C_enableInterrupt(RTC_C_BASE, RTC_C_OSCILLATOR_FAULT_INTERRUPT);
RTC_C_startClock(RTC_C_BASE);
return 0;
}RTC_C_initCounterPrescale(RTC_C_BASE,RTC_C_PRESCALE_0,RTC_C_PSCLOCKSELECT_ACLK,RTC_C_PSDIVIDER_256);
你好,对于prescale timer 0 似乎是没有PSCLOCKSELECT_ACLK这个位。

您使用的是TI的例程吗?
你好,请看括号里的这句话:

另外关于COUNTER模式的例程TI是有提供的:
https://dev.ti.com/tirex/explore/node?node=A__ANKAURI8obvL9KfaQmaBrQ__msp430ware__IOGqZri__LATEST
您可以参考一下。