Einrichten eines Zählers auf STM32F405xx

Wie richten Sie Timer9 (TIM9) auf einem STM32F405xx richtig ein, um Impulse bei steigender Flanke zu zählen? Gibt es außerhalb dieses kurzen Beispiels eine spezielle Konfiguration für den Pin zum Timer?

Folgendes habe ich bisher getan und auch das BRIEF-Gegenbeispiel aus dem hier kopierten Referenzhandbuch befolgt:

Um beispielsweise den Aufwärtszähler so zu konfigurieren, dass er als Reaktion auf eine steigende Flanke am Eingang TI2 zählt, gehen Sie wie folgt vor:

  1. Konfigurieren Sie Kanal 2, um ansteigende Flanken am TI2-Eingang zu erkennen, indem Sie CC2S = „01“ in das TIMx_CCMR1-Register schreiben.

  2. Konfigurieren Sie die Eingangsfilterdauer, indem Sie die IC2F[3:0]-Bits in das TIMx_CCMR1-Register schreiben (wenn kein Filter benötigt wird, belassen Sie IC2F='0000').

  3. Wählen Sie die Polarität der ansteigenden Flanke, indem Sie CC2P='0' und CC2NP='0' in das TIMx_CCER-Register schreiben.
  4. Konfigurieren Sie den Timer im externen Taktmodus 1, indem Sie SMS='111' in das TIMx_SMCR-Register schreiben.
  5. Wählen Sie TI2 als Trigger-Eingangsquelle, indem Sie TS='110' in das Register TIMx_SMCR schreiben.
  6. Aktivieren Sie den Zähler, indem Sie CEN='1' in das Register TIMx_CR1 schreiben.

Ich glaube, ich habe das oben Richtige gemacht, aber das Lesen des Registers gibt immer 0 zurück. Gibt es eine zusätzliche Einrichtung in einem anderen Register, um den mit dem Timer zu verbinden? Ich habe darüber gelesen alternate functions, konnte aber nichts Spezifisches zu Timern und Pins finden.

Ich folge diesem locker als Codereferenz: https://www.ghielectronics.com/docs/108/register-access

Chip-Datenblatt: http://www.st.com/web/en/resource/technical/document/datasheet/DM00037051.pdf

Referenzhandbuch für die Chip-Familie: http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf

Haben Sie alle erforderlichen Uhren aktiviert? Zum Beispiel ist TIM9 auf APB2, also funktioniert der Timer nicht, wenn Sie diese Uhr nicht aktiviert haben.
@A.Mac Interessant. Ich habe das Register gefunden: RCC_APB2ENRim Referenzhandbuch, aber ich kann die Adresse nicht im Datenblatt finden.
@A.Mac Ich habe im AHB1-Bus ab 0x40023800 gefunden RCCund das Referenzhandbuch zeigt einen Offset von 0x44 für RCC_APB2ENR. Bit 16 ist TIM9EN. Ich setze dieses Bit und bekomme immer noch Null.
Es ist nicht wirklich notwendig, direkt mit Registeradressen umzugehen.
Tut mir leid, ich bin ziemlich neu im Posten auf SE, also habe ich den Kommentar gepostet, als ich gerade versuchte, einen Zeilenumbruch hinzuzufügen. Wie auch immer, wie gesagt, anstatt sich direkt mit den Registeradressen zu befassen, können Sie die für Menschen verständlicheren #defines wie den <code>RCC_APB2ENR</code> verwenden. Solange Sie die richtigen Header eingefügt haben, weiß der Compiler, wovon Sie sprechen. Um beispielsweise die Uhr für TIM2 zu aktivieren, verwenden Sie <code> RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; </code> Es wäre auch nützlich, wenn Sie Ihren Code posten (vorzugsweise nach der Aktualisierung von der Verwendung von Registeradressen).
@A.Mac Ich verwende eine benutzerdefinierte Klasse, die von GHI für netMF geschrieben wurde, um auf die Register zuzugreifen. Bitte sehen Sie sich den ersten Link in meiner Frage an, um zu sehen, wie der Code aussieht. Ich muss die tatsächlichen Register aus den Datenblättern ausgraben.

Antworten (1)

Das erste, was ich immer überprüfe, ist sicherzustellen, dass alle Uhren, die ich brauche, eingeschaltet sind. Sie müssen sicherstellen, dass die Uhren für APB2 (TIM9) und AHB1 (GPIO) eingeschaltet sind. GPIOx_MODERDarüber hinaus sind Timer-Funktionen alternative Funktionen, sodass Sie die Bits für den entsprechenden Port und Pin, den Sie verwenden, sowie die entsprechenden GPIOx_AFRyBits setzen müssen .

Das Datenblatt und das Referenzhandbuch sollten alle Informationen enthalten, die Sie benötigen. Manchmal ist es einfach etwas zu tun, um das zu finden, wonach Sie suchen.

Danke noch einmal! Ich habe vergessen zu fragen, wie man den Zählerstand im TIMx_CNTRegister wieder auf 0 zurücksetzt? Ich habe versucht, RCC_APB2RSTRresete zu verwenden, aber ich denke, das setzt alles auf die Standardeinstellungen zurück.
Ich glaube, ich habe es verstanden: Das Setzen UGdes Bits auf 1 in TIMx_EGRscheint den Zähler zurückzusetzen und den Rest des Setups nicht zu beeinflussen ... bis jetzt