Чт май 18, 2023 08:46:48
Чт май 18, 2023 11:01:25
Как при невозможности запуска RTC от низкочастотного внешнего (LSE) (часового кварца), перейти на работу от внутреннего LSI
Как я понял первая проверка при запуске контроллера в HAL
Чт май 18, 2023 14:51:52
void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc)
{
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
if(hrtc->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
//КОД КОТОРЫЙ ГЕНЕРИРУЕТ КУБ НЕ ТРОГАЕМ А делаем по своему:
//этот глобальный флаг придуман мной и устанавливается в stm32f4xx_hal_rcc.c в функции __weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) в коде /* Set the new LSE configuration ----------*/ вместо return HAL_TIMEOUT;
//при обновлении проекта не забыть исправить
//_LSE_FAILURE = 1;//флаг что незапустился LSE низкочастотный кварц для RTC
//break;
//return HAL_TIMEOUT; - закомментировать
if (_LSE_FAILURE==1) { //не смогли запустить внешний часовой кварц - запустим от внутреннего гена
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;//ВНУТРЕНН�?Й ГЕН
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) Error_Handler();//ЗАВ�?САЕМ - Н�? ОД�?Н ГЕНЕРАТОР ДЛЯ ЧАСОВ НЕ ЗАПУСТ�?Л�?
}
else {//запустим внешним кварцем
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) Error_Handler();//ЗАВ�?САЕМ
}
__HAL_RCC_RTC_ENABLE();
return;// не дадим выполниться такому же коду куба далее
/* USER CODE END RTC_MspInit 0 */
/** Initializes the peripherals clock
*/
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
Error_Handler();
}
/* Peripheral clock enable */
__HAL_RCC_RTC_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
/* USER CODE END RTC_MspInit 1 */
}
}
/* Set the new LSE configuration ----------*/
__HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState);
/* Check the LSE State */
if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF)
{
/* Get Start Tick*/
tickstart = HAL_GetTick();
/* Wait till LSE is ready */
while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET)
{
if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE)//
{
_LSE_FAILURE = 1;//флаг что незапустился LSE низкочастотный кварц для RTC
break;
//return HAL_TIMEOUT;
}
}
}
else