Serie STM32CubeMX | Interrupción del temporizador

Interrupción del temporizador

1. Introducción a la interrupción del temporizador

La función de temporizador de STM32 es muy poderosa, incluidos temporizadores avanzados (TIM1 y TIM8), temporizadores generales (TIM2 ~ TIM5) y temporizadores básicos (TIM6 y TIM7); este experimento presenta principalmente temporizadores generales con dificultad moderada, temporizadores generales Es un contador de carga automática de 16 bits impulsado por un preescalador programable. Es adecuado para muchas ocasiones, incluida la medición de la longitud del pulso de la señal de entrada (captura de entrada) o la generación de formas de onda de salida (comparación de salida y PWM). Usando el preescalador de temporizador y el preescalador del controlador de reloj RCC, la longitud del pulso y el período de la forma de onda se pueden ajustar desde varios microsegundos hasta varios milisegundos. Cada temporizador es completamente independiente y no comparte ningún recurso entre sí.
Las funciones comunes del temporizador TIMx (TIM2, TIM3, TIM4 y TIM5) incluyen:

  • Contador automático de carga ascendente, descendente, ascendente / descendente de 16 bits
  • Preescalador programable de 16 bits (se puede modificar en tiempo real), el coeficiente de división de la frecuencia del reloj del contador es cualquier valor entre 1 y 65536
  • 4 canales independientes:
    ─ Captura de entrada
    ─ Comparación de salida
    ─ Generación de PWM (modo de alineación de borde o centro)
    ─ Salida de modo de pulso único
  • Utilice una señal externa para controlar el temporizador y el circuito de sincronización de interconexión del temporizador
  • La interrupción / DMA se genera cuando ocurren los siguientes eventos:
    ─ Actualización: desbordamiento / flujo descendente del contador, inicialización del contador (por software o disparador interno / externo)
    ─ Evento de disparo (inicio, parada, inicialización o recuento del contador por disparador interno / externo)

    Comparación de captura de entrada y salida
  • Admite circuitos de codificador incremental (cuadratura) y sensor Hall para posicionamiento
  • Entrada de disparo como reloj externo o gestión de corriente de ciclo

Diagrama de bloques del temporizador de propósito general

Inserte la descripción de la imagen aquí
Parte de la base de tiempo del temporizador

Inserte la descripción de la imagen aquí

2. Diseño de hardware

Este experimento utiliza la interrupción de TIM3 para controlar el encendido y apagado de D1, lo que requiere recursos de hardware

  • Luces indicadoras D1 y D2
  • Temporizador TIM3

Inserte la descripción de la imagen aquí

3. Diseño de software

3.1 Configuración de STM32CubeMX
  • RCC configura HSE externo, reloj configurado a 72MHz; reloj TIM3 montado en APB1 Time Clocks es 72MHz
  • PC0 / PC1 está configurado en modo de salida GPIO push-pull, pull-up, alta velocidad y el nivel de salida predeterminado es alto
  • Active el temporizador TIM3, seleccione el reloj interno como fuente de reloj, configure el preescalador PSC en 7200-1, cuente hacia arriba y configure el valor de recarga automática (ARR) en 10000-1. Active la interrupción del temporizador TIM3 en la configuración NVIC; de acuerdo con la fórmula Se puede calcular: el reloj del contador CK_CNT = 72M / 7200 = 10000Hz, el tiempo de interrupción del temporizador es ARR / 10000 = 1s

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
  • Puede ver la función de inicialización del temporizador en el archivo tim.c
void MX_TIM3_Init(void){
    
    
  TIM_ClockConfigTypeDef sClockSourceConfig = {
    
    0};
  TIM_MasterConfigTypeDef sMasterConfig = {
    
    0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 7200-1;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 10000-1;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
    
    
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK){
    
    
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK){
    
    
    Error_Handler();
  }
}

Encuentre el ciclo de símbolo débil para ejecutar el prototipo de la función de devolución de llamada y personalice la función de devolución de llamada en tim.c
__weak void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef * htim)

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    
    
	if(htim == &htim3){
    
    
		HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);	//LED1状态每1s翻转一次
	}
}
  • Escriba el código relevante en la función principal y haga que LED2 gire cada 500 ms mientras
int main(void){
    
    
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_TIM3_Init();
  /* USER CODE BEGIN 2 */
  HAL_TIM_Base_Start_IT(&htim3);		//启动定时器中断模式计数
  /* USER CODE END 2 */
  while (1){
    
    
    HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);	//LED2状态每500ms翻转一次
	HAL_Delay(500);
  }
}

4. Descarga la verificación

Después de que la compilación sea correcta, descargue a la placa de desarrollo, puede ver que el estado de LED1 cambia una vez cada 1s y el estado de LED2 cambia una vez cada 500ms.

Supongo que te gusta

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