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

2

Tengo una señal periódica que quiero usar como disparador de dos temporizadores: TIM8 y TIM2. Cuando la señal sea alta, TIM8 debería comenzar a funcionar y TIM2 se sincronizará una vez. TIM2 se configurará en modo de reloj externo 2. He configurado 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 el PA5. Tan pronto como PA5 y PA0 están conectados, TIM8 ya no se inicia. También encuentro que TIM8 se inicia si comento la línea que configura PA5. En este caso, PA5 está en un estado alto-Z de forma predeterminada.

Parece que la señal solo puede conducir un solo pin a la vez, no múltiples. Por qué sería este el caso? La señal que estoy usando se puede configurar a diferentes potencias de unidad, he experimentado con todos ellos y obtuve el mismo resultado.

PA5 no está conectado a ninguna otra cosa en la placa de desarrollo que estoy usando , y Observé el mismo comportamiento con algunos otros pines. Intenté configurar otros pines en GPIOA como entradas AF y observé que TIM8 dejaba de funcionar cuando tanto el PA0 como 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 evita que PA0 reciba la señal. Pero si PA5 se configura como una entrada, no debe tirarse bajo ya que tendrá una alta impedancia. Entonces 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 funcione. Si lo hace sospecharé del pin

    
pregunta Batperson

1 respuesta

1

El segundo pin fue mal configurado como entrada

Estaba intentando usar el pin PA5 como ETR para TIM2. Sin embargo, las funciones alternativas ETR y CH1 se asignan al mismo pin en TIM2. Más abajo en mi código tuve 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 supera un determinado valor. Debido a que configuré el estado de salida como Habilitado, el pin para TIM2 OC1 (que es el mismo pin que ETR) se estaba configurando como una salida que tenía el efecto de tirar el pin bajo, y también el pin PA0 que estaba conectado a él.

Para solucionar el problema fue suficiente cambiar el código a:

ocnt.TIM_OutputState        = TIM_OutputState_Disable;
    
respondido por el Batperson

Lea otras preguntas en las etiquetas