void TIM2_IRQHandler() { if (TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET) { /* Clear TIM2 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); /* Get the Input Capture value */ timebaseCapture_prev = timebaseCapture_current; timebaseCapture_current = TIM_GetCapture1(TIM2); if(TIM_ICInitStructure.TIM_ICPolarity == TIM_ICPolarity_Rising){ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInit(TIM2, &TIM_ICInitStructure); } else if(TIM_ICInitStructure.TIM_ICPolarity == TIM_ICPolarity_Falling){ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInit(TIM2, &TIM_ICInitStructure); if(timebaseCapture_current > timebaseCapture_prev){ timebaseCapture_output = (timebaseCapture_current - timebaseCapture_prev);//*5/18; } else{ timebaseCapture_output = (20000 - timebaseCapture_prev + timebaseCapture_current);//*5/18; } } } }
//ÊäÈ벶»ñÅäÖà void capture_config(void) { TIM_ICInitTypeDef TIM_ICInitStructure; gpio_af_pp_up_init(GPIOB, GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9);//CH1|CH2|CH4 GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4); GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); 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_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_Cmd(TIM4, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM4, TIM_IT_CC4, ENABLE); nvic_config(TIM4_IRQn, 2); }
//输入捕获配置 void capture_config(void) { TIM_ICInitTypeDef TIM_ICInitStructure; gpio_af_pp_up_init(GPIOC, GPIO_Pin_8|GPIO_Pin_9);//CH3|CH4 GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 10; TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); nvic_config(TIM3_IRQn, 0); TIM7_init(500, 8400); }
void ENC_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //Encoder uint connected to TIM2 GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB1PeriphClockCmd(ENC_TIMER_CLK,ENABLE); RCC_APB2PeriphClockCmd(ENC_GPIO_CLK ,ENABLE); GPIO_StructInit(&GPIO_InitStructure); //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Pin = ENC_GPIO_PIN_A | ENC_GPIO_PIN_B ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(ENC_GPIO_PORT ,&GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = ENC_TIMER_IRQn ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = TIMx_PRE_EMPTION_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelSubPriority = TIMx_SUB_PRIORITY; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_DeInit(ENC_TIMER); //TIM_TimeBaseInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; TIM_TimeBaseStructure.TIM_Period = (4*ENCODER_PPR)-1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(ENC_TIMER,&TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(ENC_TIMER,TIM_EncoderMode_TI12, TIM_ICPolarity_Rising,TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER; TIM_ICInit(ENC_TIMER,&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//注意通道 TIM_ICInit(ENC_TIMER, &TIM_ICInitStructure); TIM_ClearFlag(ENC_TIMER,TIM_FLAG_Update); TIM_ITConfig(ENC_TIMER,TIM_IT_Update,ENABLE); TIM2->CNT = COUNTER_RESET;//!!此处注意修改 //局部初始化 ENC_Clear_Speed_Buffer(); hPrevious_angle=0; hRot_Speed=0;; bSpeed_Buffer_Index = 0; hEncoder_Timer_Overflow=0; bIs_First_Measurement = true; hEncoder_Revolutions_Num=0; TIM_Cmd(ENC_TIMER,ENABLE); }
void TIM3_Mode_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //TIM_OCInitTypeDef TIM_OCInitStructure; /*----------------------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStructure); /* Configure PA.06,07 as encoder input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); /*----------------------------------------------------------------*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3 TIM_DeInit(TIM3); TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period =0xffff; // TIM_TimeBaseStructure.TIM_Prescaler =0; //设置预分频: TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 //TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; /*初始化TIM2定时器 */ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*-----------------------------------------------------------------*/ //编码配置 编码模式 TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //TIM_ICPolarity_Rising上升沿捕获 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//配置通道1的滤波器 TIM_ICInitStructure.TIM_ICFilter = 6; //比较滤波器 TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//配置通道2的滤波器 TIM_ICInitStructure.TIM_ICFilter = 6; //比较滤波器 TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ARRPreloadConfig(TIM3, ENABLE); // Clear all pending interrupts TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能中断 //Reset counter TIM3->CNT =0; TIM_Cmd(TIM3, ENABLE); //使能定时器3 }
static void PIOS_PWM_tim_edge_cb (uint32_t tim_id, uint32_t context, uint8_t chan_idx, uint16_t count) { /* Recover our device context */ struct pios_pwm_dev * pwm_dev = (struct pios_pwm_dev *)context; if (!PIOS_PWM_validate(pwm_dev)) { /* Invalid device specified */ return; } if (chan_idx >= pwm_dev->cfg->num_channels) { /* Channel out of range */ return; } const struct pios_tim_channel * chan = &pwm_dev->cfg->channels[chan_idx]; if (pwm_dev->CaptureState[chan_idx] == 0) { pwm_dev->RiseValue[chan_idx] = count; pwm_dev->us_since_update[chan_idx] = 0; } else { pwm_dev->FallValue[chan_idx] = count; } // flip state machine and capture value here /* Simple rise or fall state machine */ TIM_ICInitTypeDef TIM_ICInitStructure = pwm_dev->cfg->tim_ic_init; if (pwm_dev->CaptureState[chan_idx] == 0) { /* Switch states */ pwm_dev->CaptureState[chan_idx] = 1; /* Switch polarity of input capture */ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_Channel = chan->timer_chan; TIM_ICInit(chan->timer, &TIM_ICInitStructure); } else { /* Capture computation */ if (pwm_dev->FallValue[chan_idx] > pwm_dev->RiseValue[chan_idx]) { pwm_dev->CaptureValue[chan_idx] = (pwm_dev->FallValue[chan_idx] - pwm_dev->RiseValue[chan_idx]); } else { pwm_dev->CaptureValue[chan_idx] = ((chan->timer->ARR - pwm_dev->RiseValue[chan_idx]) + pwm_dev->FallValue[chan_idx]); } /* Switch states */ pwm_dev->CaptureState[chan_idx] = 0; /* Increase supervisor counter */ pwm_dev->CapCounter[chan_idx]++; /* Switch polarity of input capture */ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_Channel = chan->timer_chan; TIM_ICInit(chan->timer, &TIM_ICInitStructure); } }
void TIM3_IRQHandler(void) { uint16_t val =0,i=0; for(i=0;i<4;i++){ if (Channels[i+2].tim == TIM3 && (TIM_GetITStatus(TIM3, Channels[i+2].cc) == SET)){ TIM_ClearITPendingBit(TIM3, Channels[i+2].cc); switch (Channels[i+2].channel) { case TIM_Channel_1: val = TIM_GetCapture1(TIM3); break; case TIM_Channel_2: val = TIM_GetCapture2(TIM3); break; case TIM_Channel_3: val = TIM_GetCapture3(TIM3); break; case TIM_Channel_4: val = TIM_GetCapture4(TIM3); break; } if (Inputs[i+2].state == 0) Inputs[i+2].rise = val; else Inputs[i+2].fall = val; if (Inputs[i+2].state == 0) { Inputs[i+2].state = 1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_Channel = Channels[i+2].channel; TIM_ICInit(TIM3, &TIM_ICInitStructure); }else{ if(Inputs[i+2].fall > Inputs[i+2].rise ){ val = (Inputs[i+2].fall - Inputs[i+2].rise); if(val < 2100 && val>900) Inputs[i+2].capture = val; }else{ val = ((0xffff - Inputs[i+2].rise) + Inputs[i+2].fall); if(val < 2100 && val>900) Inputs[i+2].capture = val; } Inputs[i+2].state = 0; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_Channel = Channels[i+2].channel; TIM_ICInit(TIM3, &TIM_ICInitStructure); } } } rc_in.thr=Inputs[0].capture; rc_in.roll=Inputs[1].capture; rc_in.pitch=Inputs[2].capture; rc_in.yaw=Inputs[3].capture; rc_in.mode=Inputs[4].capture; rc_in.serve=Inputs[5].capture; }
/* * 函数名:TIM3_PWM_In_Init * 描述 :定时器3输入捕获初始化函数 * 输入 :arr:自动重装载寄存器周期的值;psc:时钟频率除数的预分频值 * 输出 :无 */ void TIM3_PWM_In_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM3_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_4); GPIO_ResetBits(GPIOB,GPIO_Pin_5); //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIMx的时间基数单位 //初始化TIM3通道1输入捕获参数 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1 ; //选择输入端 IC1映射到TI1上 TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM3_ICInitStructure.TIM_ICFilter = 0x00; //配置输入滤波器,不滤波 TIM_ICInit(TIM3, &TIM3_ICInitStructure); //初始化TIM3通道2输入捕获参数 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2 ; //选择输入端 IC1映射到TI1上 TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM3_ICInitStructure.TIM_ICFilter = 0x00; //配置输入滤波器 不滤波 TIM_ICInit(TIM3, &TIM3_ICInitStructure); //中断分组初始化 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn ; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //初始化外设NVIC寄存器 TIM_ITConfig(TIM3,TIM_IT_Update | TIM_IT_CC1 | TIM_IT_CC2,ENABLE); //允许更新中断 ,允许CC1IE捕获中断 TIM_Cmd(TIM3,ENABLE ); //使能定时器3 }
void tim3_capture_init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM3_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //初始化定时器4 TIM3 TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_Prescaler = 71; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //初始化TIM3输入捕获参数 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM3_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM3_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM3_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM3_ICInitStructure.TIM_Channel = TIM_Channel_3; TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM3_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM3_ICInitStructure.TIM_Channel = TIM_Channel_4; TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM3_ICInitStructure.TIM_ICFilter = 0x00; TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM_Cmd(TIM3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC3, ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC4, ENABLE); }
void TIM4_Config(void) //PWM正脉宽捕获 { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_BaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); TIM_BaseInitStructure.TIM_Period = 40000; //40ms TIM_BaseInitStructure.TIM_Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1; //1us TIM_BaseInitStructure.TIM_ClockDivision = 0; TIM_BaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_BaseInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; //定时器2通道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_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //定时器2通道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_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_3; //定时器2通道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_ICInit(TIM4, &TIM_ICInitStructure); TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //定时器2通道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_ICInit(TIM4, &TIM_ICInitStructure); TIM_ITConfig(TIM4, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4, ENABLE); TIM_Cmd(TIM4, ENABLE); }
//void PIOS_PWM_irq_handler(TIM_TypeDef * timer) void TIM3_IRQHandler(void) { /* Zero value always will be changed but this prevents compiler warning */ int32_t i = 0; /* Do this as it's more efficient */ if (TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET) { i = 7; if (CaptureState == 0) { RiseValue = TIM_GetCapture2(TIM3); } else { FallValue = TIM_GetCapture2(TIM3); } } /* Clear TIM3 Capture compare interrupt pending bit */ TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); /* Simple rise or fall state machine */ if (CaptureState == 0) { /* Switch states */ CaptureState = 1; /* Switch polarity of input capture */ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM3, &TIM_ICInitStructure); } else { /* Capture computation */ if (FallValue > RiseValue) { CaptureValue = (FallValue - RiseValue); } else { CaptureValue = ((0xFFFF - RiseValue) + FallValue); } /* Switch states */ CaptureState = 0; /* Increase supervisor counter */ CapCounter++; TIM_ITConfig(TIM3, TIM_IT_CC2, DISABLE); /* Switch polarity of input capture */ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; TIM_ICInit(TIM3, &TIM_ICInitStructure); } }
void PWD_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定时器初始化结构 TIM_ICInitTypeDef TIM_ICInitStructure; //通道输入初始化结构 GPIO_InitTypeDef GPIO_InitStructure; //浮动输入方式 GPIO_InitStructure.GPIO_Pin = /* GPIO_Pin_0 | */GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOB, &GPIO_InitStructure); //输出初始化 TIM_TimeBaseStructure.TIM_Period = 65535; //周期 TIM_TimeBaseStructure.TIM_Prescaler = 720; //时钟分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//基本初始化 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //捕捉初始化 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 = 0x4; //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//通道选择 // TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_ICInit(TIM4, &TIM_ICInitStructure); //初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;//通道选择 TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;//通道选择 TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;//通道选择 TIM_ICInit(TIM2, &TIM_ICInitStructure); //初始化 TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); //选择时钟触发源 TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//触发方式 TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发 TIM_ITConfig(TIM2, /*TIM_IT_CC1|*/TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4, ENABLE); //打开中断 TIM_SelectInputTrigger(TIM4, TIM_TS_TI1F_ED); //选择时钟触发源 TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);//触发方式 TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发 TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); //打开中断 TIM_Cmd(TIM2, ENABLE); //启动TIM2 TIM_Cmd(TIM4, ENABLE); }
/************************************************************************** 函数功能:把TIM4初始化为编码器接口模式 入口参数:无 返回 值:无 **************************************************************************/ void Encoder_Init_TIM3(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//使能定时器3的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // 预分频器 TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//选择时钟分频:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;////TIM向上计数 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用编码器模式3 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 10; TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ClearFlag(TIM3, TIM_FLAG_Update);//清除TIM的更新标志位 TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //Reset counter TIM_SetCounter(TIM3,0); TIM_Cmd(TIM3, ENABLE); }
/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f4xx.c file */ /* TIM1 Configuration */ TIM_Config(); /* TIM1 configuration: Input Capture mode --------------------- The external signal is connected to TIM1 CH2 pin (PE.11) The Rising edge is used as active edge, The TIM1 CCR2 is used to compute the frequency value ------------------------------------------------------------ */ 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_ICInit(TIM1, &TIM_ICInitStructure); /* TIM enable counter */ TIM_Cmd(TIM1, ENABLE); /* Enable the CC2 Interrupt Request */ TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE); while (1); }
void TIM8_Encoder_Init() { RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); TIM_DeInit(TIM8); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_Period = 0xFFFFFFFF; // Max value for encoder pulse TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM8, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM8, &TIM_ICInitStructure); // TIM_SetAutoreload(TIM2, 0xFFFF); TIM_SetCounter(TIM8, 0); TIM_Cmd(TIM8, ENABLE); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_4); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_4); }
void encoder_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //TIM2_CH1->PA5, TIM2_CH2->PA1 gpio_af_od_up_init(GPIOA, GPIO_Pin_1|GPIO_Pin_5); //编码器AB相输入口,复用开漏上拉 GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_TIM2); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2); TIM_DeInit(TIM2); TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_Period = ENCODER_RELOAD; //TIM2为32位定时器,这里把重载值设为最大,可以不考虑计数溢出 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM2->CNT = COUNTER_RESET; TIM_Cmd(TIM2, ENABLE); }
/** * @brief This function initialises quadrature encoder input to capture AB phase output from ENB encoder. * @param void * @retval void * @brief * PB4 --> TIM3 CH1 * PB5 --> TIM3 CH2 */ void QEI1_init (void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* TIM3 clock source enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* Enable GPIOB, clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); GPIO_StructInit(&GPIO_InitStructure); /* Configure PB.4,5 as encoder alternate function */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Connect TIM3 pins to AF2 */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_TIM3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_TIM3); /* Enable the TIM3 Update Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Timer configuration in Encoder mode */ TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0x0; // No prescaling TIM_TimeBaseStructure.TIM_Period = (4*4000)-1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; TIM_ICInit(TIM3, &TIM_ICInitStructure); // Clear all pending interrupts TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //Reset counter TIM3->CNT = 0; //encoder value TIM_Cmd(TIM3, ENABLE); }
/* *berif: Initialize the counter of the encoding module(Right) *param: None *reval: None */ void TIM3_Init() { TIM_ICInitTypeDef TIM3_ICInitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //TIM4时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //GPIOB6 | 7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz //以下两个不用设置 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽复用 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //下拉 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PB GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //GPIOB6 | 7 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz //以下两个不用设置 GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; //推挽复用 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //下拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PB GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_TIM3); //PB6复用位定时器4 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3); //PB7复用位定时器4 TIM_DeInit(TIM3); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler=0; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period=60000; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); //初始化TIM5输入捕获参数 TIM3_ICInitStructure.TIM_Channel = TIM_Channel_1 | TIM_Channel_2; //CC1S=01 选择输入端 IC1映射到TI1上 TIM3_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge; //上升沿捕获 TIM3_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM3_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM3_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波 TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICInit(TIM3, &TIM3_ICInitStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断 ,允许CC1IE捕获中断 TIM_SetCounter(TIM3, 30000); TIM_Cmd(TIM3,ENABLE ); //使能定时器5 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 }
void encb_init( void ) { TIM_ICInitTypeDef TIM_ICInitStructure; //********************************************************* //****** Main Encoder Setting //********************************************************* DBG( ENC, L, "Main encoder button init" ); RCC_APB2PeriphResetCmd( RCC_APB2Periph_TIM8, ENABLE ); 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 = ENCB_FILTER_CNT; TIM_ICInit( TIM8, &TIM_ICInitStructure ); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; 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 = ENCB_FILTER_CNT; TIM_ICInit( TIM8, &TIM_ICInitStructure ); TIM_EncoderInterfaceConfig( TIM8, TIM_EncoderMode_TI12, TIM_ICPolarity_Falling, ENCB_MAIN_DIR_POL ); TIM_Cmd( TIM8, ENABLE ); bio_i_chk[ENCB_MAIN_A_PORT_IX].mask &= ~ENCB_MAIN_A_PIN; bio_i_chk[ENCB_MAIN_B_PORT_IX].mask &= ~ENCB_MAIN_B_PIN; //********************************************************* //****** Initial Values Setting //********************************************************* encb_info[ENCB_IX_MAIN].pls_rev = 24; encb_info[ENCB_IX_MAIN].val_min = 0; encb_info[ENCB_IX_MAIN].val_max = 999 * 10; encb_info[ENCB_IX_MAIN].val_cur = 123; // encb_info[ENCB_IX_MAIN].val_cur = eep_data.c_ht_tgt; encb_info[ENCB_IX_MAIN].sns_min = ENCB_BASE_SENS * 10; encb_info[ENCB_IX_MAIN].sns_max = 25000; } // end of encb_init()
void aglInit(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /////////////////////////////////// // AGL TIM16_CH1 PB4 aglPulseWidth = 0; GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_1); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 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_DOWN; GPIO_Init(GPIOB, &GPIO_InitStructure); /////////////////////////////////// NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_TIM16_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000; TIM_TimeBaseInit(TIM16, &TIM_TimeBaseStructure); /////////////////////////////////// TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; 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 = 0x00; TIM_ICInit(TIM16, &TIM_ICInitStructure); TIM_ITConfig(TIM16, TIM_IT_CC1, ENABLE); TIM_Cmd(TIM16, ENABLE); /////////////////////////////////// }
static void hal_soft_serial_init_timer(void) { TIM_TimeBaseInitTypeDef tim_init; TIM_ICInitTypeDef tim_ic_init; // time base configuration: TIM_TimeBaseStructInit(&tim_init); // this serial uart runs at 9600 baud, thus bitlength = 1/9600 = 104.166667 us // a 1mhz counter gives us 1us resolution, a 24mhz counter gives us 1/24 us res // the finer the better -> go for 24mhz counter = prescaler = 0 (:1) tim_init.TIM_Prescaler = (uint16_t) (0); // timer period = bit duration tim_init.TIM_Period = 0xFFFF; tim_init.TIM_ClockDivision = 0; tim_init.TIM_CounterMode = TIM_CounterMode_Up; //set time base. NOTE: this will immediately trigger an INT! TIM_TimeBaseInit(SOFT_SERIAL_TIMER, &tim_init); //clear IT flag (caused by TimeBaseInit()): TIM_ClearITPendingBit(SOFT_SERIAL_TIMER, TIM_IT_Update); TIM_ICStructInit(&tim_ic_init); tim_ic_init.TIM_Channel = SOFT_SERIAL_TIMER_CH; #if HUB_TELEMETRY_INVERTED #if SOFT_SERIAL_INVERTED //board has inverter -> invert twice = no inversion tim_ic_init.TIM_ICPolarity = TIM_ICPolarity_Falling; #else tim_ic_init.TIM_ICPolarity = TIM_ICPolarity_Rising; #endif #else #if SOFT_SERIAL_INVERTED //board has inverter -> invert tim_ic_init.TIM_ICPolarity = TIM_ICPolarity_Rising; #else tim_ic_init.TIM_ICPolarity = TIM_ICPolarity_Falling; #endif #endif tim_ic_init.TIM_ICSelection = TIM_ICSelection_DirectTI; tim_ic_init.TIM_ICPrescaler = TIM_ICPSC_DIV1; tim_ic_init.TIM_ICFilter = 0x0; TIM_ICInit(SOFT_SERIAL_TIMER, &tim_ic_init); TIM_ClearITPendingBit(SOFT_SERIAL_TIMER, SOFT_SERIAL_TIMER_IT_IC); /* //Output Compare Active Mode configuration: TIM_OCStructInit(&tim_oc_init); tim_oc_init.TIM_OCMode = TIM_OCMode_ disable; tim_oc_init.TIM_OutputState = TIM_OutputState_ disable; tim_oc_init.TIM_Pulse = PPM_SYNC_PULS_LEN_TICKS; tim_oc_init.TIM_OCPolarity = TIM_OCPolarity_High; hal_ppm_init_ocx(PPM_TIMER_CH, PPM_TIMER, &tim_oc_init); */ //enable counter TIM_Cmd(SOFT_SERIAL_TIMER, ENABLE); }
/******************************************************************************************************** Function Name: EncoderTIMInit Description : Inputs : None Outputs : None Notes : Encoder TIME初始化 Revision : ********************************************************************************************************/ void EncoderTIMInit(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); /*********************** ENCODER2 *************************/ TIM_DeInit(ENCODER_R_TIMER); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0; // No prescaling TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(ENCODER_R_TIMER, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(ENCODER_R_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_BothEdge, TIM_ICPolarity_BothEdge); // 编码器计数方式 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER; // 滤波器 TIM_ICInit(ENCODER_R_TIMER, &TIM_ICInitStructure); ENCODER_R_TIMER->CNT = COUNTER_RESET; TIM_Cmd(ENCODER_R_TIMER, ENABLE); /********************** ENCODER1 *************************/ TIM_DeInit(ENCODER_L_TIMER); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 0; // No prescaling TIM_TimeBaseStructure.TIM_Period = 65535; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(ENCODER_L_TIMER, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(ENCODER_L_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //选定T1和T2同时计数模式,上升沿计数 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER; TIM_ICInit(ENCODER_L_TIMER, &TIM_ICInitStructure); ENCODER_L_TIMER->CNT = COUNTER_RESET; TIM_Cmd(ENCODER_L_TIMER, ENABLE); }
void TIM3_Init() //运动电机 { //u16 CCR1_Val = 2500; //u16 CCR2_Val = 1000; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; //TIM_OCInitTypeDef TIM_OCInitStructure; /*----------------------------------------------------------------*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_StructInit(&GPIO_InitStructure); /* Configure PA.06,07 as encoder input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); /*----------------------------------------------------------------*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3 TIM_DeInit(TIM3); TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period =8000; //此处设置所使用的编码器转一圈产生的计数 TIM_TimeBaseStructure.TIM_Prescaler =0; //设置预分频: TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1 ; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 //TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; /*初始化TIM3定时器 */ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*-----------------------------------------------------------------*/ //编码配置 编码模式 TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); //TIM_ICPolarity_Rising上升沿捕获 TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 1; //比较滤波器 TIM_ICInit(TIM3, &TIM_ICInitStructure); TIM_ClearFlag(TIM3, TIM_FLAG_Update); TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //使能中断 //Reset counter TIM3->CNT =0; TIM_Cmd(TIM3, ENABLE); //使能定时器3 }
void TIM2_IRQHandler(void) { uint16_t val =0,i=0; for(i=0;i<2;i++){ if (Channels[i].tim == TIM2 && (TIM_GetITStatus(TIM2, Channels[i].cc) == SET)){ TIM_ClearITPendingBit(TIM2, Channels[i].cc); switch (Channels[i].channel) { case TIM_Channel_1: val = TIM_GetCapture1(TIM2); break; case TIM_Channel_2: val = TIM_GetCapture2(TIM2); break; } if (Inputs[i].state == 0) Inputs[i].rise = val; else Inputs[i].fall = val; if (Inputs[i].state == 0) { Inputs[i].state = 1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_Channel = Channels[i].channel; TIM_ICInit(TIM2, &TIM_ICInitStructure); }else{ if(Inputs[i].fall > Inputs[i].rise ){ val = (Inputs[i].fall - Inputs[i].rise); if(val < 2100 && val>900) Inputs[i].capture = val; }else{ val = ((0xffff - Inputs[i].rise) + Inputs[i].fall); if(val < 2100 && val>900) Inputs[i].capture = val; } Inputs[i].state = 0; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_Channel = Channels[i].channel; TIM_ICInit(TIM2, &TIM_ICInitStructure); } } } }
void InitExternalPulseTimer(void (*InterruptService) (int capture), void (*OverflowService) ()) { CaptureService = InterruptService; CaptureOverflowService = OverflowService; NVIC_InitTypeDef NVIC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /* PULSE_TIMER clock enable */ RCC_APB1PeriphClockCmd(PULSE_TIMER_PERIPHERAL, ENABLE); /* GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Enable the PULSE_TIMER global Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = PULSE_TIMER_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* PULSE_TIMER channel 2 pin (PA.07) configuration */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PULSE_TIMER prescale */ TIM_TimeBaseInitStructure.TIM_Prescaler = EXTERNAL_PULSE_TIMER_PRESCALER - 1; /* clock slow down */ TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(PULSE_TIMER, &TIM_TimeBaseInitStructure); /* ** PULSE_TIMER configuration: Input Capture mode ** The external signal is connected to PULSE_TIMER CH2 pin (PA.07) ** The Rising edge is used as active edge, ** The PULSE_TIMER CCR2 is used to compute the frequency value */ 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_ICInit(PULSE_TIMER, &TIM_ICInitStructure); /* TIM enable counter */ TIM_Cmd(PULSE_TIMER, ENABLE); /* Enable the CC2 Interrupt Request */ TIM_ITConfig(PULSE_TIMER, TIM_IT_CC2, ENABLE); TIM_ITConfig(PULSE_TIMER, TIM_IT_CC3, ENABLE); }
void pwm_in_init() { uint8_t i; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_Init(GPIOB, &GPIO_InitStructure); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; NVIC_Init(&NVIC_InitStructure); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); TIM_DeInit(TIM2); TIM_DeInit(TIM3); TIM_TimeBaseStructure.TIM_Prescaler = (72 - 1); TIM_TimeBaseStructure.TIM_Period = 0xffff; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 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 = 0xF; for(i=0;i<6;i++){ TIM_ICInitStructure.TIM_Channel = Channels[i].channel; TIM_ICInit(Channels[i].tim, &TIM_ICInitStructure); } TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 , ENABLE); TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4 , ENABLE); TIM_Cmd(TIM2, ENABLE); TIM_Cmd(TIM3, ENABLE); // Inputs[0].capture = roll_init; // Inputs[1].capture = pitch_init; // Inputs[2].capture = thr_init; // Inputs[3].capture = yaw_init; }
void InitRC(void) { // Common typedefs NVIC_InitTypeDef NVIC_InitStructure; // Input Capture TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; /* TIM3 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* GPIOA clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler = 83; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); GPIO_InitStructure.GPIO_Pin = RC_PPM_PIN; 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_NOPULL; GPIO_Init(RC_PPM_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(RC_PPM_PORT, RC_PPM_PIN_SOURCE, GPIO_AF_TIM3); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable capture*/ TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; /* input pins directly connected */ TIM_ICInitStructure.TIM_ICFilter = 0x0; TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInit(TIM3, &TIM_ICInitStructure); /* Enable TIM3 */ TIM_Cmd(TIM3, ENABLE); /* Enable CC1-4 interrupt */ TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE); /* Clear CC1-4 Flag*/ TIM_ClearFlag(TIM3, TIM_FLAG_CC1); }
/**************************************************************************** * 名 称:void TIM2_IC(void) * 功 能:定时器输入捕获功能初始化 * 入口参数:无 * 出口参数:无 * 说 明:暂未实现 ****************************************************************************/ void TIM2_IC(void) { TIM_ICInitTypeDef I; //创建输出比较设置变量 //输入捕获配置 TIMx_CCRx I.TIM_Channel = TIM_Channel_1; //使用输入捕获通道 I.TIM_ICPolarity = TIM_ICPolarity_Rising; //输入捕获上升沿有效 I.TIM_ICSelection = TIM_ICSelection_DirectTI; //IC*输入引脚选择,针对IC1/IC2有不同的定义 I.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入模式下,捕获端口上的每一次边沿都触发一次捕获 I.TIM_ICFilter = 0; //捕获采样频率,详见TIM*_CCMR->IC*F说明 TIM_ICInit(TIM2, &I); //初始化输入 }
static void pwmInitializeInput(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; uint8_t i; for (i = 0; i < PWMIN_CHANNEL_NUM; i++) { struct TIM_Channel channel = Channels[i]; // timer_reset ******************************************************************/ channel.tim_clkcmd(channel.tim_clk, ENABLE); // timer_pause ******************************************************************/ TIM_Cmd(channel.tim, DISABLE); // gpio_set_mode ****************************************************************/ channel.gpio_clkcmd(channel.gpio_clk, ENABLE); GPIO_InitStructure.GPIO_Pin = channel.gpio_pin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(channel.gpio_port, &GPIO_InitStructure); // gpio_set_af_mode *************************************************************/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // GPIO_PinAFConfig(channel.gpio_port, channel.gpio_af, channel.gpio_af_tim); // enable the TIM global interrupt NVIC_InitStructure.NVIC_IRQChannel = channel.tim_irq; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // TIM configuration base *******************************************************/ TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Prescaler = 71; //100KHz TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(channel.tim, &TIM_TimeBaseStructure); // PWM input capture ************************************************************/ TIM_ICInitStructure.TIM_Channel = channel.tim_channel; 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_ICInit(channel.tim, &TIM_ICInitStructure); // timer_enable *****************************************************************/ TIM_Cmd(channel.tim, ENABLE); // enable the CC interrupt request **********************************************/ TIM_ITConfig(channel.tim, channel.tim_cc, ENABLE); } }
void tim3ConfigFalling() { TIM_ICInitTypeDef timICStruct; timICStruct.TIM_Channel = TIM_Channel_1; timICStruct.TIM_ICPolarity = TIM_ICPolarity_Falling; timICStruct.TIM_ICSelection = TIM_ICSelection_DirectTI; timICStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1; timICStruct.TIM_ICFilter = 0x0; TIM_ICInit(TIM3, &timICStruct); }