TIM 2 PWM-Eingang an unterschiedlichem Pin STM32F072B Discovery

Ich versuche, den Pin zu ändern, der im PWM-Eingangsmodus für die Frequenzmessung mit TIM2 verbunden ist.

Ich habe gerade das Beispiel kompiliert, getestet und es funktioniert auf Pin PB03, aber wenn ich versuche, den Pin auf etwas anderes zu ändern, zB PB4 oder PA10, verbindet sich der Pin überhaupt nicht mit dem Timer. (Durch Debug versucht.)

ICH

Der Setup-Code: //Die einzigen Änderungen sind in der GPIOConf

static void TIM_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;  
  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* GPIOB clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //Change here, to GPIOA 

  /* TIM2 chennel2 configuration : PB.03 */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;  //Change here, to pin 10
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP ;
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //Change to GPIOA

  /* Connect TIM pin to AF2 */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_2); //And change to pin 10

  /* Enable the TIM2 global Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

   /* --------------------------------------------------------------------------- 
    TIM2 configuration: PWM Input mode
     The external signal is connected to TIM2 CH2 pin (PB.03)
     TIM2 CCR2 is used to compute the frequency value 
     TIM2 CCR1 is used to compute the duty cycle value

    In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1), since
    APB1 prescaler is set to 1.
      TIM2CLK = PCLK1 = HCLK = SystemCoreClock

    External Signal Frequency = SystemCoreClock / TIM2_CCR2 in Hz.
    External Signal DutyCycle = (TIM2_CCR1*100)/(TIM2_CCR2) in %.
  Note: 
  SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file.
  Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
  function to update SystemCoreClock variable value. Otherwise, any configuration
  based on this variable will be incorrect.
  --------------------------------------------------------------------------- */

  TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);

  /* Select the TIM2 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);

  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
  TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);

  /* TIM enable counter */
  TIM_Cmd(TIM2, ENABLE);

  /* Enable the CC2 Interrupt Request */
   TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}

Und der Interrupt-Code: //Ich habe nichts daran geändert

void TIM2_IRQHandler(void)
{
  /* Clear TIM2 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM2);

  if (IC2Value != 0)
  {
    /* Duty cycle computation */
    DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;

    /* Frequency computation */
    Frequency = SystemCoreClock / IC2Value;
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}

Nach meinem Verständnis sollte alles, was die Verbindung zum Pin betrifft, vom Pin AF-Modus 2 erledigt werden - der ihn mit TIM2 verbinden sollte, aber dies geschieht anscheinend nicht.

Ich verwende den STM32F072B-DISCO und KEIL v5

Es stammt alles aus den standardmäßigen STM32CubeFW-Beispielen, und das Projekt kann unter STM32F072B-Discovery_FW_V1.0.1\Projects\Peripheral_Examples\TIM|PWMInput\ gefunden werden.

Vielen Dank für jede Hilfe.

Antworten (1)

Dies liegt daran, dass nur bestimmte Pins jedes Ports eine Funktion haben können, in diesem Fall ist Timer2_Channel2 nur PB3 und PA1 auf diesem bestimmten Prozessor (STM32F072xB) zuweisbar; siehe Seite ~43 auf http://www.st.com/st-web-ui/static/active/en/resource/technical/document/datasheet/DM00090510.pdf

Somit wurden die Pins korrekt als Eingang konfiguriert, jedoch nicht mit dem Timer verbunden.

Es ist ein wenig traurig, dass dies keine statische Kontrolle hat.

Wie Sie sagten, müssen Sie das Datenblatt konsultieren, um zu sehen, welche Peripheriegeräte mit jedem Pin verbunden sind ...