Warum kann ich dasselbe Signal nicht an mehrere Pins eines STM32F407 weiterleiten?

Ich habe ein periodisches Signal, das ich als Trigger für zwei Timer verwenden möchte - TIM8 und TIM2. Wenn das Signal hoch geht, sollte TIM8 anfangen zu laufen und TIM2 wird einmal getaktet. TIM2 wird im externen Taktmodus 2 konfiguriert. Ich habe PA0 als externen Trigger für TIM8 und PA5 als externen Trigger für TIM2 konfiguriert und das Signal an beide Pins angeschlossen.

Ich finde, dass TIM8 nicht startet, es sei denn, ich trenne PA5. Sobald PA5 und PA0 beide verbunden sind, startet TIM8 nicht mehr. Ich finde auch, dass TIM8 startet, wenn ich die Zeile kommentiere, die PA5 konfiguriert. In diesem Fall befindet sich PA5 standardmäßig in einem High-Z-Zustand.

Es scheint, dass das Signal jeweils nur einen einzelnen Pin ansteuern kann, nicht mehrere Pins. Warum sollte dies der Fall sein? Das Signal, das ich verwende, kann auf unterschiedliche Antriebsstärken eingestellt werden, ich habe mit allen experimentiert und das gleiche Ergebnis erhalten.

PA5 ist mit nichts anderem auf der von mir verwendeten Entwicklungsplatine verbunden, und ich habe das gleiche Verhalten bei einigen anderen Pins beobachtet - ich habe versucht, einige andere Pins auf GPIOA als AF-Eingänge zu konfigurieren, und beobachtet, dass TIM8 nicht mehr läuft, wenn sowohl PA0 als auch die anderen Pins laufen verbunden waren.

Der Code, den ich verwende, ist wie folgt:

GPIO_InitTypeDef gpio;
NVIC_InitTypeDef nvic;
GPIO_StructInit(&gpio);

/* Configure PA0 for TIM8 ETR (HSYNC to start pixel clock), datasheet page 62 */
gpio.GPIO_Pin       = GPIO_Pin_0;
gpio.GPIO_Mode      = GPIO_Mode_AF;
gpio.GPIO_Speed     = GPIO_Speed_50MHz;
gpio.GPIO_OType     = GPIO_OType_PP;
gpio.GPIO_PuPd      = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &gpio);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_TIM8);

/* Configure PA1 for TIM2 CH2 (This will be VSYNC, to reset the timer) */
/* Configure PA5 for TIM2 ETR (External clock, this will be HSYNC to count syncs) */
gpio.GPIO_Pin       = GPIO_Pin_1 | GPIO_Pin_5; 
gpio.GPIO_Mode      = GPIO_Mode_AF;
gpio.GPIO_Speed     = GPIO_Speed_50MHz;
gpio.GPIO_OType     = GPIO_OType_PP;
gpio.GPIO_PuPd      = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOA, &gpio); // Works if this is commented
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);

Die einzige Erklärung, die mir einfällt, ist, dass PA5 die Leitung nach unten zieht und verhindert, dass PA0 das Signal erhält. Wenn PA5 jedoch als Eingang konfiguriert ist, sollte er nicht nach unten gezogen werden, da er eine hohe Impedanz hat. Also denke ich, dass es falsch konfiguriert oder sonst beschädigt sein muss. PA0 kann auch ein ETR für TIM2 sein und PA0 funktioniert definitiv, ich werde das versuchen und sehen, ob ich TIM2 zum Laufen bekomme. Wenn ja, vermute ich den Stift

Wenn Sie PA0 unkonfiguriert lassen, funktioniert TIM2 korrekt?
Ich bin mir auch ziemlich sicher, dass Sie die ITR-Funktion verwenden können, sodass dies alles mit einem einzigen IO-Pin erfolgen kann.
@ Jon TIM2 funktioniert nicht richtig, wenn PA0 nicht verbunden ist.
@Jon Ich könnte TIM2 mit ITR takten, das an TIM8 angeschlossen ist, aber ich muss TIM2 auch auf ein anderes externes Signal (VSYNC) zurücksetzen, weshalb ich den externen Taktmodus 2 verwende. Wenn mein Lesen des Datenblatts nur der externe Taktmodus 2 korrekt ist arbeitet mit ETR. möchten in der Lage sein, einen anderen Pin zum Zurücksetzen von TIM2 zu verwenden. Soweit mir bekannt ist, ist der externe Taktmodus 2 die einzige Möglichkeit, 2 Eingänge zu einem Timer zu haben, weshalb
"Warum kann ich dasselbe Signal nicht an mehrere Pins eines STM32F407 weiterleiten?" Wenn hier nicht jemand diesen Teil des STM32F407 tatsächlich entworfen hat, wäre jede Antwort nur sinnlose Spekulation. Abschluss als meinungsbasiert .
"Jede Antwort wäre einfach sinnlos" Es mag sinnlos sein, darüber zu spekulieren, aber es wäre nützlich, eine Bestätigung zu haben, wenn es tatsächlich so wäre, dass es so eine Eigenart geben könnte. Oder wenn es ausgeschlossen werden könnte.

Antworten (1)

Der zweite Pin wurde als Eingang falsch konfiguriert

Ich habe versucht, Pin PA5 als ETR für TIM2 zu verwenden. Die alternativen Funktionen ETR und CH1 werden jedoch beide auf denselben Pin auf TIM2 abgebildet. Weiter unten in meinem Code hatte ich folgendes:

ocnt.TIM_OCMode             = TIM_OCMode_PWM1;
ocnt.TIM_Pulse              = activeVideoLineStart;
ocnt.TIM_OutputState        = TIM_OutputState_Enable;
ocnt.TIM_OutputNState       = TIM_OutputState_Disable;
ocnt.TIM_OCPolarity         = TIM_OCPolarity_High;
ocnt.TIM_OCIdleState        = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM2, &ocnt);

weil ich unterbrechen möchte, wenn TIM2->CNT einen bestimmten Wert überschreitet. Da ich den Ausgangsstatus auf Enabled gesetzt habe, wurde der Pin für TIM2 OC1 (der zufällig derselbe Pin wie ETR ist) als Ausgang konfiguriert, der den Effekt hatte, den Pin auf Low zu ziehen, und auch Pin PA0, der damit verbunden war.

Um das Problem zu beheben, reichte es aus, den Code zu ändern in:

ocnt.TIM_OutputState        = TIM_OutputState_Disable;