если не против давайте попробую тут :)
пишу программу для платы maple mini в среде arduino фреймфорк arduino stm32
https://github.com/rogerclarkmelbourne/Arduino_STM32суть проблемы - зависает МК после запись в bkp регистры.
Есть библиотека для работы с RTC.
https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/RTClock/src/RTClock.cppи есть надстройка для калибровки RTCCR регистров если часы RTC спешат. Как раз у меня это проблема имеется и эту функцию я использую.
https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/RTClock/examples/RTCAdj/rtadjust.cppпример работы ее вот
https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/STM32F1/libraries/RTClock/examples/RTCAdj/RTCAdjust.inoавтором библиотеки предполагается калибровать часы через serial порт. Сначала задать точное время. Потом через 3-10 дней снова задать точное время, и по разнице либа вычисляет значение RTCCR регистра и пишет туда. Так все работает. Я пошел дальше :)
У меня есть fram память в устройстве. Она работает нормально и все данные пишутся и читаются корректно. Я хотел дополнительно хранить значение RTCCR регистра в ней, чтобы если вытащить батарейку, снова не приходилось калибровать устройство. И второе - можно было бы на самом устростве тонко подстраивать значение RTCCR регистра если часы после калибровки спешат или отстают.
И вот тут вылезла проблема. Если я пишу в регистр командами setrtccr(RTCCR); или setbkpdrift(drift_dur); то МК виснет.
два дня искал причину из за чего происходит зависон - определил что как раз из за этих операций. Если в бэкап регистры не пишу то ничего не виснет. Нет ли каких ньюансов работы с ними?
Запись в них проводится корректно - проверено
void setrtccr(uint8_t cal) {
bkp_enable_writes();
uint16_t val = 0;
//calibration value is the 1st 7 bits of RTCCR
//we zero out the other bits as it is not needed
BKP->regs->RTCCR = cal & 0x7f;
bkp_disable_writes();
}
void setbkpdrift(int16_t drift_dur) {
bkp_enable_writes();
bkp_write(7, drift_dur);
bkp_disable_writes();
}