Skip to main content
ferhatyol-23
Senior
July 27, 2018
Question

How to Trigger TIM2 via TIM3?

  • July 27, 2018
  • 3 replies
  • 1052 views

Hi.

I'm reading Incremental Optic encoder with Timer3. The counter value is 4095 when the encoder rotates one turn. My goal is to produce pulses from 0-25ms through another timer when the Encoder turns half a turn.

In order to do this, I am trying to trigger Timer2 via Timer3. But I couldn't run

This is Encoder Timer Settings

void Encoder_Init(void)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
 
	// Step 1: Initialize GPIO as input for rotary encoder
	//PA6 (TIM3_CH1) (encoder pin A), PA7 (TIM3_CH2) (encoder pin B)
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	TIM_TimeBaseStructure.TIM_Prescaler = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up | TIM_CounterMode_Down;
	TIM_TimeBaseStructure.TIM_Period = 4095;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	
 /* Output Compare Active Mode configuration: Channel1 */
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 TIM_OCInitStructure.TIM_Pulse = 1000;
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
 TIM_OC1Init(TIM3, &TIM_OCInitStructure);
	
	TIM_SetCounter(TIM3,0);
 
	TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
	
	TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref);
	
	TIM_Cmd(TIM3, ENABLE);
	
}

Slave Timer settings

void SlaveTimerInit(void)
{
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 TIM_OCInitTypeDef TIM_OCInitStructure;
 GPIO_InitTypeDef GPIO_InitStruct;
	
 // Enable clock
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
 GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	 // Time Base configuration
	TIM_TimeBaseStructure.TIM_Prescaler = 72-1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	
 /* TIM2 PWM2 Mode configuration: Channel1 */
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 TIM_OCInitStructure.TIM_Pulse = 20000; //20ms
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
 
 TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
 /* One Pulse Mode selection */
 TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);
	
 /* Input Trigger selection */
 TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);
 
 /* Slave Mode selection: Trigger Mode */
 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);
	
}

Where am I making mistakes? Thanks. How to do it?

    This topic has been closed for replies.

    3 replies

    Tesla DeLorean
    Guru
    July 27, 2018

    What part specifically are you using?

    What routing does the Reference Manual for your part indicate is available?

    Tips, Buy me a coffee, or three.. PayPal Venmo (See Profile) Up vote any posts that you find helpful, it shows what's working..
    ferhatyol-23
    Senior
    July 28, 2018

    I looked at the Reference Manual, but I could not figure out what direction to do. First, is this Possible? Could you give me an example?

    henry.dick
    Associate II
    July 28, 2018
    1. look at the datasheet. not all timers can be a slave, or master.
    2. see examples here: https://dannyelectronics.wordpress.com/2018/07/04/composite-timers-continued/

    you either implement that in spl/hal, or just change the smcr register.