Conexión remota IR RC5 con STM32

0

Estoy interconectando el control remoto IR que funciona en el protocolo RC5 con STM32F405VG . Tengo un PCB en el que estoy utilizando TSOP 1738 para recibir paquetes RC5. He conectado el CRO. Siempre que estoy presionando cualquier botón en el control remoto, estoy recibiendo el paquete completo.

Ahora para conectar esto en la PCB. I usando el temporizador para capturar la duración entre los bordes ascendentes / descendentes. Pero parece que no está funcionando. Soy nuevo en el entorno STM32. ¿Alguien puede verificar y confirmar si la configuración de los temporizadores es correcta o no? Aquí está el código:

GPIO_InitTypeDef GPIO_InitStructure;   //For GPIO pin where TSOP is connected
NVIC_InitTypeDef NVIC_InitStructure;   //Global interrupts
TIM_ICInitTypeDef TIM_ICInitStructure; //Timers

/*  Clock Configuration for TIMER */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
/* Pin configuration: input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //Pin2 of Port C
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   //Input mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);    //Init GPIO

GPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF_TIM3);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

/* Enable the TIM global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

int PrescalerValue=0;
PrescalerValue = (uint16_t) ((SystemCoreClock / 2) / 6000000) - 1;

/* TIMER frequency input */
TIM_PrescalerConfig(TIM3, PrescalerValue, TIM_PSCReloadMode_Immediate);

/* TIM configuration */
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
 TIM_PWMIConfig(TIM3, &TIM_ICInitStructure); 

/* Select the TIM3 Input Trigger: TI1FP1 */
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);

/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);

/* Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

/* Configures the TIM Update Request Interrupt source: counter overflow */
TIM_UpdateRequestConfig(TIM3,  TIM_UpdateSource_Regular);

/* Set the TIM auto-reload register for each IR protocol */
TIM3->ARR = RC5TimeOut;

/* Clear update flag */
TIM_ClearFlag(TIM3, TIM_FLAG_Update);

/* Enable TIM3 Update Event Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);

/* Enable the CC2/CC1 Interrupt Request */
TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);
TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);

/* Enable the timer */
TIM_Cmd(TIM3, ENABLE);

Y aquí está el código del controlador de interrupciones Timer3

void TIM3_IRQHandler(void)
{
  static uint32_t ICValue1;
  static uint32_t ICValue2;

 /* IC1 Interrupt*/
 if((TIM_GetFlagStatus(TIM3, TIM_FLAG_CC1) != RESET))
 {
    GPIO_SetBits(GPIOD,GPIO_Pin_10);
     TIM_ClearFlag(TIM3, TIM_FLAG_CC1);
    /* Get the Input Capture value */
   ICValue2 = TIM_GetCapture1(TIM3);


}  /* IC2 Interrupt */   
 else  if((TIM_GetFlagStatus(TIM3, TIM_FLAG_CC2) != RESET))
 {
    GPIO_SetBits(GPIOD,GPIO_Pin_10);
   TIM_ClearFlag(TIM3, TIM_FLAG_CC2);
   /* Get the Input Capture value */
  ICValue1 = TIM_GetCapture2(TIM3);

 } 
/* Checks whether the TIM3 flag is set or not.*/
else if ((TIM_GetFlagStatus(TIM3, TIM_FLAG_Update) != RESET))
{ 
  /* Clears the TIM3 pending flags*/
  TIM_ClearFlag(TIM3, TIM_FLAG_Update);


 }

}

Después de la inicialización, el controlador de interrupciones comienza a funcionar, pero el evento de interrupción IC1 o IC2 nunca ocurrió, aunque sigo presionando la tecla remota. Por favor ayuda gracias.

    
pregunta S Andrew

1 respuesta

0

Cambia la línea:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;

A esto:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

Para completar la conexión del modo de función alternativa de captura de entrada.

    
respondido por el Jon

Lea otras preguntas en las etiquetas