[Uso de herramientas] Configuración básica del temporizador STM32CubeMX

I. Descripción general

    Ya sea que sea un principiante o un maestro, basándose en el desarrollo de la microcomputadora de un solo chip STM32, el uso de STM32CubeMX puede mejorar en gran medida la eficiencia del desarrollo, y el desarrollo de su interfaz también reduce en gran medida el umbral de desarrollo para los principiantes en la microcomputadora de un solo chip STM32.
    Este artículo describe principalmente la configuración y los conocimientos relacionados del temporizador del chip STM32.

2. Descripción del software

    STM32CubeMX es una herramienta gráfica oficial multiplataforma ST MCU/MPU para ST. Admite el desarrollo en sistemas Linux, MacOS y Windows. Su interfaz subyacente es la biblioteca HAL. Los estudiantes que estén acostumbrados a registrarse en desarrollo, también pueden utilizar las bibliotecas LL. . Además de integrar la capa de abstracción de hardware de MCU/MPU, STM32CubeMX también integra middleware como RTOS, sistema de archivos, USB, red, pantalla, IA integrada, etc., para que los desarrolladores puedan completar fácilmente el controlador subyacente de la configuración de MCU/MPU. , Dejar más energía para desarrollar la lógica funcional de la capa superior puede mejorar aún más la eficiencia del desarrollo integrado.
    Versión de demostración 6.7.0

3. Introducción al temporizador

    El temporizador, como su nombre indica, es la función de temporización. El temporizador es el periférico más básico del microcontrolador, excepto GPIO. En ST, los temporizadores se dividen en varios tipos: temporizadores básicos, temporizadores de uso general, temporizadores avanzados y temporizadores de bajo consumo. Este artículo se centra en la configuración de temporizadores básicos y otros tipos de temporizadores se describen en detalle en otros capítulos.
    El temporizador básico proporciona solo la función de temporización más básica. A continuación explicaremos el principio del temporizador a partir del diagrama de bloques del temporizador básico ST.
inserte la descripción de la imagen aquí
    Tomando el tiempo de 1 como ejemplo, si la frecuencia del reloj de entrada actual es de 1 MHz, ¿cómo podemos obtener el intervalo de 1? Como todos sabemos, 1 MHz en sí mismo significa una frecuencia de 1.000.000 de veces por segundo, por lo que es fácil pensar que si el temporizador cuenta un número en cada ciclo de reloj, tardará 1 segundo en contar 1.000.000 de veces. Entonces aparece el primer parámetro: Valor de recarga automática . La función de este parámetro es: cuando el conteo alcanza el valor de recarga automática, se puede activar un indicador de interrupción de desbordamiento y el usuario puede obtener el indicador de interrupción de desbordamiento Obtener 1 vez.
    Sin embargo, la realidad no es tan ideal: el valor de recarga automática es de solo 16 bits y el valor de conteo del temporizador es de solo 16 bits, es decir, el conteo máximo solo puede llegar a 65535 y no puede llegar a 1000000 en todos ¿Qué debo hacer? Piénselo, dado que el conteo no puede alcanzar un número tan grande, ¿es posible hacer que el conteo no sea tan rápido? Por ejemplo, deje que el temporizador cuente a una frecuencia de 1 kHz, luego solo necesitará contar 1000 veces para obtener 1 segundo. Pero la entrada del temporizador es de 1MHz, ¿cómo puedo hacerlo más lento? En este momento, otro parámetro resulta útil: el valor del preescalador (Valor del preescalador) . Si se divide 1MHz entre 2, es 500kHz, y si se divide entre 1000, es 1kHz.

4. Configuración del temporizador

    Después de leer el principio, aquí veremos la implementación de la función específica, tomando el reloj de 1 s anterior como ejemplo, cómo configurarlo en CubeMX.

  • Configuracion basica

    Primero mire la interfaz de configuración, porque aquí solo necesitamos una función de notificación de tiempo y no necesitamos usar un puerto externo, por lo que podemos seleccionar directamente "TIM6" en la pestaña "Temporizadores" (TIM6 es el temporizador básico). marque Seleccione "Activado" para habilitar el temporizador.
inserte la descripción de la imagen aquí
    A continuación, consulte información de configuración básica.
inserte la descripción de la imagen aquí
Modo de un pulso: después de activar este modo, siempre que la bandera de desbordamiento se active una vez, la habilitación de conteo se desactivará automáticamente. Si desea activarlo nuevamente, debe activar manualmente la habilitación de conteo. Entonces, si desea implementar eventos desencadenantes periódicos, no necesita marcar esta opción.
Preescalador: uno de los asesinos de novatos, aunque el preescalador está escrito aquí, el valor de configuración real es el preescalador -1, es decir, cuando la frecuencia se divide por 10, debe establecerse en 9.
Modo contador: el modo de conteo, también llamado dirección de conteo, determina si el temporizador cuenta hacia arriba o hacia abajo. Si solo se usa para cronometrar, incrementar o disminuir no tiene ningún efecto.
Período de contador (Período de contador): cuando el valor de conteo alcanza el valor del período de conteo, se activará una bandera de desbordamiento. Asesino novato 2, porque el conteo comienza desde 0, por lo que si desea lograr 10 conteos, solo necesita configurar 9 es suficiente.
Recarga automática (precarga de recarga automática): si se selecciona la recarga automática, después de que se active una bandera de desbordamiento, el temporizador borrará automáticamente el conteo a 0 y comenzará a contar nuevamente.
Selección de evento de activación (Selección de evento de activación): puede optar por activar la salida a través del indicador UG, la habilitación de recuento y el indicador de desbordamiento, que generalmente no se utilizan.

    Para lograr una sincronización de 1 s, primero debemos conocer la frecuencia de reloj del temporizador actual. Primero verifique el árbol del reloj. TIM6 está colgado en el bus de reloj APB. Aquí lo configuramos de acuerdo con la frecuencia más alta de la microcomputadora de un solo chip, que es 48MHz.
inserte la descripción de la imagen aquí
    Para facilitar el cálculo, aquí podemos completar 47999 para el coeficiente del preescalador, que es 48000 división de frecuencia. El ciclo de conteo se puede completar con 999, es decir, contando 1000 veces. Además, habilite la recarga automática, para que se pueda obtener un recuento de ciclos de 1 s.
inserte la descripción de la imagen aquí
    Para informarnos inmediatamente cuándo finaliza el período de conteo para realizar algunas operaciones, también debemos abrir aquí la función de servicio de interrupción. En la pestaña "Configuración NVIC", verifique la habilitación de interrupción "TIM6".
inserte la descripción de la imagen aquí
    Después de completar la configuración anterior y seleccionar la biblioteca a usar, se puede generar el código del proyecto.

  • Implementación del código de la biblioteca LL

    Agregue el siguiente código al proyecto generado para invertir una variable bool cuando se activa una interrupción.

/***************************main.c******************************/
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  LL_TIM_EnableIT_UPDATE(TIM6);
  /* 使能计数 */
  LL_TIM_EnableCounter(TIM6);
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
/***********************************************************************/

/***************************stm32f0xx_it.c******************************/
void TIM6_DAC_IRQHandler(void)
{
    
    
  /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
  /* 进中断后判断如果使能了更新中断,且更新中断标志为1,则翻转数据,并清除标志 */
  if (   (LL_TIM_IsActiveFlag_UPDATE(TIM6))
      && (LL_TIM_IsEnabledIT_UPDATE(TIM6))
	   )
  {
    
    
      LL_TIM_ClearFlag_UPDATE(TIM6);
      TestTimer = (++TestTimer) % 2;
  }
  /* USER CODE END TIM6_DAC_IRQn 0 */

  /* USER CODE BEGIN TIM6_DAC_IRQn 1 */

  /* USER CODE END TIM6_DAC_IRQn 1 */
}
/*******************************************************************/
  • Implementación del código de la biblioteca HAL
/* USER CODE BEGIN 0 */
uint8_t TestTimer = 0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
  /* Prevent unused argument(s) compilation warning */
  UNUSED(htim);
  TestTimer = (++TestTimer) % 2;
  /* NOTE : This function should not be modified, when the callback is needed,
            the HAL_TIM_PeriodElapsedCallback could be implemented in the user file
   */
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
    
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM6_Init();
  /* USER CODE BEGIN 2 */
  
  /* 使能更新中断 */
  HAL_TIM_Base_Start_IT(&htim6);
  /* 启动定时器 */
  HAL_TIM_Base_Start(&htim6);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}
  • Demostración de efectos

inserte la descripción de la imagen aquí

    Al grabar software para depurar, puede ver que la variable cambia una vez cada 1 segundo.

5. Asuntos que requieren atención

1. Tenga en cuenta que al configurar el coeficiente del preescalador y el valor de recarga, debe restar 1, es decir, si desea dividir por 2, el PSC debe establecerse en 1, y si desea contar 10 reinicios, debe establezca 9 para el valor de recarga.
2. Después de configurar el proyecto generado, no se contará cuando se inicialice, debe llamar a la biblioteca LL para abrirlo durante el uso.

Supongo que te gusta

Origin blog.csdn.net/u012749085/article/details/131396208
Recomendado
Clasificación