Ich versuche, den Ausgang von COMP2 zu verwenden, um den One-Pulse-Modus eines Timers (in meinem Beispiel TIM4, aber es ist ziemlich flexibel, wenn er zu einem anderen Timer wechseln muss) der STM32L1-Serie auszulösen.
Im Referenzhandbuch verwendet die Erklärung für den One-Pulse-Modus TI2FP2 als Timer-Trigger, der mit Input Capture auf Kanal 2 des Timers verknüpft ist, jedoch kann der Ausgang des Komparators nur auf Input Capture auf Kanal 4 umgeleitet werden (außer TIM10, aber es hat keinen zweiten Kanal, um die PWM auszugeben ...) oder OCREF Clear.
Ich habe versucht, die COMP2-Ausgabe umzuleiten auf:
aber keine dieser Optionen funktionierte.
Sollte eine dieser Konfigurationen funktioniert haben und ich sie einfach nicht richtig eingerichtet haben?
Soll ich es anders machen?
Gibt es keine Möglichkeit, die beiden direkt zu verbinden und ich sollte zum Beispiel den One-Pulse-Modus vom COMP2-Interrupt starten?
Beim Betrachten des Blockdiagramms der Timer konnte ich auch keine direkte Methode finden, es gehen anscheinend keine Signale von CH4 zur Triggereinheit.
Wenn Sie Interrupts vermeiden möchten und einen geeigneten freien DMA-Kanal haben, können Sie diesen verwenden, um einen anderen Timer zu starten. TIM2_CH4
Sie können or verwenden TIM3_CH4
(im Beispiel verwende ich TIM3), aber es gibt keinen DMA-Kanal für TIM4_CH4
. Sie können sich an TIM4
jeden anderen Timer als Ziel halten oder ihn verwenden.
TIM4
den One-Pulse-Modus ein, aber starten Sie ihn noch nicht. Finden Sie heraus, welcher Wert in gehen würde TIM4->CR1
, und speichern Sie ihn in einer Speichervariablen, zB volatile uint8_t tim4_cr1_start = TIM_CR1_OPM|TIM_CR1_CEN;
für den einfachsten Fall.DMA1_Channel3
, Speicheradresse ist &tim4_cr1_start
von oben, Peripherieadresse ist &TIM4->CR1
, Übertragungslänge ist 1
. Verwenden Sie den 8-Bit-Modus, aktivieren Sie den Zirkularmodus.TIM3_CH4
die Eingangserfassung ein, wählen Sie die Polarität usw. in TIM3_CCER
und aus TIM3_CCMR2
.CC4DE
, erfassen/vergleichen Sie 4 DMA-Anforderungen in TIM3->DIER
.TIM3
.TIM3_CH4
(Sie könnten TIM4_CH4` verwenden TIM2_CH4' too, but there is no DMA channel for
).Nun würde ein Komparatorereignis eine Erfassung auf auslösen TIM3_CH4
, was DMA anweisen würde, einen geeigneten Wert auf zu schreiben TIM4->CR1
. Da der DMA auf den Zirkularmodus eingestellt ist, würde er denselben Wert bei TIM4->CR1
jedem nachfolgenden Erfassungsereignis kopieren.
Benoît Vernier
folgte Monica zu Codidact
MOVS
, 2 fürLDR
und 2 fürSTR
). Es ist ein theoretisches Minimum, ich würde sagen, 20-25 Zyklen sind realistisch. Ich weiß nicht wirklich etwas über DMA-Latenzen, ich würde 3 oder 4 Zyklen schätzen, und ich wäre ziemlich überrascht, wenn es mehr als 5 dauern würde. Dann braucht der Timer in beiden Fällen vielleicht weitere 2 Zyklen, um zu starten.folgte Monica zu Codidact