Serie STM32CubeMX | Reloj en tiempo real RTC

Reloj de tiempo real RTC

1. Introducción al reloj en tiempo real RTC

El reloj en tiempo real RTC de STM32 es un temporizador independiente. El módulo RTC tiene un conjunto de contadores de conteo continuo. Bajo la configuración de software correspondiente, puede proporcionar la función de calendario de reloj. Modificar el valor del contador puede restablecer la hora y fecha actuales del sistema. El
módulo RTC Y el sistema de configuración del reloj (registro RCC_BDCR) se encuentra en el área posterior, es decir, la configuración y los eventos de RTC permanecen sin cambios después de que el sistema se reinicia o se activa desde el modo de espera. Sin embargo, después de reiniciar el sistema, el acceso al registro de respaldo y al RTC se prohíbe automáticamente para evitar operaciones accidentales en el área de respaldo (BKP). Por lo tanto, antes de configurar la hora, cancele la protección contra escritura del área de respaldo. El diagrama de bloques simplificado de RTC es el siguiente:

Inserte la descripción de la imagen aquí
RTC consta de dos partes principales: la primera parte (interfaz APB1) se utiliza para conectarse al bus APB1, esta unidad también contiene un conjunto de registros de 16 bits, que se pueden leer y escribir a través del bus APB1; la otra parte (núcleo RTC) consta de un El contador programable en grupo se compone de dos módulos principales: el primer módulo es el módulo pre-escalador de RTC, que se puede programar para generar 1 segundo de referencia de tiempo RTC TR_CLK. El segundo módulo es un contador programable de 32 bits (RTC_CNT), que se puede inicializar a la hora actual del sistema. Un contador de reloj de 32 bits puede registrar 4294967296 segundos por segundo, que son aproximadamente 136 años. Es suficiente
RTC para aplicaciones generales También hay un registro de reloj de alarma RTC_ALR, que se utiliza para generar un reloj de alarma. El tiempo del sistema se acumula de acuerdo con el ciclo TR_CLK y se compara con el tiempo programable almacenado en el registro RTC_ALR. Si RTC_CNT = RTC_ALR, se generará una interrupción de alarma para realizar la función de alarma.

2. Diseño de hardware

En este experimento, el tiempo de salida continuo se imprime a través del puerto serie 1 a través de la segunda interrupción del RTC, y se realiza un recordatorio de alarma configurando la interrupción de alarma, y ​​el indicador D1 indica que el sistema está funcionando normalmente.

  • Indicador D1
  • Puerto serie USART1
  • RTC

3. Diseño de software

3.1 Configuración de STM32CubeMX
  • Habilite el oscilador de cristal externo de alta velocidad (HSE) y el oscilador de cristal externo de baja velocidad (LSE) en la configuración RCC, y configure la frecuencia RTC en 32.768KHz en el árbol de reloj

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

  • PC0 está configurado en modo de salida GPIO push-pull, pull-up, alta velocidad y el nivel de salida predeterminado es alto
  • USART1 se selecciona como modo de comunicación asíncrona, la velocidad en baudios se establece en 115200 Bits / s, la longitud de los datos de transmisión es de 8 bits, sin paridad, 1 bit de parada
  • Activar fuente de reloj, activar calendario, seleccionar Sin salida RTC, configurar fecha y hora iniciales

Inserte la descripción de la imagen aquí

  • Habilitar interrupción global de RTC e interrupción de alarma

Inserte la descripción de la imagen aquí

  • Ingrese el nombre del proyecto, seleccione la ruta del proyecto (no chino), seleccione MDK-ARM V5; marque Inicialización de periféricos generados como un par de archivos '.c / .h' por IP; haga clic en GENERAR CÓDIGO para generar el código del proyecto
3.2 Programación MDK-ARM
  • Escriba la segunda función de devolución de llamada de procesamiento de interrupciones y la función de procesamiento de interrupciones de alarma en el archivo rtc.c
extern RTC_DateTypeDef GetDate;
extern RTC_TimeTypeDef GetTime;

void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){
    
    
	HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN);
	printf("Date:%02d-%02d-%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date);
	printf("Time:%02d:%02d:%02d\r\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
	printf("\r\n");	
}

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
    
    
	printf("Alarm Active...!!!\n");
}
  • Escriba el código relacionado con la configuración de la alarma en el archivo main.cy active la interrupción relacionada
/* USER CODE BEGIN PV */
RTC_DateTypeDef GetDate;
RTC_TimeTypeDef GetTime;
RTC_AlarmTypeDef sAlarm;
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

int main(void){
    
    
  HAL_Init();
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断
  sAlarm.Alarm = RTC_ALARM_A;
  sAlarm.AlarmTime.Hours = 16;
  sAlarm.AlarmTime.Minutes = 20;
  sAlarm.AlarmTime.Seconds = 30;
  HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN);  //设置闹钟并使能闹钟中断
  /* USER CODE END 2 */
  while (1){
    
    
    HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
  }
}

4. Descarga la verificación

Después de que la compilación sea correcta, descárguela en la placa de desarrollo, puede ver que el indicador D1 parpadea una vez cada 1 s, el asistente del puerto serie imprimirá la fecha y hora correspondientes cada 1 s, y las declaraciones relacionadas en la función de interrupción de alarma se imprimirán cuando se establezca la alarma

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Chuangke_Andy/article/details/108712743
Recomendado
Clasificación