// calibration(None) // calibration(cal) // When an integer argument is provided, check that it falls in the range [-511 to 512] // and set the calibration value; otherwise return calibration value mp_obj_t pyb_rtc_calibration(mp_uint_t n_args, const mp_obj_t *args) { rtc_init_finalise(); mp_int_t cal; if (n_args == 2) { cal = mp_obj_get_int(args[1]); mp_uint_t cal_p, cal_m; if (cal < -511 || cal > 512) { #if defined(MICROPY_HW_RTC_USE_CALOUT) && MICROPY_HW_RTC_USE_CALOUT if ((cal & 0xfffe) == 0x0ffe) { // turn on/off X18 (PC13) 512Hz output // Note: // Output will stay active even in VBAT mode (and inrease current) if (cal & 1) { HAL_RTCEx_SetCalibrationOutPut(&RTCHandle, RTC_CALIBOUTPUT_512HZ); } else { HAL_RTCEx_DeactivateCalibrationOutPut(&RTCHandle); } return mp_obj_new_int(cal & 1); } else { nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "calibration value out of range")); } #else nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, "calibration value out of range")); #endif } if (cal > 0) { cal_p = RTC_SMOOTHCALIB_PLUSPULSES_SET; cal_m = 512 - cal; } else { cal_p = RTC_SMOOTHCALIB_PLUSPULSES_RESET; cal_m = -cal; } HAL_RTCEx_SetSmoothCalib(&RTCHandle, RTC_SMOOTHCALIB_PERIOD_32SEC, cal_p, cal_m); return mp_const_none; } else { // printf("CALR = 0x%x\n", (mp_uint_t) RTCHandle.Instance->CALR); // DEBUG // Test if CALP bit is set in CALR: if (RTCHandle.Instance->CALR & 0x8000) { cal = 512 - (RTCHandle.Instance->CALR & 0x1ff); } else { cal = -(RTCHandle.Instance->CALR & 0x1ff); } return mp_obj_new_int(cal); } }
/* RTC init function */ void MX_RTC_Init(void) { RTC_TimeTypeDef sTime; RTC_DateTypeDef sDate; /**Initialize RTC and set the Time and Date */ hrtc.Instance = RTC; hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = 127; hrtc.Init.SynchPrediv = 255; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; HAL_RTC_Init(&hrtc); sTime.Hours = 0x0; sTime.Minutes = 0x0; sTime.Seconds = 0x0; sTime.TimeFormat = RTC_HOURFORMAT12_AM; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; HAL_RTC_SetTime(&hrtc, &sTime, FORMAT_BCD); sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 0x1; sDate.Year = 0x0; HAL_RTC_SetDate(&hrtc, &sDate, FORMAT_BCD); /**Enable Calibrartion */ HAL_RTCEx_SetCalibrationOutPut(&hrtc, RTC_CALIBOUTPUT_1HZ); /**Enable the reference Clock input */ HAL_RTCEx_SetRefClock(&hrtc); }