应该有的。我用TIM3测试的时候是可以的,是不是你示波器没捕捉到。下面这个例子可以通过
按键来触发 指定的脉冲宽度和周期的代码,你可以参考下。
PA6---------------------接按键 下降沿触发
PA7--------------------输出脉冲
//利用定时器3的单脉冲初始化
//PA6 TIM3_CH1作为输入触发信号
//PA7 TIM3_CH2作为输出脉冲
//PulseWidth:脉冲宽度
//Arr和Psc控制脉冲周期
void TIM3_OnePulseInit(u16 PulseWidth,u16 Arr,u16 Psc){
GPIO_InitTypeDef GPIO_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //PA6 输入上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //PA7 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM3_Int_Init(Arr,Psc);
//TIM3_CH2配置为PWM模式2的配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM2模式 PWM参考信号OCxREF不同
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出控制
TIM_OCInitStructure.TIM_Pulse = Arr-PulseWidth; //设置延时时间,即多长时间之后输出脉冲
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出电平极性
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
//TIM3_CH1配置为输入捕获模式
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //选择输入通道1连接到IC1
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //输入不分频 每个事件都触发一次
TIM_ICInitStructure.TIM_ICFilter = 0; //不滤波
TIM_ICInit(TIM3, &TIM_ICInitStructure);
//选择单脉冲输出 TIM_OPMode_Single,TIM_OPMode_Repetitive
TIM_SelectOnePulseMode(TIM3, TIM_OPMode_Single);
//输入触发选择
TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); //选择滤波后的定时器1作为触发
//从模式选择:触发模式
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
//TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
//定时器3计数周期
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
} |