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
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;
Jon
Jon
Batperson
Batperson
Olin Lathrop
Batperson