Compartilhamento de tecnologia

Temporizador STM32-TIM

2024-07-11

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

Este conteúdo é baseado emVídeo da tecnologia Jiangxie STM32Conteúdo, organizado.

1. TEMPO

1.1 Temporizador TIM

  • O temporizador pode contar o relógio de entrada e disparar uma interrupção quando o valor da contagem atingir o valor definido.
  • A unidade base de tempo do contador de 16 bits, pré-escalador e registro de recarga automática pode atingir um tempo máximo de 59,65s em um relógio de contagem de 72MHz. 1/(72/65536/65536) (O contador é um registro usado para realizar a contagem do tempo. Cada vez que um relógio chega, o contador aumenta em 1. O prescaler pode dividir o relógio do contador para tornar a contagem mais flexível. Reinicialização automática O carregado registrador é o valor alvo da contagem, que é quantos clocks você deseja contar para aplicar uma interrupção. Esses registradores constituem a parte central do temporizador. Este circuito é chamado de unidade base de tempo.
  • Ele não possui apenas funções básicas de interrupção programada, mas também inclui seleção de fonte de relógio interna e externa, captura de entrada, comparação de saída, interface de codificador, modo de disparo mestre-escravo e outras funções.
  • De acordo com a complexidade e os cenários de aplicação, é dividido em três tipos: cronômetro avançado, cronômetro geral e cronômetro básico.

1.2 Tipo de temporizador

tiponúmero de sérieônibusFunção
Temporizador avançadoTIM1, TIM8APB2Possui todas as funções de um temporizador geral, e adicionalmente possui as funções de contador de repetições, geração de zona morta, saída complementar, entrada de freio, etc.
Temporizador universalTIM2, TIM3, TIM4, TIM5APB1Possui todas as funções de um temporizador básico e possui funções adicionais, como seleção de fonte de relógio interna e externa, captura de entrada, comparação de saída, interface de codificador, modo de disparo mestre-escravo, etc.
temporizador básicoTIM6, TIM7APB1Possui as funções de interrupção programada e modo mestre acionando DAC
  • Recursos do temporizador STM32F103C8T6: TIM1, TIM2, TIM3, TIM4
  • DAC: conversor digital para analógico

1.3 Temporizador básico

A principal função:

  • Contador acumulador de recarga automática de 16 bits
  • Prescaler programável de 16 bits, usado para dividir o clock de entrada por qualquer valor entre 1 e 65536
  • Circuito síncrono que aciona o DAC
  • Solicitação de interrupção/DMA gerada em evento de atualização (estouro de contador)

imagem.png

  • Pré-escalador PSC
    A entrada do relógio de contagem de referência é conectada antes do prescaler. Como o temporizador básico só pode selecionar o relógio interno, a linha de entrada do prescaler pode ser considerada conectada ao relógio interno (CK_INT).
    A fonte do relógio interno é o TIMxCLK do RCC. O valor da frequência aqui é geralmente a frequência principal do sistema de 72 MHz.
    Escrever 0 no prescaler significa que não há divisão de frequência; escrever 1 significa dividir a frequência por 2, e a frequência de saída = frequência de entrada/2 = 36MHz.
    Escrever 2 significa dividir por 3 e saída = entrada/3. Portanto, o valor do prescaler difere do coeficiente de divisão de frequência real em 1, e o coeficiente de divisão de frequência real = o valor do prescaler 1. O pré-escalador tem 16 bits, portanto o valor máximo pode ser escrito como 65535, que é dividido por 65536.

  • Contador CNT
    O contador pode contar o relógio de contagem pré-dividido. Cada vez que o relógio de contagem chega a uma borda ascendente, o valor do contador aumenta em 1. O contador também tem 16 bits, portanto o valor interno pode ser somado de 0 a 65535. Se forem adicionados mais, o contador retornará a 0 e começará novamente. Portanto, o valor do contador continuará a aumentar durante o processo de contagem. Quando o incremento atingir o valor alvo, uma interrupção será gerada e a tarefa agendada será concluída. Portanto, é necessário um registrador para armazenar o valor alvo, que é o registrador de recarga automática.

  • Registro de recarga automática
    O registro de recarga automática também tem 16 bits e armazena o alvo de contagem a ser gravado. Durante o processo de execução, o valor de contagem continua a aumentar e o valor de recarga automática é um alvo fixo. Quando o valor de contagem é igual ao valor de recarga automática, o tempo de tempo termina. Em seguida, ele gerará um sinal de interrupção, limpará o contador e o contador iniciará automaticamente a próxima contagem.

  • Setas U e UI
    Uma seta de desconto para cima desenhada na imagem significa que um sinal de interrupção será gerado aqui. Uma interrupção como esta, cujo valor de contagem é igual ao valor de recarga automática, é geralmente chamada de "interrupção de atualização". Esta interrupção de atualização levará ao NVIC. Assim que configurarmos o canal do temporizador do NVIC, a interrupção de atualização do temporizador será respondida pela CPU. A seta para baixo representa que um evento será gerado, e o evento correspondente aqui é chamado de "evento de atualização". Os eventos de atualização não acionam interrupções, mas podem acionar o funcionamento de outros circuitos internos.

1.4 Temporizador geral

A principal função:

  • Contador de acumulador de recarga automática de 16 bits para cima, para baixo, para cima/para cima

  • Prescaler programável de 16 bits, usado para dividir o clock de entrada por qualquer valor entre 1 e 65536

  • 4 canais independentes:

    • captura de entrada
    • Comparação de resultados
    • Geração PWM (modo alinhado ao centro ou borda)
    • Saída de modo de pulso único
  • Circuitos de sincronização que controlam temporizadores e interconexões de temporizadores usando sinais externos

  • A interrupção/DMA é gerada quando ocorrem os seguintes eventos:

    • Atualização: estouro/underflow do contador, inicialização do contador (via software ou gatilho interno/externo)
    • Eventos de disparo (início, parada, inicialização ou contagem do contador acionados por interno/externo)
    • captura de entrada
    • Comparação de resultados
  • Suporta codificador incremental (quadratura) e circuitos de sensor Hall para posicionamento

  • Acione a entrada como relógio externo ou gerenciamento de corrente ciclo a ciclo
    imagem.png

  • Contador CNT
    O contador CNT suporta modo de contagem crescente, modo de contagem regressiva e modo de alinhamento central. O modo de contagem decrescente começa a partir do valor de recarga e diminui para baixo. Depois de diminuir para 0, ele retorna ao valor de recarga e aplica uma interrupção. O modo alinhado ao centro começa em 0, primeiro aumenta para cima, conta o valor de recarga e aplica-se a uma interrupção e, em seguida, diminui para 0 e, em seguida, aplica-se a uma interrupção.

  • fonte de relógio
    A fonte do relógio do temporizador geral pode não apenas escolher o relógio interno de 72 MHz, mas também pode escolher um relógio externo.
    (1)O primeiro relógio externo é deRelógio externo no pino TIMx_ETR , ou seja, você pode conectar um relógio de onda quadrada externo ao pino ETR do TIM2, PA0, e então configurar a seleção de polaridade interna, detecção de borda e circuito pré-escalador, bem como o circuito de filtro de entrada. Esses dois circuitos podem O relógio sofre. determinada moldagem. Por ser um clock de pino externo, inevitavelmente haverá algumas falhas, então esses circuitos podem filtrar a forma de onda de entrada. O sinal filtrado é dividido em dois canais. O canal ETRF superior entra no controlador de disparo e então o relógio pode ser selecionado como unidade base de tempo. Esta estrada também é chamada de "Modo de relógio externo 2”。
    imagem.png
    (2) TRGI também pode fornecer um relógio externo , usado principalmente como entrada de disparo. Esta entrada de disparo pode acionar o modo escravo do temporizador. Quando TRGI é usado como relógio externo, esse caminho é chamado de "Modo de relógio externo 1". Quais são os relógios externos que passam por este caminho? O primeiro é o sinal do pino ETR. O segundo é o sinal ITR. Esta parte do sinal do relógio vem de outros temporizadores. O TRGO no modo mestre pode levar a outros temporizadores Ao conectar a outros temporizadores, ele é conectado aos pinos ITR de outros temporizadores ITR0 a ITR3 provenientes das saídas TRGO dos outros quatro temporizadores. Você também pode escolher TI1F_ED, que é conectado aqui à unidade de captura de entrada. Pino CH1, ou seja, o clock é obtido a partir do pino CH1. O sufixo ED (Edge) aqui significa borda. Também pode ser obtido através de TI1FP1 e TI2FP1 é o clock conectado ao pino CH1, e TI2FP2 é conectado a. o pino CH2.
    Resumo: A entrada para o modo de relógio externo 1 pode ser o pino ETR, outros temporizadores, a borda do pino CH1, o pino CH1 e o pino CH2.

  • Circuito de comparação de saída
    A parte direita abaixo é o circuito de comparação de saída. Existem quatro canais no total, correspondendo aos pinos de CH1 a CH4, que podem ser usados ​​para gerar formas de onda PWM e acionar motores.

  • Circuito de captura de entrada
    À esquerda está o circuito de captura de entrada, que também possui quatro canais, correspondentes aos pinos CH1 a CH4, que podem ser usados ​​para medir a frequência da onda quadrada de entrada, etc.

  • capturar/comparar registro
    O registro intermediário é o registro de captura/comparação, que é compartilhado pelos circuitos de captura de entrada e comparação de saída. Como a captura de entrada e a comparação de saída não podem ser usadas ao mesmo tempo, os registros aqui são compartilhados e os pinos também são compartilhados.

1.4 Temporizador avançado

A principal função:

  • Contador de acumulador de recarga automática de 16 bits para cima, para baixo, para cima/para cima
  • Prescaler programável de 16 bits, usado para dividir o clock de entrada por qualquer valor entre 1 e 65536
  • 4 canais independentes:
    • captura de entrada
    • Comparação de resultados
    • Geração PWM (modo alinhado ao centro ou borda)
    • Saída de modo de pulso único
  • Saídas complementares programáveis ​​em tempo morto
  • Circuitos de sincronização que controlam temporizadores e interconexões de temporizadores usando sinais externos
  • Permite que um contador repetido seja atualizado em um registro de temporizador após um período de contador de dados especificados
  • O sinal de entrada do freio pode colocar o sinal de saída do temporizador em um estado de reinicialização ou em um estado conhecido
  • A interrupção/DMA é gerada quando ocorrem os seguintes eventos:
    • Atualização: estouro/underflow do contador, inicialização do contador (via software ou gatilho interno/externo)
    • Eventos de disparo (início, parada, inicialização ou contagem do contador acionados por interno/externo)
    • captura de entrada
    • Comparação de resultados
    • Entrada de sinal de freio
  • Suporta codificador incremental (quadratura) e circuitos de sensor Hall para posicionamento
  • Acione a entrada como relógio externo ou gerenciamento de corrente ciclo a ciclo

imagem.png

  • Repetir contador
    A diferença de um temporizador geral: o primeiro é adicionar um contador de repetições onde a interrupção é aplicada. Com este contador é possível perceber que eventos de atualização e interrupções de atualização ocorrem apenas a cada poucos ciclos de contagem. A estrutura original é que uma atualização ocorrerá após a conclusão de cada ciclo de contagem, o que equivale a dividir o sinal de atualização de saída novamente.

  • Gerador de banda morta DTG e saída complementar
    A seguir está a atualização do módulo de comparação de saída pelo temporizador avançado DTG (geração de tempo morto) que é um circuito de geração de zona morta. O pino de saída à direita foi alterado do original para duas saídas complementares, que podem produzir um par de ondas PWM complementares. Esses circuitos são usados ​​para acionar motores trifásicos sem escova, como aeronaves quadricópteros, as rodas traseiras de elétricos. veículos e furadeiras elétricas Espere, pode ser um motor trifásico sem escova. Como o circuito de acionamento de um motor sem escova trifásico geralmente requer 3 braços de ponte, cada braço de ponte é controlado por 2 tubos de comutação de alta potência, portanto, são necessários um total de 6 tubos de comutação de alta potência. Portanto, os três primeiros pinos de saída PWM aqui se tornam saídas complementares. Além disso, para evitar o fenômeno de disparo de curto prazo causado pelas imperfeições do dispositivo no momento da comutação, quando a saída complementar PWM aciona o braço da ponte, um circuito de geração de zona morta é adicionado na frente. No momento em que a chave é acionada, é gerada uma zona morta de um determinado período de tempo, permitindo que os tubos superior e inferior do braço da ponte sejam desligados para evitar disparos.

  • entrada de freio
    A última parte é a função de entrada do freio, que fornece garantia de segurança ao acionamento do motor. Se o pino externo BKIN (Break IN) gerar um sinal de freio, ou o relógio interno falhar e ocorrer uma falha, o circuito de controle cortará automaticamente a saída do motor para evitar acidentes.

1.5 Estrutura básica de interrupção programada

imagem.png
Controle de operação: controle alguns bits no registro, como iniciar e parar, contagem crescente ou regressiva, etc.
O lado direito é para onde o sinal vai após o tempo de tempo terminar e a interrupção de atualização ser gerada. Se for um temporizador avançado, haverá um contador de repetição adicional. O sinal de interrupção primeiro definirá um bit de sinalização de interrupção no registro de status. Este bit de sinalização será controlado por meio da saída de interrupção e aplicará uma interrupção ao NVIC. O controle de saída de interrupção é um bit de habilitação para saída de interrupção. Se você precisar de uma interrupção, lembre-se de permiti-la.
imagem.png
imagem.png

1.6 Tempo do pré-escalador

imagem.png

  • Frequência de contagem do contador: CK_CNT = CK_PSC / (PSC 1)
  • CK_PSC: Relógio pré-escalador, o relógio interno é 72MHz.
  • CNT_EN: O contador está habilitado, o contador de alto nível funciona normalmente e o contador de baixo nível para.
  • CK_CNT: Contador de relógio, que é tanto a saída de relógio do pré-escalador quanto a entrada de relógio do contador.
  • No início, o contador não está habilitado e o contador-relógio não está funcionando. Após a habilitação, na primeira metade do período, o coeficiente de divisão de frequência real é 1 (PSC=0), e o relógio do contador é igual ao relógio antes do pré-escalador na segunda metade, o coeficiente de divisão de frequência real é 2 (; PSC=1), e o relógio do contador O relógio se torna metade do relógio antes do prescaler. Impulsionado pelo relógio do contador, o registro do contador seguinte também continua a aumentar com a borda ascendente do relógio. Após a posição intermediária FC, o valor da contagem torna-se 0. A partir daqui, pode-se inferir que o valor de recarga automática do ARR é FC. Quando o valor da contagem é igual ao valor de recarga e o próximo relógio chega, o valor da contagem é zerado e um evento de atualização é gerado abaixo. Este é o fluxo de trabalho de um ciclo de contagem.
  • As três linhas a seguir descrevem um mecanismo de buffer do registro do pré-escalador. Ou seja, na verdade existem dois registros do pré-escalador. Um é o registro de controle do pré-escalador, que é para nós ler e escrever. . Há também um registro de buffer ou registro de sombra: o buffer do pré-escalador. Este registro de buffer é o registro que realmente funciona. Por exemplo, em um determinado momento, mudamos o registro do pré-escalador de 0 para 1. Nesse momento, alteramos a frequência. O coeficiente de divisão do relógio imediatamente fará com que a frequência da primeira metade e da segunda metade seja diferente dentro de um ciclo de contagem. Portanto, um buffer é projetado quando a contagem atinge a metade da contagem, o valor do pré-escalador é alterado e o evento de atualização não entra em vigor imediatamente. o valor do registro prescaler será alterado. Será passado para o registro buffer antes de entrar em vigor.
  • Como pode ser visto na última linha: o prescaler também depende da contagem para dividir a frequência. Quando o valor do prescaler é 0, o contador é sempre 0 e gera diretamente a frequência original quando o valor do prescaler é 1, o contador é 0; 1, 0, 1, 0, 1 conta assim. Quando retorna a 0, gera 1 pulso. Desta forma, a frequência de saída é dividida por 2 da frequência de entrada. coeficiente de divisão de frequência real. Há um deslocamento de um número.

1.7 Tempo do contador

imagem.png

  • Frequência de estouro do contador: CK_CNT_OV = CK_CNT / (ARR 1) = CK_PSC / (PSC 1) / (ARR 1)
  • CK_INT: Clock interno 72MHz;
  • CNT_EN: Habilitação do contador, válida em borda de subida;
  • CK_CNT: Contador de relógio, como o coeficiente de divisão de frequência é 2, essa frequência é CK_INT dividida por 2. Em seguida, o contador aumenta em cada borda ascendente deste relógio. Quando atinge 0036, ocorre um estouro. Depois de contar até 36, há outra borda ascendente, o contador é zerado, o contador transborda e um pulso de evento de atualização é gerado. Além disso, um sinalizador de interrupção de atualização (UIF) é definido. definido como 1, uma interrupção é solicitada. Após a interrupção ser respondida, ela precisa ser apagada manualmente no programa de interrupção.

1.8 O contador não possui sequência de temporização pré-instalada.

imagem.png
O registro de carregamento automático foi alterado de FF para 36, ​​e o valor alvo do valor de contagem mudou de FF para 36, ​​portanto, após contar 36 aqui, ele será atualizado diretamente para iniciar a próxima rodada de contagem.

1.9 O contador possui cronometragem pré-instalada

imagem.png
No meio da contagem, altere o valor alvo da contagem de F5 para 36. Há um registro de sombra abaixo. Este registro de sombra ainda é F5, então agora o alvo de contagem ainda está contando para F5, gerando um evento de atualização ao mesmo tempo, o 36 a ser alterado é passado para a sombra. registrador e na próxima contagem Essa alteração só é válida se o ciclo for 36, portanto o objetivo da introdução do registrador sombra é na verdade para sincronização, ou seja, permitir que alterações de valores e eventos de atualização ocorram de forma síncrona para evitar erros causados ​​​​por alterações durante a operação.

1.10 Árvore do relógio RCC

imagem.png

  • fonte de relógio
    No circuito de geração de clock, existem quatro fontes de oscilação:
    (1) HSI: oscilador RC interno de alta velocidade de 8 MHz;
    (2) HSE: Oscilador de cristal de quartzo externo de alta velocidade de 4 ~ 16 MHz, também conhecido como oscilador de cristal, geralmente é conectado a 8 MHz;
    (3) LSE: oscilador de cristal externo de baixa velocidade de 32,768 KHz, que geralmente fornece o clock para RTC;
    (4) LSI: Finalmente, existe o oscilador RC interno de baixa velocidade de 40KHz, que pode fornecer o relógio para o watchdog.
    Os dois osciladores de cristal de alta velocidade acima são usados ​​para fornecer o relógio do sistema. Os relógios de AHB, APB2 e APB1 são todos derivados desses dois osciladores de cristal de alta velocidade. oscilador RC interno, por isso geralmente é usado um oscilador de cristal externo.

  • Relógio de configuração ST
    Na função SystemInit, ST configura o clock: primeiro ele inicia o clock interno HSI, seleciona os 8MHz internos como clock do sistema e funciona temporariamente com o clock interno de 8MHz. Em seguida, inicie o relógio externo, configure o relógio externo para entrar no loop de bloqueio de fase PLL para multiplicação de frequência, 8 MHz é multiplicado por 9 vezes e você obtém 72 MHz. Depois que a saída do loop de bloqueio de fase estiver estável, selecione o loop de bloqueio de fase. saída como o relógio do sistema, de modo que o relógio do sistema mudou de 8 MHz para 72 MHz.

  • Sistema de segurança de relógio CSS
    CSS (sistema de segurança de relógio): O sistema de segurança de relógio também é responsável por alternar os relógios. Ele pode monitorar o status de funcionamento do relógio externo. Assim que o relógio externo falhar, ele mudará automaticamente o relógio externo de volta para o relógio interno para garantir a operação. do relógio do sistema e evitar programa preso Morte causada por acidente.

  • circuito de distribuição de relógio

    • Barramento AHB: Primeiro, o clock do sistema de 72 MHz entra no barramento AHB. O barramento AHB possui um pré-escalador. O coeficiente de distribuição configurado no SystemInit é 1, então o clock AHB é de 72 MHz.
    • Barramento APB1: O coeficiente de distribuição configurado aqui é 2, então o clock do barramento APB1 é 72MHz/2=36MHz.Abaixo, se o coeficiente do prescaler APB1 = 1, a frequência permanece inalterada, caso contrário, a frequência*2, e então no lado direito, ele é aberto separadamente para os temporizadores 2 a 7, porque o coeficiente do pré-escalador aqui é 2, então a frequência aqui precisa ser*2 , então o clock que leva aos temporizadores 2 ~ 7 é de 72 MHz. Portanto, seja um temporizador avançado, um temporizador geral ou um temporizador básico, o seu relógio de referência interno é de 72MHz.
    • Barramento APB2: O fator de divisão de frequência do APB2 é 1, então o clock é de 72 MHz.Então o relógio conectado ao APB2 também é ligado. Ou seja, se o coeficiente do pré-escalador APB2 = 1, a frequência permanece inalterada, caso contrário a frequência.*2 . Como o coeficiente de divisão de frequência é 1, os clocks dos temporizadores 1 e 8 são de 72 MHz.
    • A parte de saída do relógio possui uma porta AND para controle de saída. O bit de controle escreve a habilitação do relógio externo. É aqui que escrevemos RCC_APB2/1PeriphClockCmd no programa. pode ser enviado para periféricos através de portas AND.

2. Funções e códigos da biblioteca TIM

2.1 Funções da 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);