用stm32F407 TIM1做输入捕获,发现无法进入中断

2019-12-30 19:23发布

之前用TIM3等其他定时器作输入捕获均没有问题,程序如下,大伙帮忙看看看
GPIO_InitTypeDef GPIO_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  TIM_ICInitTypeDef  TIM_ICInitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//启用TIM1的APB2时钟
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//启用GPIOA的AHB1时钟
  
  /* TIM4 chennel2 configuration : PA.10  */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;         //配置引脚10
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;       //引脚复用功能
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  //引脚速度为100MHz
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //引脚推挽输出
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP ;      //引脚上拉
  GPIO_Init(GPIOA, &GPIO_InitStructure);              //初始化GPIOA外设
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_TIM1); //PA.10 配置成TIM1_CH3复用功能       
       
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;           //选定TIM1_IRQn中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //主优先级,数值越低,优先级越高
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;        //从优先级,数值越低,优先级越高
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //启用TIM1_IRQn
  NVIC_Init(&NVIC_InitStructure);
       
  TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;               //选择通道3
  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 = 0x0;                        //滤波设置,经过几个周期跳变认为波形稳定
  TIM_PWMIConfig (TIM1, &TIM_ICInitStructure);//TIP:改为TIM_ICInit(TIM4, &TIM_ICInitStructure) IC1value一直为0
  //TIM1->PSC=41;                              //TIM1 分频
        //清中断,以免一启用中断后立即产生中断
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);
  /* Select the TIM4 Input Trigger: TI2FP2 */
  TIM_SelectInputTrigger(TIM1, TIM_TS_TI2FP2);                   //选择IC2为时钟触发源
  /* Select the slave Mode: Reset Mode */
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);                //TIM从模式:触发信号的下降沿重新初始化计数器和触发寄存器的更新事件
  TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);    //启动TIM2的被动触发
  /* Enable the CC2 Interrupt Request */
  TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);
  /* TIM enable counter */
  TIM_Cmd(TIM1, ENABLE);                       
}
void TIM1_CC_IRQHandler(void)
{

   PPM_test++;
  /* Clear TIM4 Capture compare interrupt pending bit */
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC2);                     //清楚TIM1的中断待处理位

  /* Get the Input Capture value */
  IC2Value = TIM_GetCapture2(TIM1);                            //读取IC2捕获寄存器的值,即为PWM周期的计数值
  IC1Value = TIM_GetCapture1(TIM1);                            //读取IC1捕获寄存器的值,为PWM低电平的计数值
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
596142041
1楼-- · 2019-12-30 19:40
TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);这配置的是通道2的吧!TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;               //选择通道3 你写的是 “选择通道3 ”?还有你的NVIC组选择的是哪一组呢?没看着
NUAAgeroge
2楼-- · 2019-12-31 00:09
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);,这还会有关系吗?
NUAAgeroge
3楼-- · 2019-12-31 02:37
596142041 发表于 2014-12-19 17:50
TIM_ITConfig(TIM1, TIM_IT_CC2, ENABLE);这配置的是通道2的吧!TIM_ICInitStructure.TIM_Channel = TIM_C ...

在你的提示下,能进入中断了,但还是无法捕获值
596142041
4楼-- · 2019-12-31 07:29
NUAAgeroge 发表于 2014-12-19 20:06
在你的提示下,能进入中断了,但还是无法捕获值

这一块我就不知道了,我一直用的F1系列的芯片
Shampoo
5楼-- · 2019-12-31 13:28
 精彩回答 2  元偷偷看……
逍遥不记年
6楼-- · 2019-12-31 17:02
596142041 发表于 2014-12-19 21:44
这一块我就不知道了,我一直用的F1系列的芯片

F1系列的定时器8输入捕获了解吗 我程序上可以进入中断但是一直都在计数

一周热门 更多>