2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Questo contenuto è basato suVideo della tecnologia Jiangxie STM32Contenuto, organizzato.
tipo | numero di serie | autobus | Funzione |
---|---|---|---|
Temporizzatore avanzato | TIM1、TIM8 | APB2 | Ha 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 universale | TIM2, TIM3, TIM4, TIM5 | APB1 | Ha 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 base | TIM6、TIM7 | APB1 | Ha le funzioni di interruzione programmata e modalità master che attiva il DAC |
La funzione principale:
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.
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:
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:
Supporta circuiti encoder incrementali (quadratura) e sensori Hall per il posizionamento
Ingresso trigger come orologio esterno o gestione della corrente ciclo per ciclo
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”。
(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.
La funzione principale:
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.
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.
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.
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.
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
*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.*2
. Poiché il coefficiente di divisione della frequenza è 1, gli orologi dei timer 1 e 8 sono 72 MHz.// 恢复缺省配置
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);