OpenEdv-开源电子网

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

运用库函数配置的定时器 输入捕获 配置

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-7-25
在线时间
0 小时
发表于 2014-7-25 21:44:19 | 显示全部楼层 |阅读模式
5金钱
void TIM_ICAPConfiguration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef  TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);


/* TIM2 channel 2 pin (PA.01) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    TIM_DeInit(TIM2);
  TIM_InternalClockConfig(TIM2);
  TIM_TimeBaseStructure.TIM_Prescaler = 35999;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = 1999;
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  TIM_ARRPreloadConfig(TIM2, DISABLE);

TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;    
TIM_ICInitStructure.TIM_ICFilter = 0x0;       /*选择输入比较滤波器,滤波设置,经历几个周期跳变认定波形稳定0x0~0xF*/
TIM_ICInit(TIM2, &TIM_ICInitStructure);

TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);                 //根据参数配置TIM外设信息
    TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);                //选择IC2为始终触发源
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发


//开启TIM2的中断
  TIM_ClearFlag(TIM2, TIM_IT_CC2);
  TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
 
  TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设

}
以上为定时器的配置
void TIM2_IRQHandler(void)
{
 TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);                //清楚TIM的中断待处理位
 IC2Value = TIM_GetCapture2(TIM2);                         //读取IC2捕获寄存器的值,即为PWM周期的计数值
 if (IC2Value != 0)
 { 
 // DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;         //读取IC1捕获寄存器的值,并计算占空比  
   Frequency = 72000000 / IC2Value;                                          //计算PWM频率。
 }
 else
 {
 //  DutyCycle = 0;
   Frequency = 0;
 }
}
以上为中断服务函数

将PA.1脚接到信号发生器上,输入一个30KHZ的方波,通过串口看到的数据会有错误
这是为什么?

QQ截图20140816214356.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-25 23:13:04 | 显示全部楼层
基本上正确,只是偶尔出错.看看其他地方有没有对输入捕获进行再配置?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-7-25 23:13:56 | 显示全部楼层
另外,貌似你没对定时器溢出做处理.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2014-7-25
在线时间
0 小时
 楼主| 发表于 2014-7-26 09:57:13 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
好,我再看看、多谢原子哥
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-4 21:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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