门控模式是定时器三种从模式之一,在这种模式下,计数器的计数操作由某个输入信号(通常是一个外部引脚)来控制。计数器只有在这个输入信号处于某种特定状态(如高电平或低电平)时才会进行计数,当输入信号的状态变化时(例如从低电平变为高电平),计数器会停止计数。
我们需要做三件事:配置输入源,使能计数器以及让相关信号源在正常工作的01位
图中可以看出TI1在置0时是有效的触发输入电平,而光光TI1置0还是不行的,还需要使能计数器。
当计数器使能或者失能时都会置位SR计数器的TIF位。
在图中我们也不难看出即使计数器使能或者失能,还是离计数器真正开始计数或停止计数有一段延时,这个取决于于TI1输入端的重同步电路。而重同步电路是用于同步外部输入信号和内部时钟的,这个硬件问题是无法避免的
void TIM2_Config(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
// 配置 TIM2 基本时间基准
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_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
// 配置 TIM2 输入捕获通道1
TIM_ICInitTypeDef TIM_ICInitStructure;
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 = 0x00;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
// 配置 TIM2 为门控模式
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);
TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1); // 选择 TI1FP1 作为触发源
TIM_Cmd(TIM2, ENABLE);
}