Configuración de cristal externo stm32 hal rtc
void RTC_Configuration(void)
{
//Habilitar reloj para PWR y BKP (desde APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_ APB1Periph_BKP, ENABLE);
Dominio de respaldo desbloqueado
PWR_BackupAccessCmd(ENABLE);
/Restablecimiento del módulo de registro de respaldo
BKP_DeInit() ;/Externo 32.768K Incluso es ese
RCC_LSEConfig(RCC_LSE_ON);
/Esperando estabilidad
mientras (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
//La fuente del reloj RTC está configurada como LSE (externa 32.768K)
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//RTC abierto
RCC_RTCCLKCmd (ENABLE);
//Después de abrir, debe esperar a que el reloj APB1 se sincronice con el reloj RTC para poder leer/escribir el registro
RTC_WaitForSynchro( );
// En Antes de leer/escribir registros, asegúrese de que se haya completado la operación anterior
RTC_WaitForLastTask();
//Establezca el divisor RTC para que el reloj RTC sea de 1Hz
//Ciclo RTC = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
RTC_SetPrescaler(32767);
//Esperando que se complete la escritura del registro
RTC_WaitForLastTask();
// Habilitar la segunda interrupción
RTC_ITConfig(RTC_IT_SEC, ENABLE); p>
// Espere a que se complete la escritura
RTC_WaitForLastTask();
Return;
}
void RTC_ Config(void)
{ p>
//Almacenamos un carácter especial 0xA5A5 en el registro de respaldo 1 de BKP
//Cuando se enciende por primera vez o la fuente de alimentación de respaldo está apagada, significa que los datos RTC se pierden y deben reconfigurarse
if (BKP_ ReadBackupRegister(BKP_DR1) ! = 0xA5A5)
{
//Reconfigurar RTC
RTC_Configuration();
//Una vez completada la configuración, cambie el caracteres especiales 0xA5A5 Registro de copia de seguridad de escritura
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
}
else
{
/// Si el registro de respaldo no está apagado, no es necesario reconfigurar el RTC
/// Aquí podemos usar la función RCC_GetFlagStatus() para verificar el tipo de reinicio
if (RCC_ GetFlagStatus (RCC_FLAG_PORRST) ! = RESET)
{
// Este es un reinicio de encendido
}
de lo contrario si (RCC_GetFlagStatus( RCC_FLAG_PINRST) ! = RESET) <
/p>
{
// Este es un reinicio del pin RST externo
}
//Borrar el indicador de reinicio en RCC
RCC_ClearFlag();
//Aunque no es necesario reconfigurar el módulo RTC y aún funciona con batería de respaldo después de un corte de energía
//Pero aún es necesario be Enable RTCCLK
//RCC_RTCCLKCmd(ENABLE);
/ Espere a que el reloj RTC se sincronice con el reloj APB1
//RTC_WaitForSynchro();
// Habilitar interrupción de segundos
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/ Esperar a que se complete la operación
RTC_WaitForLastTask() ;
}
#ifdef RTCClockOutput_Enable
RCC_ APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE
PWR_BackupAccessCmd(ENABLE); p>
BKP_TamperPinCmd( DISABLE)
BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif
retorno
} p>