ARM00: biški apie RTC pas F4xx

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.

white pill STM32F446ret6

Apie 10uF kondensatorius ant Vcore 🙂 PB11, jei naudojam multi maitinimą ir USB nevisada naudojama, tai VUSB laidas į PC9. Nebereikia 1K5 rezistoriaus prie USB (R7).

white pill STM32F446ret6

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.

Leave a Reply

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