1.什么是单脉冲模式
单脉冲模式就是定时器启动后,发送一个占空比可调的波形,发送完后,定时器又自动关闭了。而定时器的启动条件,可以通过从模式触发。
2.什么是从模式
通俗一点讲,从模式其实就是允许其他外设通过触发条件"控制自己"。
“控制自己”的方式有三种:
1.复位模式:选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存 器的信号。
2.门控模式:当触发输入(TRGI)为高时,定时器的时钟开启。一旦触发输入变为低,则定时器停止(但不复位)。计数器的启动和停止都是受控的。
3.触发模式:计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控的。
触发输入可以选择4个输入通道,如下图的TI1~TI4,与之对应的就是TIMx_CH1~CH4。
3.实现思路
开启定时器的从模式,并将其设置成触发模式,触发输入通道选择TI2(对应选择的gpio是PB7),开启输入比较;输出通道则选用CH1(对应选择的gpio是PB8),开启输出比较。这样就可以通过PB7输入一个矩形波,随后定时器启动,输出一个一个占空比由软件设置的波形。
(注:下图是TM1,代码是TM4)
代码如下:
void TIM4_IC_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
uint16_t PrescalerValue = 0;
/* TIM4 使能时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
/* GPIOB 使能时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
/* TIM4_CH1 pin (PB.06) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* TIM4_CH2 pin (PB.07) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
PrescalerValue = (uint16_t) (SystemCoreClock / 24000000) - 1;
/* 配置定时器的时钟 */
TIM_TimeBaseStructure.TIM_Period = 65535;
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
/* 配置定时器的输出比较 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 16383;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM4, &TIM_OCInitStructure);
/* 配置定时器输入比较 */
TIM_ICStructInit(&TIM_ICInitStructure);
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 = 0;
TIM_ICInit(TIM4, &TIM_ICInitStructure);
/* 设置单脉冲模式 */
TIM_SelectOnePulseMode(TIM4, TIM_OPMode_Single);
/* 设置从模式触发输入 */
TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2);
/* 设置从模式为触发模式 */
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);
}
记录学习过程,欢迎各位大佬批评指正