OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7739|回复: 5

利用定时器TIM4_CH1捕捉PWM跳变沿

[复制链接]

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
发表于 2014-3-5 20:34:53 | 显示全部楼层 |阅读模式

     如主题所示,,麻烦哪位大神帮我看看,,为什么总是检测不到呢???就这么点代码,,就是找不到原因啊,,或者谁给个例程我参考参看

void TIM_InitCapture(TIM_TypeDef* TIMx)
{
 TIM_ICInitTypeDef TIM_ICInitCapture;
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4 , ENABLE);
 
 GPIOB->CRL &= ~0x0F000000;  // B.6浮空输入

 TIM_DeInit(TIMx);
 TIM_ICStructInit(&TIM_ICInitCapture);
 TIM_ICInitCapture.TIM_Channel = TIM_Channel_1;          //TIM4_CH1
 TIM_ICInitCapture.TIM_ICPolarity = TIM_ICPolarity_BothEdge;   //条边沿触发
 TIM_ICInitCapture.TIM_ICSelection = TIM_ICSelection_DirectTI;  //
 TIM_ICInitCapture.TIM_ICPrescaler = TIM_ICPSC_DIV1;   
 TIM_ICInitCapture.TIM_ICFilter = 0x0;
 TIM_ICInit(TIMx, &TIM_ICInitCapture);
  TIM_PWMIConfig(TIMx, &TIM_ICInitCapture);
 
 /* Select the TIM4 Input Trigger: TIM_TS_ITR0 */
   TIM_SelectInputTrigger(TIMx, TIM_TS_ITR0);
   /* Select the slave Mode: Reset Mode */
   TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Reset);
   /* Enable the Master/Slave Mode */
   TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlaveMode_Enable);
   /* Enable the CC1 Interrupt Request */
   TIM_ITConfig(TIMx, TIM_IT_CC1, ENABLE);  //TIM_IT_CC1是TIM捕获/比较中断源
  TIM_ClearITPendingBit(TIM4, TIM_IT_CC1|TIM_IT_Update); 
   /* TIM enable counter */
   TIM_Cmd(TIMx, ENABLE);
}

void TIM4_IRQHandler()
{
 /* Clear TIM4 Capture compare interrupt pending bit */
 if (TIM_GetITStatus(TIM4, TIM_IT_CC1) != RESET)//????1·??ú????????
 {
  
  GPIO_WriteBit(GPIOB, GPIO_Pin_0, (BitAction)
   (1-GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0))); 
  }
   TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
}
 TIM_NVIC_Configuration(TIM4_IRQn,2,1);

避免犯错本是错误所在,我错故我在……
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-3-5 22:28:50 | 显示全部楼层
看不太懂你的代码,贴一段原子哥的程序吧

TIM5 通道一 的输入捕获的初始化程序:

//定时器5通道1输入捕获配置

void TIM5_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef  TIM5_ICInitStructure;

//步骤一:使能TIM5时钟和GPIOA时钟 配置PA0为 下拉输入
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能TIM5时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟

GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);

//步骤二:初始化定时器5,配置 自动重载值arr 和 分频数psc
TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 
TIM_TimeBaseStructure.TIM_Prescaler =psc;  //预分频器   
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//步骤三:设置TIM5的输入比较参数 开启输入捕获
TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01  选择输入端 IC1映射到TI1(通道1)上
   TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获
   TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
   TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //配置输入分频,不分频 
   TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
   TIM_ICInit(TIM5, &TIM5_ICInitStructure);

//步骤四:开启更新中断和捕获中断(共用一个中断函数),并设置中断分组
NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断

//步骤五:开启定时器
TIM_Cmd(TIM5,ENABLE );  //使能定时器5
}

需要用中断就打开中断 不需要用中断也可以忽略开启中断的语句

另外 可以利用下列语句
         if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) 判断捕获的发生 
        TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); 修改上升沿 下降沿捕获
         TIM_GetCapture1(TIM5);提取计数器的值


希望能帮到你
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
 楼主| 发表于 2014-3-6 09:51:30 | 显示全部楼层
回复【2楼】_tank_:
---------------------------------
多谢啦,,我的原因在于触发模式搞错了 TIM_SelectInputTrigger(TIM5,TIM_TS_ETRF);
我应该设置成外部触发模式才对。。。Thanks
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
 楼主| 发表于 2014-3-6 09:58:59 | 显示全部楼层
回复【2楼】_tank_:
---------------------------------
再请教一下,,这些内部触发0~3的触发模式指的是什么触发啊,还有最下面的那个边沿探测器又指的是什么???

 *     @arg TIM_TS_ITR0: Internal Trigger 0
  *     @arg TIM_TS_ITR1: Internal Trigger 1
  *     @arg TIM_TS_ITR2: Internal Trigger 2
  *     @arg TIM_TS_ITR3: Internal Trigger 3
  *     @arg TIM_TS_TI1F_ED: TI1 Edge Detector
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-3-6 11:38:04 | 显示全部楼层




TIRx 是在外部时钟1模式下 利用其它定时器作为预分频的时钟选择  具体的配置步骤在中文手册V10 中都有说明 自己可以看看 

我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

26

主题

467

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
876
金钱
876
注册时间
2013-10-3
在线时间
23 小时
 楼主| 发表于 2014-3-6 15:07:34 | 显示全部楼层
回复【5楼】_tank_:
---------------------------------
哦 好的,,非常非常感谢,Thanks……
避免犯错本是错误所在,我错故我在……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 02:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表