Compartir tecnología

Temporizador STM32-TIM

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Este contenido se basa enVídeo STM32 de tecnología JiangxieContenido, organizado.

1. TIM

1.1 temporizador de tiempo

  • El temporizador puede contar el reloj de entrada y activar una interrupción cuando el valor de conteo alcanza el valor establecido.
  • La unidad base de tiempo del contador de 16 bits, el preescalador y el registro de recarga automática pueden alcanzar una temporización máxima de 59,65 s con un reloj de conteo de 72 MHz. 1/(72/65536/65536) (El contador es un registro que se utiliza para realizar el conteo. Cada vez que llega un reloj, el contador aumenta en 1. El preescalador puede dividir el reloj del contador para que el conteo sea más flexible. Reinicio automático El cargado El registro es el valor objetivo del conteo, que es cuántos relojes desea contar para solicitar una interrupción. Estos registros constituyen la parte central del temporizador. Este circuito se llama unidad base de tiempo.
  • No solo tiene funciones básicas de interrupción programada, sino que también incluye selección de fuente de reloj interna y externa, captura de entrada, comparación de salida, interfaz de codificador, modo de disparo maestro-esclavo y otras funciones.
  • Según la complejidad y los escenarios de aplicación, se divide en tres tipos: temporizador avanzado, temporizador general y temporizador básico.

1.2 Tipo de temporizador

tiponúmero de serieautobúsFunción
Temporizador avanzadoTIM1, TIM8APB2Tiene todas las funciones de un temporizador general, y adicionalmente tiene las funciones de contador de repeticiones, generación de zona muerta, salida complementaria, entrada de freno, etc.
Temporizador universalTIM2, TIM3, TIM4, TIM5APB1Tiene todas las funciones de un temporizador básico, y cuenta con funciones adicionales como selección de fuente de reloj interno y externo, captura de entrada, comparación de salida, interfaz de codificador, modo de disparo maestro-esclavo, etc.
temporizador básicoTIM6, TIM7APB1Tiene las funciones de interrupción programada y modo maestro que activa DAC
  • Recursos del temporizador STM32F103C8T6: TIM1, TIM2, TIM3, TIM4
  • DAC: convertidor digital a analógico

1.3 Temporizador básico

La función principal:

  • Contador acumulador de recarga automática de 16 bits
  • Preescalador programable de 16 bits, utilizado para dividir el reloj de entrada por cualquier valor entre 1 y 65536
  • Circuito síncrono que activa el DAC.
  • Solicitud de interrupción/DMA generada en el evento de actualización (desbordamiento del contador)

imagen.png

  • Preescalador PSC
    La entrada del reloj de conteo de referencia se conecta antes del preescalador. Dado que el temporizador básico solo puede seleccionar el reloj interno, se puede considerar que la línea de entrada del preescalador está conectada al reloj interno (CK_INT).
    La fuente del reloj interno es TIMxCLK de RCC. El valor de frecuencia aquí es generalmente la frecuencia principal del sistema de 72 MHz.
    Escribir 0 en el preescalador significa que no hay división de frecuencia; escribir 1 significa dividir la frecuencia por 2 y la frecuencia de salida = frecuencia de entrada/2 = 36 MHz.
    Escribir 2 significa dividir por 3 y salida = entrada/3. Por lo tanto, el valor del preescalador difiere del coeficiente de división de frecuencia real en 1, y el coeficiente de división de frecuencia real = el valor del preescalador 1. El preescalador es de 16 bits, por lo que el valor máximo se puede escribir como 65535, que se divide por 65536.

  • Contador CNT
    El contador puede contar el reloj de conteo previamente dividido. Cada vez que el reloj de conteo llega a un flanco ascendente, el valor del contador aumenta en 1. El contador también es de 16 bits, por lo que el valor interno se puede sumar de 0 a 65535. Si se agregan más, el contador volverá a 0 y comenzará de nuevo. Por lo tanto, el valor del contador continuará incrementándose durante el proceso de conteo. Cuando el incremento alcance el valor objetivo, se generará una interrupción y se completará la tarea programada. Por lo tanto, se necesita un registro para almacenar el valor objetivo, que es el registro de recarga automática.

  • Registro de recarga automática
    El registro de recarga automática también es de 16 bits y almacena el objetivo de conteo que se escribirá. Durante el proceso de ejecución, el valor de conteo continúa aumentando y el valor de recarga automática es un objetivo fijo. Cuando el valor de conteo es igual al valor de recarga automática, el tiempo se agota. Luego generará una señal de interrupción, borrará el contador y el contador comenzará automáticamente el siguiente tiempo de conteo.

  • Flechas U y UI
    Una flecha de descuento hacia arriba dibujada en la imagen significa que aquí se generará una señal de interrupción. Una interrupción como esta cuyo valor de conteo es igual al valor de recarga automática generalmente se denomina "interrupción de actualización". Esta interrupción de actualización conducirá al NVIC. Una vez que configuremos el canal del temporizador del NVIC, la CPU responderá a la interrupción de actualización del temporizador. La flecha hacia abajo representa que se generará un evento, y el evento correspondiente aquí se denomina "evento de actualización". Los eventos de actualización no provocan interrupciones, pero pueden provocar el funcionamiento de otros circuitos internos.

1.4 Temporizador general

La función principal:

  • Contador acumulador de recarga automática arriba, abajo, arriba/arriba de 16 bits

  • Preescalador programable de 16 bits, utilizado para dividir el reloj de entrada por cualquier valor entre 1 y 65536

  • 4 canales independientes:

    • captura de entrada
    • Comparación de salida
    • Generación PWM (modo alineado en el borde o en el centro)
    • Salida en modo de pulso único
  • Circuitos de sincronización que controlan temporizadores e interconexiones de temporizadores mediante señales externas.

  • La interrupción/DMA se genera cuando ocurren los siguientes eventos:

    • Actualización: Desbordamiento/desbordamiento insuficiente del contador, inicialización del contador (mediante software o disparador interno/externo)
    • Eventos de activación (inicio del contador, parada, inicialización o conteo activado por interno/externo)
    • captura de entrada
    • Comparación de salida
  • Admite codificadores incrementales (cuadratura) y circuitos de sensores Hall para posicionamiento

  • Entrada de disparo como reloj externo o gestión de corriente ciclo a ciclo
    imagen.png

  • contador CNT
    El contador CNT admite el modo de conteo ascendente, el modo de conteo descendente y el modo de alineación central. El modo de conteo descendente comienza desde el valor de recarga y disminuye hacia abajo. Después de disminuir a 0, regresa al valor de recarga y solicita una interrupción. El modo alineado en el centro comienza desde 0, primero aumenta hacia arriba, cuenta el valor de recarga y solicita una interrupción, y luego disminuye hacia abajo a 0, y luego solicita una interrupción.

  • fuente de reloj
    La fuente de reloj del temporizador general no solo puede elegir el reloj interno de 72 MHz, sino que también puede elegir un reloj externo.
    (1)El primer reloj externo es deReloj externo en el pin TIMx_ETR Es decir, puede conectar un reloj de onda cuadrada externo al pin ETR de TIM2, PA0, y luego configurar la selección de polaridad interna, la detección de bordes y el circuito preescalador, así como el circuito de filtro de entrada. Estos dos circuitos pueden sufrir el reloj. determinada conformación. Debido a que es un reloj de pines externo, inevitablemente habrá algunos fallos, por lo que estos circuitos pueden filtrar la forma de onda de entrada. La señal filtrada se divide en dos canales. El canal ETRF superior ingresa al controlador de disparo y luego se puede seleccionar el reloj como unidad base de tiempo. Este camino también se llama "Modo de reloj externo 2”。
    imagen.png
    (2) TRGI también puede proporcionar un reloj externo , Se utiliza principalmente como entrada de disparo. Esta entrada de disparo puede activar el modo esclavo del temporizador. Cuando TRGI se utiliza como reloj externo, esta ruta se llama "Modo de reloj externo 1". ¿Cuáles son los relojes externos que pasan por este canal? El primero es la señal del pin ETR. El segundo es la señal ITR. Esta parte de la señal del reloj proviene de otros temporizadores. El TRGO en modo maestro puede provocar Otros temporizadores Cuando se conecta a otros temporizadores, se conecta a los pines ITR de otros temporizadores. ITR0 a ITR3 provienen de las salidas TRGO de los otros cuatro temporizadores. También puede elegir TI1F_ED, que está conectado aquí a la unidad de captura de entrada. Pin CH1, es decir, el reloj se obtiene del pin CH1. El sufijo ED (Edge) aquí significa borde. También se puede obtener a través de TI1FP1 y TI2FP1 es el reloj conectado al pin CH1. el pin CH2.
    Resumen: La entrada al modo de reloj externo 1 puede ser el pin ETR, otros temporizadores, el borde del pin CH1, el pin CH1 y el pin CH2.

  • Circuito de comparación de salida
    La parte derecha a continuación es el circuito de comparación de salida. Hay cuatro canales en total, correspondientes a los pines de CH1 a CH4, que se pueden usar para generar formas de onda PWM y accionar motores.

  • Circuito de captura de entrada
    A la izquierda está el circuito de captura de entrada, que también tiene cuatro canales, correspondientes a los pines CH1 a CH4, que se pueden utilizar para medir la frecuencia de la onda cuadrada de entrada, etc.

  • capturar/comparar registro
    El registro intermedio es el registro de captura/comparación, que es compartido por los circuitos de captura de entrada y comparación de salida. Debido a que la captura de entrada y la comparación de salida no se pueden usar al mismo tiempo, los registros aquí se comparten y los pines también se comparten.

1.4 Temporizador avanzado

La función principal:

  • Contador acumulador de recarga automática arriba, abajo, arriba/arriba de 16 bits
  • Preescalador programable de 16 bits, utilizado para dividir el reloj de entrada por cualquier valor entre 1 y 65536
  • 4 canales independientes:
    • captura de entrada
    • Comparación de salida
    • Generación PWM (modo alineado en el borde o en el centro)
    • Salida en modo de pulso único
  • Salidas complementarias programables en tiempo muerto
  • Circuitos de sincronización que controlan temporizadores e interconexiones de temporizadores mediante señales externas.
  • Permite actualizar un contador repetido en un registro de temporizador después de un período de contador de datos específicos
  • La señal de entrada del freno puede colocar la señal de salida del temporizador en un estado de reinicio o en un estado conocido.
  • La interrupción/DMA se genera cuando ocurren los siguientes eventos:
    • Actualización: Desbordamiento/desbordamiento insuficiente del contador, inicialización del contador (mediante software o disparador interno/externo)
    • Eventos de activación (inicio del contador, parada, inicialización o conteo activado por interno/externo)
    • captura de entrada
    • Comparación de salida
    • Entrada de señal de freno
  • Admite codificadores incrementales (cuadratura) y circuitos de sensores Hall para posicionamiento
  • Entrada de disparo como reloj externo o gestión de corriente ciclo a ciclo

imagen.png

  • Contador de repetición
    La diferencia con un temporizador general: el primero es agregar un contador de repetición donde se aplica la interrupción. Con este contador, es posible darse cuenta de que los eventos de actualización y las interrupciones de actualización solo ocurren cada pocos ciclos de conteo. La estructura original es que se producirá una actualización después de que se complete cada ciclo de conteo, lo que equivale a dividir nuevamente la señal de actualización de salida.

  • Generador de banda muerta DTG y salida complementaria
    La siguiente es la actualización del módulo de comparación de salida mediante el temporizador avanzado DTG (generación de tiempo muerto) es un circuito de generación de zona muerta. El pin de salida de la derecha se ha cambiado del original a dos salidas complementarias, que pueden generar un par de ondas PWM complementarias. Estos circuitos se utilizan para impulsar motores trifásicos sin escobillas, como aviones cuadricópteros y ruedas traseras eléctricas. vehículos y taladros eléctricos. Espera, puede que sea un motor trifásico sin escobillas. Debido a que el circuito de accionamiento de un motor trifásico sin escobillas generalmente requiere 3 brazos de puente, cada brazo de puente está controlado por 2 tubos de conmutación de alta potencia, por lo que se requieren un total de 6 tubos de conmutación de alta potencia. Por lo tanto, los primeros tres pines de salida PWM aquí se convierten en salidas complementarias. Además, para evitar el fenómeno de disparo a corto plazo causado por las imperfecciones del dispositivo en el momento de la conmutación cuando la salida complementaria PWM impulsa el brazo del puente, se agrega un circuito de generación de zona muerta en el frente. En el momento en que se activa el interruptor, se genera una zona muerta de un cierto período de tiempo, lo que permite apagar los tubos superior e inferior del brazo del puente para evitar disparos.

  • entrada de freno
    La última parte es la función de entrada del freno, que proporciona garantía de seguridad para el accionamiento del motor. Si el pin externo BKIN (Break IN) genera una señal de freno, o el reloj interno falla y ocurre una falla, el circuito de control cortará automáticamente la salida del motor para evitar accidentes.

1.5 Estructura básica de interrupción programada

imagen.png
Control de operación: controla algunos bits en el registro, como inicio y parada, cuenta ascendente o descendente, etc.
El lado derecho es donde va la señal después de que se agota el tiempo y se genera la interrupción de actualización. Si es un temporizador avanzado, habrá un contador de repetición adicional. La señal de interrupción primero establecerá un bit de indicador de interrupción en el registro de estado. Este bit de indicador se controlará a través de la salida de interrupción y solicitará una interrupción al NVIC. El control de salida de interrupción es un bit de habilitación para la salida de interrupción. Si necesita una interrupción, recuerde habilitarla.
imagen.png
imagen.png

1.6 Sincronización del preescalador

imagen.png

  • Frecuencia de conteo del contador: CK_CNT = CK_PSC / (PSC 1)
  • CK_PSC: Reloj preescalador, el reloj interno es de 72MHz.
  • CNT_EN: el contador está habilitado, el contador de alto nivel se ejecuta normalmente y el contador de bajo nivel se detiene.
  • CK_CNT: reloj del contador, que es tanto la salida del reloj del preescalador como la entrada del reloj del contador.
  • Al principio, el contador no está habilitado y el reloj del contador no está en marcha. Después de habilitar, en la primera mitad del período, el coeficiente de división de frecuencia real es 1 (PSC = 0), y el reloj del contador es igual al reloj antes del preescalador en la segunda mitad, el coeficiente de división de frecuencia real es 2 ( PSC=1), y el reloj del contador. El reloj se convierte en la mitad del reloj anterior al preescalador. Impulsado por el reloj del contador, el siguiente registro del contador también continúa incrementándose con el flanco ascendente del reloj. Después de la posición media FC, el valor de conteo se vuelve 0. De aquí, se puede inferir que el valor de recarga automática de ARR es FC. Cuando el valor del conteo es igual al valor de recarga y llega el siguiente reloj, el valor del conteo se borra a cero y se genera un evento de actualización a continuación. Este es el flujo de trabajo de un ciclo de conteo.
  • Las siguientes tres líneas describen un mecanismo de almacenamiento en búfer del registro del preescalador. Es decir, en realidad hay dos registros del preescalador. Uno es el registro de control del preescalador, que no determina directamente el coeficiente de división de frecuencia. . También hay un registro de búfer o registro de sombra: el búfer del preescalador. Este registro de búfer es el registro que realmente funciona. Por ejemplo, en un momento determinado, cambiamos el registro del preescalador de 0 a 1. Si en este momento, cambiamos la frecuencia. El coeficiente de división del reloj provocará inmediatamente que la frecuencia de la primera mitad y la segunda mitad sean diferentes dentro de un ciclo de conteo. Por lo tanto, se diseña un búfer cuando el conteo alcanza la mitad del conteo, se cambia el valor del preescalador. Este cambio no tendrá efecto inmediatamente, sino que esperará hasta el final de este ciclo de conteo y se producirá un evento de actualización. El valor del registro del preescalador se cambiará. Se pasará al registro del búfer antes de que entre en vigor.
  • Como se puede ver en la última línea: el preescalador también se basa en el conteo para dividir la frecuencia. Cuando el valor del preescalador es 0, el contador siempre es 0 y genera directamente la frecuencia original cuando el valor del preescalador es 1. 1, 0, 1, 0, 1 cuenta así. Cuando vuelve a 0, genera 1 pulso. De esta manera, la frecuencia de salida se divide por 2 de la frecuencia de entrada. coeficiente de división de frecuencia real. Hay un desplazamiento de un número.

1.7 Contratiempo

imagen.png

  • Frecuencia de desbordamiento del contador: CK_CNT_OV = CK_CNT / (ARR 1) = CK_PSC / (PSC 1) / (ARR 1)
  • CK_INT: Reloj interno 72MHz;
  • CNT_EN: Habilitación del contador, válido en flanco ascendente;
  • CK_CNT: Contador de reloj, debido a que el coeficiente de división de frecuencia es 2, esta frecuencia es CK_INT dividida por 2. Luego, el contador aumenta en cada flanco ascendente de este reloj. Cuando llega a 0036, se produce un desbordamiento. Después de contar hasta 36, ​​hay otro flanco ascendente, el contador se borra, el contador se desborda y se genera un pulso de evento de actualización. Además, se establece un indicador de interrupción de actualización (UIF). establecido en 1, se solicita una interrupción. Después de responder a la interrupción, es necesario borrarla manualmente en el programa de interrupción.

1.8 El contador no tiene secuencia de temporización preinstalada.

imagen.png
El registro de carga automática se cambió de FF a 36, ​​y el valor objetivo del valor de conteo cambió de FF a 36, ​​por lo que después de contar 36 aquí, se actualizará directamente para comenzar la siguiente ronda de conteo.

1.9 El contador tiene temporización preinstalada

imagen.png
En medio del conteo, cambie el valor objetivo de conteo de F5 a 36. Hay un registro de sombra a continuación. Este registro de sombra es realmente efectivo. Todavía es F5, por lo que ahora el objetivo de conteo todavía cuenta hasta F5, lo que genera un evento de actualización. Al mismo tiempo, los 36 que se van a cambiar se pasan a la sombra. registro, y en el siguiente recuento Este cambio solo es válido si el ciclo es 36, por lo que el propósito de introducir el registro de sombra es en realidad para la sincronización, es decir, para permitir que los cambios de valores y los eventos de actualización ocurran sincrónicamente para evitar errores causados ​​por los cambios. durante la operación.

1.10 árbol de reloj RCC

imagen.png

  • fuente de reloj
    En el circuito de generación de reloj existen cuatro fuentes de oscilación:
    (1) HSI: Oscilador RC interno de alta velocidad de 8 MHz;
    (2) HSE: oscilador de cristal de cuarzo externo de alta velocidad de 4 ~ 16 MHz, también conocido como oscilador de cristal, generalmente se conecta a 8 MHz;
    (3) LSE: oscilador de cristal externo de baja velocidad de 32,768 KHz, que generalmente proporciona el reloj para RTC;
    (4) LSI: Finalmente, está el oscilador RC interno de baja velocidad de 40 KHz, que puede proporcionar el reloj para el perro guardián.
    Los dos osciladores de cristal de alta velocidad anteriores se utilizan para proporcionar relojes del sistema. Los relojes de AHB, APB2 y APB1 se derivan de estos dos osciladores de cristal de alta velocidad. Solo que el oscilador de cuarzo externo es más estable que el interno. Oscilador RC, por lo que generalmente se utiliza un oscilador de cristal externo.

  • Reloj de configuración ST
    En la función SystemInit, ST configura el reloj: primero inicia el reloj interno HSI, selecciona el reloj interno de 8MHz como reloj del sistema y ejecuta temporalmente el reloj interno de 8MHz. Luego inicie el reloj externo, configure el reloj externo para ingresar al bucle de bloqueo de fase PLL para la multiplicación de frecuencia, 8 MHz se multiplica por 9 y obtendrá 72 MHz. Después de que la salida del bucle de bloqueo de fase sea estable, seleccione el bucle de bloqueo de fase. salida como reloj del sistema, de modo que el reloj del sistema cambie de 8MHz a 72MHz.

  • Sistema de seguridad del reloj CSS
    CSS (sistema de seguridad del reloj): el sistema de seguridad del reloj también es responsable de cambiar los relojes. Puede monitorear el estado de funcionamiento del reloj externo. Una vez que el reloj externo falla, automáticamente cambiará el reloj externo al reloj interno para garantizar el funcionamiento. del reloj del sistema y evitar que el programa se atasque. Muerte causada por accidente.

  • circuito de distribución de reloj

    • Bus AHB: Primero, el reloj del sistema de 72 MHz ingresa al bus AHB. El bus AHB tiene un preescalador. El coeficiente de distribución configurado en SystemInit es 1, por lo que el reloj AHB es de 72 MHz.
    • Bus APB1: El coeficiente de distribución configurado aquí es 2, por lo que el reloj del bus APB1 es 72MHz/2=36MHz.A continuación, si el coeficiente del preescalador APB1 = 1, la frecuencia permanece sin cambios; de lo contrario, la frecuencia*2, y luego en el lado derecho, se abre por separado para los temporizadores 2-7, debido a que el coeficiente del preescalador aquí es 2, por lo que la frecuencia aquí debe ser*2 , por lo que el reloj que lleva a los temporizadores 2 a 7 es de 72 MHz. Por tanto, ya sea un temporizador avanzado, un temporizador general o un temporizador básico, su reloj de referencia interno es de 72MHz.
    • Bus APB2: el factor de división de frecuencia de APB2 es 1, por lo que el reloj es de 72MHz.Luego, el reloj conectado a APB2 también se enciende. Es decir, si el coeficiente del preescalador APB2 = 1, la frecuencia permanece sin cambios; en caso contrario, la frecuencia.*2 . Como el coeficiente de división de frecuencia es 1, los relojes de los temporizadores 1 y 8 son de 72 MHz.
    • La parte de salida del reloj tiene una puerta AND para el control de salida. El bit de control escribe la habilitación del reloj externo. Aquí es donde escribimos RCC_APB2/1PeriphClockCmd en el programa. Para encender el reloj, escriba 1 en esta posición para dejar el reloj a la izquierda. se puede enviar a periféricos a través de puertas AND.

2. Funciones y códigos de la biblioteca TIM

2.1 Funciones de la biblioteca TIM

// 恢复缺省配置
void TIM_DeInit(TIM_TypeDef* TIMx);

// 时基单元初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 结构体变量赋一个默认值
void TIM_TimeBaseStructInit(TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);

// 使能计数器---运行控制
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

// 使能中断输出---中断输出控制
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);

/*-----------------时基单元的时钟选择---------*/
// 选择内部时钟
void TIM_InternalClockConfig(TIM_TypeDef* TIMx);

// 选择ITRx其他定时器的时钟
void TIM_ITRxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource);

// 选择TIx捕获通道的时钟
void TIM_TIxExternalClockConfig(TIM_TypeDef* TIMx, uint16_t TIM_TIxExternalCLKSource,
                                uint16_t TIM_ICPolarity, uint16_t ICFilter);

// 选择ETR通过外部时钟模式1输入的时钟
void TIM_ETRClockMode1Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                             uint16_t ExtTRGFilter);

// 选择ETR通过外部时钟模式2输入的时钟
void TIM_ETRClockMode2Config(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, 
                             uint16_t TIM_ExtTRGPolarity, uint16_t ExtTRGFilter);

/*--------------------------------------------------------*/
// 不是用来选择时钟的,单独用来配置ETR引脚的预分频器、极性、滤波参数的
void TIM_ETRConfig(TIM_TypeDef* TIMx, uint16_t TIM_ExtTRGPrescaler, uint16_t TIM_ExtTRGPolarity,
                   uint16_t ExtTRGFilter);

// 用来单独写预分频值的
void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode);

// 用来改变计数器的计数模式
void TIM_CounterModeConfig(TIM_TypeDef* TIMx, uint16_t TIM_CounterMode);

// 自动重装器预装功能配置
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

// 给计数器写入一个值
void TIM_SetCounter(TIM_TypeDef* TIMx, uint16_t Counter);

// 给自动重装器写入一个值
void TIM_SetAutoreload(TIM_TypeDef* TIMx, uint16_t Autoreload);

// 获取当前计数器的值
uint16_t TIM_GetCounter(TIM_TypeDef* TIMx);

// 获取当前的预分频器的值
uint16_t TIM_GetPrescaler(TIM_TypeDef* TIMx);

/*-------------获取标志位和清除标志位的------------*/
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);