ARM:0016 STM32CubeMX – RTC problema

Tai labai trumpa žinutė, nes ST gudručiai ir kubiko programeriai pasistengė, kad gautusi sudėtingiau. O aš poto užmiršiu jei neužrašysiu.
Kad RTC (realaus laiko laikrodis) veiktu su STM32CubeMX paketu reikia daryti taip:

Susirandam “MX_RTC_Init(void)“, skrolinam iki komentaro “USER CODE BEGIN Check_RTC_BKUP“. Ten nuskaitom vieną iš vartotojui prieinamu “backup” reikšmių ir atidarom “IF”:

/* USER CODE BEGIN Check_RTC_BKUP */
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
{
/* USER CODE END Check_RTC_BKUP */

Skaičius “0x5051” gali būtu bet koks, svarbu kad jis nesigautu atsitiktinai sutampantis su tikrai pilno MCU starto skaičium.
Poto paskrolinam daug kodo su RTC inicializacija…

/* USER CODE BEGIN RTC_Init 2 */
} // Kitame user code virsuje yra IF komanda. Čia ji užsidaro.
else
{
// LAIKAS BUVO ISSAUGOTAS, NES USER REGISTRAS TURI MAGIC skaiciu 0x5051
// Čia galima ką nors padaryti iš tos laimės arba pagalvoti apie kalendoriaus atstatymą. Sako kad jis nelabai
}

//Čia įrašom tą MAGIC skaičių. Jis po pilno reseto ir RTC mirties turi neišlikti.
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//Write data to the specified backing area register
/* USER CODE END RTC_Init 2 */

Taip padaryta, kad useris aklai nepasitikėtu RTC veikimu ir tikrintu RAM išlikimą. Kai kuriuose forumuose rekomenduoja paprasčiausiai nutraukti RTC inicializacija su return komanda. Tačiau reikia daryti taip, kaip parašiau- pasitikrinam ar RAM išlaikė realius skaičius ir tik tada sakom, kad RTC korektiškai veikė kol procesorius stovėjo išjungtas. Jei RTC mirė, mirė ir jo RAM. Tada starto metu, žinom, kad laikrodis rodo nesamones.

P.S. Jei norim sekundinio pertraukimo, tai reikia paleisti kur nors RTC init gale šitą makrosą:

__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);

2 replies on “ARM:0016 STM32CubeMX – RTC problema”

  1. Perskaičius visą įrašą balsu atsirado kažkoks padaras. Toks nei mielas, nei baisus, bet pasakykit ką perskaityti, kad jis išnyktu. Ar bent jau kuo jį šerti.

Leave a Reply

Your email address will not be published. Required fields are marked *