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.
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;
Jon
Jon
Batipersonaje
Batipersonaje
olin lathrop
Batipersonaje