Condivisione della tecnologia

Temporizzatore STM32-TIM

2024-07-11

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

Questo contenuto è basato suVideo della tecnologia Jiangxie STM32Contenuto, organizzato.

1. TEMPO

1.1 Temporizzatore TIM

  • Il timer può contare il clock di ingresso e attivare un interrupt quando il valore del conteggio raggiunge il valore impostato.
  • L'unità base tempo del contatore a 16 bit, del prescaler e del registro di ricarica automatica può raggiungere un tempo massimo di 59,65 s con un clock di conteggio di 72 MHz. 1/(72/65536/65536) (Il contatore è un registro utilizzato per eseguire i tempi di conteggio. Ogni volta che arriva un orologio, il contatore aumenta di 1. Il prescaler può dividere il clock del contatore per rendere il conteggio più flessibile. Riavvio automatico Il contatore caricato registro è il valore target del conteggio, ovvero il numero di orologi che si desidera contare per richiedere un'interruzione. Questi registri costituiscono la parte centrale del timer (questo circuito è chiamato unità di base del tempo).
  • Non solo dispone di funzioni di interruzione programmate di base, ma include anche la selezione della sorgente di clock interna ed esterna, l'acquisizione degli ingressi, il confronto delle uscite, l'interfaccia dell'encoder, la modalità di trigger master-slave e altre funzioni.
  • In base alla complessità e agli scenari applicativi, è suddiviso in tre tipi: timer avanzato, timer generale e timer di base.

1.2 Tipo di timer

tiponumero di serieautobusFunzione
Temporizzatore avanzatoTIM1、TIM8APB2Ha tutte le funzioni di un timer generale e inoltre ha le funzioni di contatore di ripetizioni, generazione di zone morte, uscita complementare, ingresso freno, ecc.
Temporizzatore universaleTIM2, TIM3, TIM4, TIM5APB1Ha tutte le funzioni di un timer di base e dispone di funzioni aggiuntive come la selezione della sorgente di clock interna ed esterna, l'acquisizione dell'ingresso, il confronto dell'uscita, l'interfaccia dell'encoder, la modalità trigger master-slave, ecc.
timer di baseTIM6、TIM7APB1Ha le funzioni di interruzione programmata e modalità master che attiva il DAC
  • Risorse timer STM32F103C8T6: TIM1, TIM2, TIM3, TIM4
  • DAC: convertitore digitale-analogico

1.3 Temporizzatore di base

La funzione principale:

  • Contatore di accumulo con ricarica automatica a 16 bit
  • Prescaler programmabile a 16 bit, utilizzato per dividere il clock di ingresso per qualsiasi valore compreso tra 1 e 65536
  • Circuito sincrono che attiva il DAC
  • Richiesta di interrupt/DMA generata in seguito a un evento di aggiornamento (overflow del contatore)

immagine.png

  • PSC prescaler
    L'ingresso del clock di conteggio dei riferimenti è collegato prima del prescaler. Poiché il timer di base può selezionare solo l'orologio interno, la linea di ingresso del prescaler può essere considerata collegata all'orologio interno (CK_INT).
    La sorgente dell'orologio interno è TIMxCLK di RCC. Il valore di frequenza qui è generalmente la frequenza principale del sistema di 72 MHz.
    Scrivere 0 nel prescaler significa nessuna divisione di frequenza; scrivere 1 significa dividere la frequenza per 2 e la frequenza di uscita = frequenza di ingresso/2 = 36 MHz.
    Scrivere 2 significa dividere per 3 e output = input/3. Pertanto, il valore del prescaler differisce dal coefficiente di divisione della frequenza effettivo di 1 e il coefficiente di divisione della frequenza effettivo = il valore del prescaler 1. Il prescaler è di 16 bit, quindi il valore massimo può essere scritto come 65535, che viene diviso per 65536.

  • Contatore CNT
    Il contatore può contare l'orologio di conteggio prediviso. Ogni volta che l'orologio di conteggio raggiunge un fronte di salita, il valore del contatore aumenta di 1. Anche il contatore è a 16 bit, quindi il valore al suo interno può essere sommato da 0 a 65535. Se ne vengono aggiunti altri, il contatore tornerà a 0 e ricomincerà. Pertanto, il valore del contatore continuerà ad aumentare durante il processo di conteggio. Quando l'incremento raggiunge il valore target, verrà generato un interrupt e l'attività pianificata verrà completata. Pertanto, è necessario un registro per memorizzare il valore target, che è il registro di ricarica automatica.

  • Registro di ricarica automatica
    Anche il registro di ricarica automatica è a 16 bit e memorizza l'obiettivo del conteggio da scrivere. Durante il processo in esecuzione, il valore del conteggio continua ad aumentare e il valore di ricarica automatica è un obiettivo fisso. Quando il valore di conteggio è uguale al valore di ricarica automatica, il tempo di temporizzazione è scaduto. Quindi genererà un segnale di interruzione, azzererà il contatore e il contatore avvierà automaticamente il successivo tempo di conteggio.

  • Frecce U e UI
    Una freccia di sconto verso l'alto disegnata sull'immagine significa che qui verrà generato un segnale di interruzione. Un'interruzione come questa, il cui valore di conteggio è uguale al valore di ricarica automatica, viene generalmente chiamata "interruzione di aggiornamento". Questa interruzione di aggiornamento porterà all'NVIC Una volta configurato il canale del timer dell'NVIC, la CPU risponderà all'interruzione di aggiornamento del timer. La freccia rivolta verso il basso indica che verrà generato un evento e l'evento corrispondente qui è chiamato "evento di aggiornamento". Gli eventi di aggiornamento non attivano interruzioni, ma possono attivare il lavoro di altri circuiti interni.

1.4 Temporizzatore generale

La funzione principale:

  • Contatore accumulatore con ricarica automatica su, giù, su/su a 16 bit

  • Prescaler programmabile a 16 bit, utilizzato per dividere il clock di ingresso per qualsiasi valore compreso tra 1 e 65536

  • 4 canali indipendenti:

    • cattura dell'input
    • Confronto delle uscite
    • Generazione PWM (modalità allineata al bordo o al centro)
    • Uscita in modalità impulso singolo
  • Circuiti di sincronizzazione che controllano i timer e le interconnessioni dei timer utilizzando segnali esterni

  • L'interrupt/DMA viene generato quando si verificano i seguenti eventi:

    • Aggiornamento: contatore overflow/underflow, inizializzazione del contatore (tramite software o trigger interno/esterno)
    • Eventi di attivazione (avvio, arresto, inizializzazione o conteggio attivato da interno/esterno)
    • cattura dell'input
    • Confronto delle uscite
  • Supporta circuiti encoder incrementali (quadratura) e sensori Hall per il posizionamento

  • Ingresso trigger come orologio esterno o gestione della corrente ciclo per ciclo
    immagine.png

  • Contatore CNT
    Il contatore CNT supporta la modalità di conteggio avanti, la modalità di conteggio alla rovescia e la modalità di allineamento centrale. La modalità di conteggio all'indietro inizia dal valore di ricaricamento e diminuisce verso il basso. Dopo essere sceso a 0, ritorna al valore di ricaricamento e richiede un'interruzione. La modalità allineata al centro inizia da 0, prima aumenta verso l'alto, conta il valore di ricaricamento e si applica a un'interruzione, quindi diminuisce verso il basso fino a 0, quindi si applica a un'interruzione.

  • sorgente dell'orologio
    La sorgente dell'orologio del timer generale non solo può scegliere l'orologio interno da 72 MHz, ma può anche scegliere un orologio esterno.
    (1)Il primo orologio esterno è daOrologio esterno sul pin TIMx_ETR , ovvero è possibile collegare un orologio ad onda quadra esterno al pin ETR di TIM2, PA0, quindi configurare la selezione interna della polarità, il rilevamento dei bordi e il circuito prescaler, nonché il circuito del filtro di ingresso a cui è sottoposto l'orologio certa modellatura. Poiché si tratta di un pin clock esterno, ci saranno inevitabilmente alcuni problemi, quindi questi circuiti possono filtrare la forma d'onda in ingresso. Il segnale filtrato è diviso in due canali. Il canale ETRF superiore entra nel controller del trigger, quindi l'orologio può essere selezionato come unità di base del tempo. Questa strada è anche chiamata "Modalità orologio esterno 2”。
    immagine.png
    (2) TRGI può anche fornire un orologio esterno , utilizzato principalmente come ingresso trigger. Questo ingresso trigger può attivare la modalità slave del timer. Quando TRGI viene utilizzato come orologio esterno, questo percorso viene chiamato "Modalità orologio esterno 1". Quali sono gli orologi esterni che passano attraverso questo canale? Il primo è il segnale del pin ETR. Il secondo è il segnale ITR. Questa parte del segnale dell'orologio proviene da altri timer. Il TRGO in modalità master può portare a altri timer. Quando si collega ad altri timer, è collegato ai pin ITR di altri timer. ITR0 a ITR3 provengono dalle uscite TRGO degli altri quattro timer. È inoltre possibile scegliere TI1F_ED, che è collegato qui all'unità di acquisizione dell'ingresso. Pin CH1, ovvero l'orologio è ottenuto dal pin CH1. Il suffisso ED (Edge) qui significa bordo. Può anche essere ottenuto tramite TI1FP1 e TI2FP2 è l'orologio collegato al pin CH1 e TI2FP2 è collegato il perno CH2.
    Riepilogo: l'ingresso alla modalità orologio esterno 1 può essere il pin ETR, altri timer, il bordo del pin CH1, il pin CH1 e il pin CH2.

  • Circuito di confronto delle uscite
    La parte destra in basso è il circuito di confronto delle uscite. Sono presenti quattro canali in totale, corrispondenti ai pin da CH1 a CH4, che possono essere utilizzati per emettere forme d'onda PWM e azionare i motori.

  • Circuito di cattura dell'ingresso
    Sulla sinistra c'è il circuito di cattura dell'ingresso, anch'esso dotato di quattro canali, corrispondenti ai pin da CH1 a CH4, che possono essere utilizzati per misurare la frequenza dell'onda quadra in ingresso, ecc.

  • registro di acquisizione/confronto
    Il registro centrale è il registro di cattura/confronto, che è condiviso dai circuiti di cattura di input e di confronto di output Poiché la cattura di input e il confronto di output non possono essere utilizzati contemporaneamente, i registri qui sono condivisi e anche i pin sono condivisi.

1.4 Temporizzatore avanzato

La funzione principale:

  • Contatore accumulatore con ricarica automatica su, giù, su/su a 16 bit
  • Prescaler programmabile a 16 bit, utilizzato per dividere il clock di ingresso per qualsiasi valore compreso tra 1 e 65536
  • 4 canali indipendenti:
    • cattura dell'input
    • Confronto delle uscite
    • Generazione PWM (modalità allineata al bordo o al centro)
    • Uscita in modalità impulso singolo
  • Uscite complementari programmabili a tempo morto
  • Circuiti di sincronizzazione che controllano i timer e le interconnessioni dei timer utilizzando segnali esterni
  • Consente l'aggiornamento di un contatore ripetuto in un registro timer dopo un periodo di conteggio di dati specificati
  • Il segnale di ingresso del freno può porre il segnale di uscita del timer in uno stato di ripristino o in uno stato noto
  • L'interrupt/DMA viene generato quando si verificano i seguenti eventi:
    • Aggiornamento: contatore overflow/underflow, inizializzazione del contatore (tramite software o trigger interno/esterno)
    • Eventi di attivazione (avvio, arresto, inizializzazione o conteggio attivato da interno/esterno)
    • cattura dell'input
    • Confronto delle uscite
    • Ingresso segnale freno
  • Supporta circuiti encoder incrementali (quadratura) e sensori Hall per il posizionamento
  • Ingresso trigger come orologio esterno o gestione della corrente ciclo per ciclo

immagine.png

  • Contatore di ripetizione
    La differenza rispetto ad un timer generale: la prima è quella di aggiungere un contatore di ripetizioni dove viene applicato l'interrupt. Con questo contatore è possibile realizzare che gli eventi di aggiornamento e gli interrupt di aggiornamento si verificano solo ogni pochi cicli di conteggio. La struttura originale prevede che si verifichi un aggiornamento dopo il completamento di ogni ciclo di conteggio, il che equivale a dividere nuovamente il segnale di aggiornamento in uscita.

  • Generatore di banda morta DTG e uscita complementare
    Quello che segue è l'aggiornamento del modulo di confronto delle uscite tramite il timer avanzato DTG (generazione del tempo morto) è un circuito di generazione della zona morta. Il pin di uscita a destra è stato modificato da quello originale a due uscite complementari, che possono emettere una coppia di onde PWM complementari. Questi circuiti vengono utilizzati per azionare motori brushless trifase, come i quadricotteri, le ruote posteriori degli elettrici veicoli e trapani elettrici Aspetta, potrebbe essere un motore brushless trifase. Poiché il circuito di azionamento di un motore brushless trifase richiede generalmente 3 bracci del ponte, ciascun braccio del ponte è controllato da 2 tubi di commutazione ad alta potenza, quindi sono necessari un totale di 6 tubi di commutazione ad alta potenza. Pertanto, i primi tre pin PWM di uscita qui diventano uscite complementari. Inoltre, per prevenire il fenomeno di shoot-through a breve termine causato dalle imperfezioni del dispositivo al momento della commutazione quando l'uscita complementare PWM aziona il braccio del ponte, viene aggiunto davanti un circuito di generazione della zona morta. Nel momento in cui l'interruttore viene commutato, viene generata una zona morta di un certo periodo di tempo, consentendo di disattivare sia il tubo superiore che quello inferiore del braccio del ponte per impedire la sparatoria.

  • ingresso del freno
    L'ultima parte è la funzione di ingresso del freno, che deve fornire garanzia di sicurezza per l'azionamento del motore. Se il pin esterno BKIN (Break IN) genera un segnale di freno, o l'orologio interno si guasta e si verifica un guasto, il circuito di controllo interromperà automaticamente l'uscita del motore per evitare incidenti.

1.5 Struttura base dell'interruzione programmata

immagine.png
Controllo esecuzione: controlla alcuni bit nel registro, come avvio e arresto, conteggio avanti o indietro, ecc.
Il lato destro è dove va il segnale dopo che il tempo di temporizzazione è scaduto e viene generato l'interruzione dell'aggiornamento. Se si tratta di un timer avanzato, ci sarà un contatore di ripetizioni aggiuntivo. Il segnale di interruzione imposterà innanzitutto un bit di flag di interruzione nel registro di stato. Questo bit di flag sarà controllato attraverso l'uscita di interruzione e si applicherà per un'interruzione all'NVIC. Il controllo dell'uscita di interruzione è un bit di abilitazione per l'uscita di interruzione. Se hai bisogno di un'interruzione, ricordati di abilitarla.
immagine.png
immagine.png

1.6 Temporizzazione del prescaler

immagine.png

  • Frequenza di conteggio del contatore: CK_CNT = CK_PSC / (PSC 1)
  • CK_PSC: orologio prescaler, l'orologio interno è 72 MHz.
  • CNT_EN: il contatore è abilitato, il contatore di alto livello funziona normalmente e il contatore di basso livello si ferma.
  • CK_CNT: orologio del contatore, che è sia l'uscita dell'orologio del prescaler che l'ingresso dell'orologio del contatore.
  • All'inizio il contatore non è abilitato e l'orologio del contatore non funziona. Dopo l'abilitazione, nella prima metà del periodo, il coefficiente di divisione della frequenza effettivo è 1 (PSC=0), e l'orologio del contatore è uguale all'orologio prima del prescaler, nella seconda metà, il coefficiente di divisione della frequenza effettivo è 2 (; PSC=1) e l'orologio del contatore L'orologio diventa la metà dell'orologio prima del prescaler. Guidato dal clock del contatore, anche il registro del contatore successivo continua a incrementare con il fronte di salita del clock. Dopo la posizione centrale FC, il valore del conteggio diventa 0. Da qui si può dedurre che il valore di ricarica automatica ARR è FC. Quando il valore del conteggio è uguale al valore di ricarica e arriva l'orologio successivo, il valore del conteggio viene azzerato e viene generato un evento di aggiornamento di seguito. Questo è il flusso di lavoro di un ciclo di conteggio.
  • Le tre righe seguenti descrivono un meccanismo di buffering del registro prescaler. Vale a dire, in realtà ci sono due registri prescaler. Uno è il registro di controllo del prescaler, che deve essere letto e scritto. Non determina direttamente il coefficiente di divisione della frequenza . C'è anche un registro buffer o registro ombra: il buffer prescaler. Questo registro buffer è il registro che funziona davvero. Ad esempio, in un determinato momento, cambiamo il registro prescaler da 0 a 1. Se in questo momento, cambiamo la frequenza. Il coefficiente di divisione dell'orologio farà sì che la frequenza della prima metà e della seconda metà siano immediatamente diverse all'interno di un ciclo di conteggio. Pertanto, viene progettato un buffer. Quando il conteggio raggiunge la metà del conteggio, il valore del prescaler viene modificato. Questa modifica non avrà effetto immediato, ma attenderà fino alla fine del ciclo di conteggio e si verifica un evento di aggiornamento Il valore del registro prescaler verrà modificato. Verrà passato al registro buffer prima che abbia effetto.
  • Come si può vedere dall'ultima riga: il prescaler si basa anche sul conteggio per dividere la frequenza. Quando il valore del prescaler è 0, il contatore è sempre 0 e emette direttamente la frequenza originale quando il valore del prescaler è 1, il contatore 0, 1, 0, 1, 0, 1 conta in questo modo Quando ritorna a 0, emette 1 impulso. In questo modo, la frequenza di uscita viene divisa per 2 della frequenza di ingresso coefficiente di divisione della frequenza effettiva. C'è un offset di un numero.

1.7 Tempistiche del contatore

immagine.png

  • Frequenza di overflow del contatore: CK_CNT_OV = CK_CNT / (ARR 1) = CK_PSC / (PSC 1) / (ARR 1)
  • CK_INT: orologio interno 72 MHz;
  • CNT_EN: abilitazione contatore, valida sul fronte di salita;
  • CK_CNT: contatore orologio, poiché il coefficiente di divisione della frequenza è 2, questa frequenza è CK_INT divisa per 2. Quindi il contatore aumenta su ciascun fronte di salita di questo orologio. Quando raggiunge 0036, si verifica un overflow. Dopo aver contato fino a 36, ​​si verifica un altro fronte di salita, il contatore viene azzerato, il contatore va in overflow e viene generato un impulso di evento di aggiornamento. Inoltre, viene impostato un flag di interruzione di aggiornamento (UIF). impostato su 1, viene richiesto un interrupt. Dopo aver risposto all'interrupt, è necessario cancellarlo manualmente nel programma di interrupt.

1.8 Il contatore non ha una sequenza temporale preinstallata.

immagine.png
Il registro di caricamento automatico è stato modificato da FF a 36 e il valore target del valore di conteggio è stato modificato da FF a 36, ​​quindi dopo aver contato 36 qui, verrà aggiornato direttamente per avviare il successivo ciclo di conteggio.

1.9 Il contatore ha un cronometraggio preinstallato

immagine.png
Durante il conteggio, modificare il valore target del conteggio da F5 a 36. C'è un registro ombra di seguito. Questo registro ombra è davvero efficace È ancora F5, quindi ora l'obiettivo del conteggio sta ancora contando fino a F5, generando allo stesso tempo un evento di aggiornamento registro e nel conteggio successivo Questa modifica è valida solo se il ciclo è 36, quindi lo scopo dell'introduzione del registro ombra è in realtà per la sincronizzazione, ovvero per consentire che le modifiche dei valori e gli eventi di aggiornamento si verifichino in modo sincrono per evitare errori causati dalle modifiche durante l'operazione.

1.10 Albero dell'orologio RCC

immagine.png

  • sorgente dell'orologio
    Nel circuito di generazione del clock sono presenti quattro sorgenti di oscillazione:
    (1) HSI: oscillatore RC interno ad alta velocità da 8 MHz;
    (2) HSE: l'oscillatore a cristallo di quarzo ad alta velocità esterno da 4 ~ 16 MHz, noto anche come oscillatore a cristallo, è solitamente collegato a 8 MHz;
    (3) LSE: oscillatore a cristallo esterno a bassa velocità da 32,768 KHz, che generalmente fornisce il clock per RTC;
    (4) LSI: Infine, c'è l'oscillatore RC interno a bassa velocità da 40 KHz, che può fornire l'orologio per il watchdog.
    I due oscillatori al quarzo ad alta velocità sopra indicati vengono utilizzati per fornire orologi di sistema. Gli orologi di AHB, APB2 e APB1 sono tutti derivati ​​da questi due oscillatori al quarzo ad alta velocità. Il fatto è che l'oscillatore al quarzo esterno è più stabile di quello interno Oscillatore RC, quindi generalmente è necessario utilizzare un oscillatore a cristallo esterno.

  • Orologio di configurazione ST
    Nella funzione SystemInit, la ST configura l'orologio: innanzitutto avvia l'orologio interno HSI, seleziona l'orologio interno da 8 MHz come orologio di sistema e funziona temporaneamente con l'orologio interno da 8 MHz. Quindi avviare l'orologio esterno, configurare l'orologio esterno per inserire l'anello ad aggancio di fase PLL per la moltiplicazione della frequenza, 8 MHz viene moltiplicato per 9 volte e si ottiene 72 MHz. Dopo che l'uscita dell'anello ad aggancio di fase è stabile, selezionare l'anello ad aggancio di fase uscita come orologio di sistema, in modo che l'orologio di sistema passi da 8 MHz a 72 MHz.

  • Sistema di sicurezza dell'orologio CSS
    CSS (sistema di sicurezza dell'orologio): il sistema di sicurezza dell'orologio è anche responsabile della commutazione degli orologi. Può monitorare lo stato di funzionamento dell'orologio esterno. Una volta che l'orologio esterno si guasta, riporterà automaticamente l'orologio esterno all'orologio interno per garantirne il funzionamento dell'orologio di sistema e previene il blocco del programma. Morte causata da un incidente.

  • circuito di distribuzione dell'orologio

    • Bus AHB: innanzitutto, il clock di sistema a 72 MHz entra nel bus AHB. Il bus AHB ha un prescaler. Il coefficiente di distribuzione configurato in SystemInit è 1, quindi il clock AHB è 72 MHz.
    • Bus APB1: il coefficiente di distribuzione configurato qui è 2, quindi il clock del bus APB1 è 72 MHz/2=36 MHz.Di seguito, se il coefficiente prescaler APB1 = 1, la frequenza rimane invariata, altrimenti la frequenza*2, e poi sul lato destro, viene aperto separatamente per i timer 2-7, perché il coefficiente prescaler qui è 2, quindi la frequenza qui deve essere*2 , quindi l'orologio che porta ai timer 2~7 è 72 MHz. Pertanto, sia che si tratti di un timer avanzato, di un timer generale o di un timer base, il loro clock di riferimento interno è di 72 MHz.
    • Bus APB2: il fattore di divisione della frequenza di APB2 è 1, quindi il clock è 72 MHz.Quindi viene acceso anche l'orologio collegato all'APB2, cioè se il coefficiente prescaler dell'APB2 = 1 la frequenza rimane invariata, altrimenti la frequenza*2 . Poiché il coefficiente di divisione della frequenza è 1, gli orologi dei timer 1 e 8 sono 72 MHz.
    • La parte di uscita dell'orologio ha una porta AND per il controllo dell'uscita. Il bit di controllo scrive l'abilitazione dell'orologio esterno. Qui è dove scriviamo RCC_APB2/1PeriphClockCmd nel programma. Per accendere l'orologio, scriviamo 1 in questa posizione per lasciare l'orologio a sinistra può essere inviato alle periferiche tramite porte AND.

2. Funzioni e codici della libreria TIM

2.1 Funzioni della libreria 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);