Sau rašau, kad nepamirščiau.
Migruojant projektą iš F1xx į F4xx, o konkrečiau į STM32F446RET6 (nes dabar turiu aš jų kalną) reikia:
Hardwaro modifikacija- naudojant mano “White Pill” plokštę, reikia daryti kelis pakeitimus.
Apie 10uF kondensatorius ant Vcore 🙂 PB11, jei naudojam multi maitinimą ir USB nevisada naudojama, tai VUSB laidas į PC9. Nebereikia 1K5 rezistoriaus prie USB (R7).
O reikia softe dėl RTC daryti taip:
Vėl tikrinam ar RTC inicializuotas ir jo per naujo neleidžiam per HAL_RTC_Init(&hrtc), nes vėl galim prarasti milisekundes. Tačiau taip prarandam INT (pertraukimus). Juos reikia paliesti per naujo. Ir nebėra sekundinio pertraukimo. Galima naudoti WakeUp pertraukimą.
/* ijungti RTC pertraukimus */ void rtc_int_init(void) { //__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //turn on RTC clock seconds interrupt STM32F1xx HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2048, RTC_WAKEUPCLOCK_RTCCLK_DIV16); NVIC_EnableIRQ(RTC_WKUP_IRQn ); } void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc) //pas F4xx nera atskiro sekundinio int, todel naudojam wakeup. { user_seconds_job(); } /* kas sekunde, turi buti ijungtas INT, sitas rodos tik past F1xx */ void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc) { user_seconds_job(); }
Pačio RTC initas, “HAL friendly”. Lygtai veikia. Gal ne visko reikia:
static void MX_RTC_Init(void) { /* USER CODE BEGIN RTC_Init 0 */ /* USER CODE END RTC_Init 0 */ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* USER CODE BEGIN RTC_Init 1 */ //LEVO-LEVO-LEVO 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; if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) { //taip apeinam RTC init, jei jis jau init. //LEVO-LEVO-LEVO /* USER CODE END RTC_Init 1 */ /** Initialize RTC Only */ 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; if (HAL_RTC_Init(&hrtc) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN Check_RTC_BKUP */ //LEVO-LEVO-LEVO } else { HAL_PWR_EnableBkUpAccess(); //del backup ijungimo?! Ar reikia pas STM4xx? } if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051) { //LEVO-LEVO-LEVO /* USER CODE END Check_RTC_BKUP */ /** Initialize RTC and set the Time and Date */ sTime.Hours = 12; sTime.Minutes = 1; sTime.Seconds = 2; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 23; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /** Enable the WakeUp */ if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2048, RTC_WAKEUPCLOCK_RTCCLK_DIV16) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN RTC_Init 2 */ //LEVO-LEVO-LEVO } //o cia jei radom backup skaiciu. Teoriskai nereikia inicializuoti RTC, bet reikia paleisti INT, kas darosi user/rtc.c // LAIKRODZIO TIKRINIMAS /* RTC_DateTypeDef dienos= {0}; //BUTINA SEKA RTC_TimeTypeDef currTime = {0}; //BUTINA SEKA HAL_RTC_GetTime(&hrtc, &currTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &dienos, RTC_FORMAT_BIN); */ //MAGIC WORD HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//Write data to the specified backing area register //LEVO-LEVO-LEVO /* USER CODE END RTC_Init 2 */ }
Bugas, kad reikia skaityti laiką ir datą visada ir tokia pat tvarka niekur nedingo.