¿Por qué no puedo enrutar la misma señal a varios pines en un STM32F407?

Tengo una señal periódica que quiero usar como disparador de dos temporizadores: TIM8 y TIM2. Cuando la señal sube, TIM8 debería comenzar a ejecutarse y TIM2 se sincronizará una vez. TIM2 se configurará en el modo de reloj externo 2. Configuré PA0 como disparador externo para TIM8 y PA5 como disparador externo para TIM2, y conecté la señal a ambos pines.

Encuentro que TIM8 no se inicia, a menos que desconecte PA5. Tan pronto como PA5 y PA0 estén conectados, TIM8 ya no arranca. También encuentro que TIM8 arranca si comento la línea que configura PA5. En este caso, PA5 está en un estado de Z alto por defecto.

Parece que la señal solo puede controlar un solo pin a la vez, no múltiples pines. Por qué sería este el caso? La señal que estoy usando se puede configurar en diferentes intensidades de conducción, he experimentado con todas ellas y obtuve el mismo resultado.

PA5 no está conectado a nada más en la placa de desarrollo que estoy usando , y observé el mismo comportamiento con algunos otros pines. Intenté configurar algunos otros pines en GPIOA como entradas AF y observé que TIM8 dejaba de funcionar cuando PA0 y los otros pines estaban conectados.

El código que estoy usando es el siguiente:

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);

La única explicación que se me ocurre es que PA5 está bajando la línea, lo que impide que PA0 reciba la señal. Pero si PA5 está configurado como una entrada, no debería bajar, ya que tendrá una alta impedancia. Así que estoy pensando que debe estar mal configurado o dañado. PA0 también puede ser un ETR para TIM2 y PA0 definitivamente funciona, lo intentaré y veré si puedo hacer que TIM2 se ejecute. Si lo hace, sospecharé del pin.

Si deja PA0 sin configurar, ¿TIM2 funciona correctamente?
También estoy razonablemente seguro de que puede usar la función ITR, por lo que todo esto se puede hacer con un solo pin IO.
@Jon TIM2 no funciona correctamente con PA0 desconectado.
@Jon Podría registrar TIM2 usando ITR conectado a TIM8, pero también necesito restablecer TIM2 en otra señal externa (VSYNC), por lo que estoy usando el modo de reloj externo 2. Si mi lectura de la hoja de datos es correcta, solo el modo de reloj externo 2 funciona con ETR. quiero poder usar otro pin para restablecer TIM2. Hasta donde yo sé, la única forma de tener 2 entradas para un temporizador es el modo de reloj externo 2, por lo que
"¿Por qué no puedo enrutar la misma señal a varios pines en un STM32F407?" A menos que alguien aquí realmente haya diseñado esa parte del STM32F407, cualquier respuesta sería solo una especulación sin sentido. Cierre basado en la opinión .
"cualquier respuesta sería simplemente inútil" Puede que no tenga sentido especular por qué, pero sería útil tener una confirmación si fuera el caso de que podría haber alguna peculiaridad como esa. O si se puede descartar.

Respuestas (1)

El segundo pin estaba mal configurado como entrada

Estaba intentando usar el pin PA5 como ETR para TIM2. Sin embargo, las funciones alternativas de ETR y CH1 se asignan al mismo pin en TIM2. Más abajo en mi código tenía lo siguiente:

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);

porque quiero interrumpir cuando TIM2->CNT excede un cierto valor. Debido a que configuré el estado de salida en Habilitado, el pin para TIM2 OC1 (que resulta ser el mismo pin que ETR) se configuró como una salida que tuvo el efecto de bajar el pin, y también el pin PA0 que estaba conectado a él.

Para solucionar el problema bastó con cambiar el código a:

ocnt.TIM_OutputState        = TIM_OutputState_Disable;