中级会员
 
- 积分
- 445
- 金钱
- 445
- 注册时间
- 2019-1-29
- 在线时间
- 101 小时
|

楼主 |
发表于 2020-11-6 10:51:53
|
显示全部楼层
TIM8的通道1捕获外部信号(信号发生器,20Hz,脉宽5ms),捕获到以后使TIM8复位,通道二输出20Hz,5ms的PWM,TIM8部分代码如下:
void TIM8_benzhen_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); //使能定时器8
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); //使能GPIO外设时钟使能
//外部时钟接口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM8_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//本振使能信号
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM8_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
//多台电源信号同步输出,此信号与CH2相同
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM8_CH3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;//配置为通道1检测
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;//配置为上升沿检测
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//选择输入端 IC1映射到TI1上
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;//分频数
TIM_ICInitStructure.TIM_ICFilter = 0x03; //8个定时器时钟周期滤波
TIM_ICInit(TIM8, &TIM_ICInitStructure);
TIM_SelectInputTrigger(TIM8, TIM_TS_TI1FP1);//TI1的上升沿检测(外部时钟触发)
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //注意,TIM8是高级定时器,必须加这一句才能进中断函数
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM8, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC3Init(TIM8, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable; //不用输出PWM
TIM_OCInitStructure.TIM_Pulse =0; //设置待装入捕获比较寄存器的脉冲值,占空比初始化为0
TIM_OC4Init(TIM8,&TIM_OCInitStructure);
TIM_SelectOutputTrigger(TIM8,TIM_TRGOSource_OC4Ref); //设置TIM8 CH4作为触发源,去触发TIM5
TIM_CtrlPWMOutputs(TIM8,ENABLE); //MOE 主输出使能
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH2预装载使能
TIM_OC3PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH3预装载使能
TIM_OC4PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH4预装载使能
TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM8, ENABLE); //使能TIM8
TIM_SelectSlaveMode(TIM8, TIM_SlaveMode_Reset); //工作于触发模式下
TIM_SelectMasterSlaveMode(TIM8, TIM_MasterSlaveMode_Enable);//使能主从模式
} |
|