@@ -496,10 +496,46 @@ mp_obj_t pyb_rtc_wakeup(mp_uint_t n_args, const mp_obj_t *args) {
496496}
497497MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (pyb_rtc_wakeup_obj , 2 , 4 , pyb_rtc_wakeup );
498498
499+ // calibration(None)
500+ // calibration(cal)
501+ // When an integer argument is provided, check that it falls in the range [-511 to 512]
502+ // and set the calibration value; otherwise return calibration value
503+ mp_obj_t pyb_rtc_calibration (mp_uint_t n_args , const mp_obj_t * args ) {
504+ mp_int_t cal ;
505+ if (n_args == 2 ) {
506+ cal = mp_obj_get_int (args [1 ]);
507+ mp_uint_t cal_p , cal_m ;
508+ if (cal < -511 || cal > 512 ) {
509+ nlr_raise (mp_obj_new_exception_msg (& mp_type_ValueError ,
510+ "calibration value out of range" ));
511+ }
512+ if (cal > 0 ) {
513+ cal_p = RTC_SMOOTHCALIB_PLUSPULSES_SET ;
514+ cal_m = 512 - cal ;
515+ } else {
516+ cal_p = RTC_SMOOTHCALIB_PLUSPULSES_RESET ;
517+ cal_m = - cal ;
518+ }
519+ HAL_RTCEx_SetSmoothCalib (& RTCHandle , RTC_SMOOTHCALIB_PERIOD_32SEC , cal_p , cal_m );
520+ return mp_const_none ;
521+ } else {
522+ // printf("CALR = 0x%x\n", (mp_uint_t) RTCHandle.Instance->CALR); // DEBUG
523+ // Test if CALP bit is set in CALR:
524+ if (RTCHandle .Instance -> CALR & 0x8000 ) {
525+ cal = 512 - (RTCHandle .Instance -> CALR & 0x1ff );
526+ } else {
527+ cal = - (RTCHandle .Instance -> CALR & 0x1ff );
528+ }
529+ return mp_obj_new_int (cal );
530+ }
531+ }
532+ MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (pyb_rtc_calibration_obj , 1 , 2 , pyb_rtc_calibration );
533+
499534STATIC const mp_map_elem_t pyb_rtc_locals_dict_table [] = {
500535 { MP_OBJ_NEW_QSTR (MP_QSTR_info ), (mp_obj_t )& pyb_rtc_info_obj },
501536 { MP_OBJ_NEW_QSTR (MP_QSTR_datetime ), (mp_obj_t )& pyb_rtc_datetime_obj },
502537 { MP_OBJ_NEW_QSTR (MP_QSTR_wakeup ), (mp_obj_t )& pyb_rtc_wakeup_obj },
538+ { MP_OBJ_NEW_QSTR (MP_QSTR_calibration ), (mp_obj_t )& pyb_rtc_calibration_obj },
503539};
504540STATIC MP_DEFINE_CONST_DICT (pyb_rtc_locals_dict , pyb_rtc_locals_dict_table );
505541
0 commit comments