Red de conocimiento informático - Problemas con los teléfonos móviles - Configuración de cristal externo stm32 hal rtc

Configuración de cristal externo stm32 hal rtc

Utilice cubeMX directamente o configúrelo según las rutinas proporcionadas en el sitio web oficial.

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);

// Espere a que se complete la escritura

RTC_WaitForLastTask();

Return;

}

void RTC_ Config(void)

{

//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

}