利用外部中断测量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
您可以参考一下。