Basado en STM32CubeMX y keil, la interrupción del temporizador básico de STM32F407 se utiliza para realizar el parpadeo del LED

Prefacio

Hay tres tipos de temporizadores: temporizadores básicos, temporizadores generales y temporizadores avanzados.
Este blog toma como ejemplo el temporizador básico más simple para lograr el parpadeo del LED.
El uso de los dos últimos temporizadores se escribirá más adelante.

实现功能:
TIM6 controla el LED para cambiar de estado cada 0,5 s.
TIM7 controla el LED1 de forma constante y se apaga después de 2 segundos.


1. Comprender los esquemas de circuitos

Debido a que se utilizan LED, es similar al artículo anterior basado en STM32CubeMX y sigue usando botones de interrupción externos para controlar LED y zumbadores .
Simplemente cópielo y péguelo aquí.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

LED部分:
El voltaje de 3.3V está conectado al diodo emisor de luz DS0 a través de una resistencia R12. Si hay una caída de voltaje entre VCC y el pin correspondiente del LED0, DS0 se encenderá y emitirá luz.
El voltaje de 3.3V está conectado al diodo emisor de luz DS1 a través de una resistencia R14. Si hay una caída de voltaje entre VCC y el pin correspondiente del LED1, DS1 se encenderá y emitirá luz.

Por lo tanto, si queremos que el LED se encienda primero, debemos hacer que los pines correspondientes a las etiquetas LED0 y LED1 tengan un nivel de salida bajo para garantizar que LED0 y LED1 se enciendan. Sin embargo, dado que nuestro estado predeterminado es que el LED está encendido , primero debemos configurarlo en alto voltaje.

2. Temporizador básico

En el chip STM32F407ZET6
, TIM6 y TIM7 son temporizadores básicos
TIM2-5, TIM9~14 son temporizadores generales
TIM1 y TIM8 es un temporizador avanzado.

2.1 Proceso de interrupción del temporizador STM32:

定时器配置: Primero, debe configurar los parámetros del temporizador, como la fuente del reloj, el coeficiente del preescalador y el valor de recarga automática del contador. Estos parámetros determinan la velocidad de conteo y el intervalo de tiempo del temporizador.

中断配置: A continuación, debe configurar la interrupción del temporizador. En STM32, cada temporizador tiene un bit de habilitación de interrupción y un bit de indicador de interrupción. Puede habilitar o deshabilitar las interrupciones del temporizador configurando el bit de habilitación de interrupción. El bit de bandera de interrupción se utiliza para indicar si ha ocurrido un evento de interrupción. Puede borrar el bit del indicador de interrupción en el controlador de interrupciones.

中断处理函数: Cuando el temporizador alcanza el valor de conteo establecido, se activará la interrupción del temporizador y saltará a la entrada correspondiente de la tabla de vectores de interrupción para ejecutar la función de procesamiento de interrupciones. Debe implementar la función del controlador de interrupciones para realizar las operaciones requeridas. En la función de manejo de interrupciones, puede realizar algunas tareas relacionadas con el tiempo, como actualizar variables, enviar datos o activar otros eventos.

中断优先级: Cuando ocurren varias interrupciones al mismo tiempo, la prioridad determina qué interrupción se procesa primero. STM32 proporciona configuraciones de grupos de prioridad y puede configurar diferentes prioridades de interrupción según sea necesario.

Para obtener una explicación detallada de los parámetros relacionados con el temporizador, consulte:

2.2 Explicación detallada de algunos parámetros

2.2.1 Fuente de reloj

La familia de microcontroladores STM32 ofrece una variedad de opciones de fuente de reloj para satisfacer diferentes necesidades de aplicaciones. A continuación se muestran algunas opciones comunes de fuente de reloj:

HSI(High-Speed Internal)内部高速时钟:HSI es un oscilador de alta frecuencia integrado dentro de STM32, generalmente de 16MHz. Es la fuente de reloj predeterminada del sistema y se inicia automáticamente después de encender el chip. HSI es adecuado para la mayoría de los escenarios de aplicaciones y proporciona una precisión y estabilidad relativamente altas.
HSE(High-Speed External)外部高速时钟:HSE utiliza un oscilador de cristal externo o una fuente de reloj para proporcionar una señal de reloj estable. El rango de frecuencia de HSE puede variar según el modelo de chip específico, generalmente de 4MHz a 25MHz. Las fuentes de reloj externas proporcionan mayor precisión y estabilidad que los relojes internos.
LSI(Low-Speed Internal)内部低速时钟:LSI es un oscilador de baja frecuencia, normalmente de 32 kHz. Se utiliza en algunas aplicaciones de bajo consumo como RTC (Reloj en tiempo real) o Temporizador de vigilancia independiente (IWDG).
LSE(Low-Speed External)外部低速时钟:LSE utiliza un oscilador de cristal externo o una fuente de reloj para proporcionar una señal de reloj de baja velocidad. Suele ser de 32,768 kHz y se utiliza para RTC y modos de bajo consumo.
PLL(Phase-Locked Loop)锁相环:PLL es un circuito utilizado para generar relojes de alta frecuencia. Puede generar un reloj de mayor frecuencia multiplicando y dividiendo la señal del reloj de entrada (como HSI o HSE). PLL proporciona capacidades flexibles de ajuste de frecuencia de reloj y es adecuado para aplicaciones de alto rendimiento.

Tenga en cuenta que las opciones de fuente de reloj y los métodos de configuración específicos pueden variar según el modelo y la familia de chip. Cuando utilice un modelo específico de chip STM32, debe consultar la hoja de datos del chip y el manual de referencia para obtener información detallada sobre la configuración de la fuente del reloj.

2.2.2 Coeficiente del preescalador

El coeficiente del preescalador se utiliza para establecer la relación de división de la frecuencia del reloj del temporizador. Determina el tamaño del paso del incremento del contador del temporizador en cada ciclo de reloj, afectando así la velocidad de conteo y el intervalo de tiempo del temporizador.

Las opciones específicas del preescalador y los métodos de configuración pueden variar según el modelo y la serie de chip. A continuación se muestran algunas configuraciones de preescalador comunes:

Coeficiente de división de frecuencia APB (PCLKx): APB (Advanced Peripheral Bus) es el bus utilizado para conectar periféricos en STM32. Al configurar el coeficiente de división de frecuencia APB, el reloj del sistema (SYSCLK) se puede dividir para obtener una frecuencia de reloj adecuada para el funcionamiento periférico. Las opciones de preescalador comunes incluyen 2, 4, 8 y 16.

Coeficiente del preescalador TIMx: El módulo temporizador (TIM) tiene su propio preescalador que divide aún más la frecuencia de la fuente del reloj. Las opciones específicas del preescalador y los métodos de configuración varían según el modelo de chip y el módulo de temporizador.

Coeficiente de multiplicación de PLL (PLLM, PLLN, PLLP): si se utiliza un bucle de bloqueo de fase PLL para generar un reloj de alta frecuencia, la frecuencia del reloj de salida de PLL se puede ajustar configurando diferentes coeficientes de multiplicación de frecuencia. PLLM es el coeficiente divisor de entrada, PLLN es el coeficiente multiplicador de frecuencia y PLLP es el coeficiente divisor de salida.

2.2.3 Valor de recarga automática

El valor de recarga automática es un parámetro importante que se utiliza para controlar el desbordamiento y la recarga del contador del temporizador.

El contador del temporizador se incrementa en cada ciclo de reloj y cuando se alcanza el valor de recarga automática, el contador se recarga a su valor inicial y se activa una interrupción (si está habilitada). Esta operación de recarga permite que el temporizador genere interrupciones periódicamente o active otros eventos.

El tamaño del valor de recarga automática determina el intervalo del temporizador. Normalmente, la configuración del valor de recarga automática se puede calcular mediante la siguiente fórmula:

自动重装载值 = (定时周期 / 时钟周期) - 1, menos uno aquí porque el conteo comienza desde 0, por ejemplo, 0~9 en realidad cuenta 10.

Entre ellos, el período de tiempo es el intervalo de tiempo requerido y el período de reloj es la frecuencia de reloj del temporizador. El intervalo del temporizador se puede ajustar cambiando el valor de recarga automática.

En STM32, el valor de recarga automática se puede almacenar en el registro de recarga automática (ARR) del temporizador. El funcionamiento periódico del temporizador se logra configurando el registro de recarga automática en el valor deseado.

Es importante tener en cuenta que el valor de recarga automática debe elegirse adecuadamente para garantizar que no se produzca un desbordamiento. Se debe elegir el valor apropiado en función del intervalo de tiempo requerido y la frecuencia del reloj del temporizador para evitar desbordamientos o intervalos de tiempo demasiado largos.


3. Configuración de parámetros STM32CubeMX

Configuración 3.1GPIO

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí

3.2 Configuración del reloj

Insertar descripción de la imagen aquí

Para facilitar nuestro cálculo, nuestro reloj final aquí está configurado en 100MHz, y la fuente de reloj anterior y el coeficiente de división de frecuencia se configurarán automáticamente.
Insertar descripción de la imagen aquíEl reloj dado al temporizador en realidad se obtiene de APB1 y APB2. Debido a que mi blog trata sobre temporizadores básicos, necesitamos encontrar los relojes correspondientes a los temporizadores básicos TIM6 y TIM7. Aquí está APB1.

Insertar descripción de la imagen aquí

Los autobuses donde se encuentran otros temporizadores de STM32F407ZET3 se enumeran aquí.

Tipo de temporizador nombre del temporizador El autobús donde se encuentra el cronómetro.
temporizador básico TIM6、TIM7 APB1
Temporizador universal TIM2~5, TIM12~14 APB1
Temporizador universal TIEMPO 9 ~ 11 APB2
Temporizador avanzado EQUIPO1, EQUIPO8 APB2

3.3 Configurar parámetros relacionados con el temporizador

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

El coeficiente de división de frecuencia aquí es 49999, que es 0 ~ 49999, y la longitud es 50000. El reloj transmitido desde nuestro bus APB1 es de 50 MHz, por lo que cada ciclo de reloj es de 1 ms.

APB 1 reloj TIM 6 coeficiente de división = 50 ∗ 1 0 6 H z 5 ∗ 1 0 4 = 1 KH z = 1 T (tiempo) = > T = 1 ms \frac{reloj APB1}{coeficiente de división TIM6}= \frac {50*10^6Hz}{5*10^4}=1KHz=\frac{1}{T(tiempo)}=>T=1msCoeficiente de división de frecuencia T I M 6Un reloj PB 1=51 04501 06Hz _=1 kilociclo=T ( tiempo )1=>t=1 m s
Para el LED controlado por TIM6, nuestro objetivo es cambiar el estado del LED una vez cada 0,5 s, por lo que la recarga del conteo aquí es 500-1 porque el conteo comienza desde 0.

Al escribir esto, una comprensión simple es que el reloj se divide desde la fuente del reloj al bus, y el temporizador se divide nuevamente desde el bus para usarse como valor de división del tiempo. Esta afirmación puede no ser apropiada, pero significa cuántos segundos es un ciclo de reloj. Luego use el conteo para sobrecargar el valor*. El valor de división justo ahora es el tiempo que queremos. Es decir, con qué frecuencia y qué hacer.

La configuración de TIM7 es la misma, excepto que el valor de recarga del conteo es 1999, por lo que la imagen completa no se publicará aquí.
Insertar descripción de la imagen aquí


3.4 Configuración de depuración

Insertar descripción de la imagen aquí

3.5 Configuración de interrupción

De hecho, después de encender NVIC en la configuración del reloj, se verifica y configura automáticamente.
Insertar descripción de la imagen aquíPrioridad y respuesta de prioridad: cuando ocurren dos interrupciones y tienen diferentes prioridades, la interrupción de mayor prioridad se adelantará a la interrupción de ejecución de baja prioridad. Si varias interrupciones tienen la misma prioridad, el orden de las interrupciones se determina en función de las configuraciones de Preferencia y Respuesta. Veamos primero la prioridad preventiva. Cuanto menor sea el valor en el frente, mayor será la prioridad. Si es la misma, mire la prioridad en la parte posterior. Cuanto menor sea el valor, mayor será la prioridad.

De hecho, este blog no tiene requisitos de prioridad muy altos y no implicará prioridad de prioridades. Entonces el valor predeterminado aquí es 0, 0 está bien.

Otra cosa es si se genera la función de servicio de interrupción correspondiente cuando se genera el código, todas están marcadas por defecto.
Insertar descripción de la imagen aquí


3.6 Generación de código

Insertar descripción de la imagen aquí

Insertar descripción de la imagen aquí


4. escritura de código keil

Abra el archivo stm32f4xx_it.c en el proyecto generado
Insertar descripción de la imagen aquí
y agregue el siguiente código directamente en la parte inferior

Insertar descripción de la imagen aquí

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM6)
	{
		HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
	}
	if(htim->Instance==TIM7)
	{
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
	}
}

Explique por qué se reescribe esta función. Cuando el temporizador alcanza el valor de conteo establecido, se activará la interrupción del temporizador y saltará a la entrada correspondiente de la tabla de vectores de interrupción para ejecutar la función de procesamiento de interrupciones. Debe implementar la función del controlador de interrupciones para realizar las operaciones requeridas.

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

Si el valor del recuento excede 500, se activará una interrupción y se llamará a la función de devolución de llamada, aquí podemos saberlo mirando el nombre de la función. PeriodElapseCallback corresponde al valor que establecimos.

Insertar descripción de la imagen aquí


El último paso es el programa de grabación. Este es el mismo que el primer artículo de mi columna. Consulte este blog para obtener más detalles.

Resumir

Este blog registra en detalle el uso simple de los temporizadores, desde el objetivo hasta la explicación del principio, la configuración y la escritura del código, y la implementación de la función paso a paso. La dificultad no es muy alta, la parte del procesamiento de interrupciones tiene mucho en común con el artículo anterior y es relativamente rápido de aprender. Simplemente se necesita más tiempo para grabar. Parte del contenido de este blog se escribió utilizando la herramienta chatGPT y el efecto fue bastante bueno, lo que de hecho mejoró algo de eficiencia.

Supongo que te gusta

Origin blog.csdn.net/Edwinwzy/article/details/131754055
Recomendado
Clasificación