summaryrefslogtreecommitdiff
path: root/stmhal
diff options
context:
space:
mode:
authorblmorris <bryan.morrissey@gmail.com>2015-05-07 13:18:52 -0400
committerDamien George <damien.p.george@gmail.com>2015-05-11 23:48:39 +0100
commit5df81de7afbf4e9f24413ba957f4a7cce89fa1e0 (patch)
treeccca10c22524a909c28651ae00698bbcb91cfd88 /stmhal
parenta7c02c4538bb2b986efb1999e00da4d76345767d (diff)
sthmal/rtc.c: Add calibration() method to get/set RTC fine-tuning value.
Diffstat (limited to 'stmhal')
-rw-r--r--stmhal/qstrdefsport.h1
-rw-r--r--stmhal/rtc.c36
2 files changed, 37 insertions, 0 deletions
diff --git a/stmhal/qstrdefsport.h b/stmhal/qstrdefsport.h
index e2fd0bbaf..a8b52f346 100644
--- a/stmhal/qstrdefsport.h
+++ b/stmhal/qstrdefsport.h
@@ -122,6 +122,7 @@ Q(RTC)
Q(info)
Q(datetime)
Q(wakeup)
+Q(calibration)
// for Pin class
Q(Pin)
diff --git a/stmhal/rtc.c b/stmhal/rtc.c
index b4fa69e86..8b21c6ee5 100644
--- a/stmhal/rtc.c
+++ b/stmhal/rtc.c
@@ -496,10 +496,46 @@ mp_obj_t pyb_rtc_wakeup(mp_uint_t n_args, const mp_obj_t *args) {
}
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_rtc_wakeup_obj, 2, 4, pyb_rtc_wakeup);
+// 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) {
+ 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) {
+ nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError,
+ "calibration value out of range"));
+ }
+ 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);
+ }
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(pyb_rtc_calibration_obj, 1, 2, pyb_rtc_calibration);
+
STATIC const mp_map_elem_t pyb_rtc_locals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_info), (mp_obj_t)&pyb_rtc_info_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_datetime), (mp_obj_t)&pyb_rtc_datetime_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_wakeup), (mp_obj_t)&pyb_rtc_wakeup_obj },
+ { MP_OBJ_NEW_QSTR(MP_QSTR_calibration), (mp_obj_t)&pyb_rtc_calibration_obj },
};
STATIC MP_DEFINE_CONST_DICT(pyb_rtc_locals_dict, pyb_rtc_locals_dict_table);