我想用TIM1的CC4触发中断,计数模式是中央对齐模式,我想在下降沿触发中断,TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;在这里设置了,后来读取计数器值发现总是在上升沿触发中断,很困惑,求教原子哥
[mw_shl_code=c,true]void TIM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //基本结构体变量定义
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //打开定时器时钟
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period = 2249; //计数值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //时钟因子
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; //计数模式选择 TIM_CounterMode_Up向上计数 TIM_CounterMode_Dowm向下计数
//TIM_CounterMode_CenterAligned1 中心对齐方式1(下降触发) TIM_CounterMode_CenterAligned2 中心对齐方式2(上升触发) TIM_CounterMode_CenterAligned3 中心对齐方式3(上升下降触发)
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
/*TIM_OCMode_Timing输出比较时间模式(输出引脚冻结无效)
TIM_OCMode_Active输出比较主动模式(匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强制输出为高电平)
TIM_OCMode_Inactive输出比较非主动模式(匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平)
TIM_OCMode_Toggle输出比较触发模式(翻转。当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)
TIM_OCMode_PWM1向上计数时,当TIMx_CNT < TIMx_CCR*时,输出电平有效,否则为无效。向下计数时,当TIMx_CNT > TIMx_CCR*时,输出电平无效,否则为有效
TIM_OCMode_PWM2与PWM1模式相反*/
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //OC输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //互补输出使能
TIM_OCInitStructure.TIM_Pulse = 100; //比较/PWM 通道的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
/*输出比较极性的指的是你在比较匹配之后输出口输出的极性。
这个函数就是让你设置有效极性,也就是设置比较输出的有效电平。
你可以设置为高电平有效或者低电平有效。
如果设置为高电平有效,那么当定时器比较匹配之后,输出口输出高电平,否则就反一下。*/
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //set当MOE=0时,如果实现了OC*N,则死区后OC*=1;reset当MOE=0时,如果实现了OC*N,则死区后OC*=0
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; //set当MOE=0时,死区后OC*N=1;reset当MOE=0时,死区后OC*N=0
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = 100;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = 100;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//CCR4这个输出使能后才能用来触发ADC1的注入通道采样
TIM_OCInitStructure.TIM_Pulse = 1;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_ClearFlag(TIM1, TIM_IT_Update);
TIM_ClearFlag(TIM1, TIM_IT_Break);
TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Break, ENABLE);
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 136;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_SelectOutputTrigger( TIM1, TIM_TRGOSource_Update );
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}[/mw_shl_code]
这是定时器设定
|