OpenEdv-开源电子网

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

关于定时器捕获输入问题,求大神进

[复制链接]

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-13 21:08:01 | 显示全部楼层 |阅读模式
5金钱
我已经测试过TIM5的输入捕获了,然后用TIM2的默认管脚也好使,但是用TIM2部分重映射以后就出错了,求解惑
[mw_shl_code=c,true]TIM_ICInitTypeDef TIM2_ICInitStructure; void TIM2_Cap_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能GPIOA时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //设置按键输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15 清除之前设置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA15 输入 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA,GPIO_Pin_15); //初始化定时器2 TIM2 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(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2输入捕获参数 TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上 TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获 TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上 TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波 TIM_ICInit(TIM2, &TIM2_ICInitStructure); //中断分组初始化 NVIC_InitStructure.NVIC_IRQChannel = TIM2_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(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断 TIM_Cmd(TIM2,ENABLE ); //使能定时器5 } #include "timer.h" //ALIENTEK战舰STM32开发板实验10 //输入捕获实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 //extern u8 TIM2CH1_CAPTURE_STA; //输入捕获状态 //extern u16 TIM2CH1_CAPTURE_VAL; //输入捕获值 int main(void) { u32 temp=0; delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600 LED_Init(); //LED端口初始化 // TIM3_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz //TIM3溢出时间Tout= ((arr+1)*(psc+1))/Tclk; 7200*1000/72M=0.1s //设置输出比较值3600,为7200的一半,故输出高电平为0.05s=50000us //TIM2默认通道1为GPIOA0,我们只需要将输出PWM的TIM3的GPIOB5和GPIOA0连接,GPIOB5将PWM输入GPIOA0输入捕获, //来测出高电平的时间 TIM3_PWM_Init(7199,999); TIM_SetCompare2(TIM3,3600); TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数,所以计数周期为1us。arr(auto reload register)=0XFFFF; //psc预分频值=71; while(1) { delay_ms(10); // TIM_SetCompare2(TIM3,TIM_GetCapture2(TIM3)+1); // 用捕获到的脉宽时间给TIM3设置比较值,来控制占空比 // if(TIM_GetCapture2(TIM3)==300)TIM_SetCompare2(TIM3,0);//捕获到300时给TIM3设置比较值为0 if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次上升沿 { temp=TIM2CH1_CAPTURE_STA&0X3F; //定时器计数溢出的次数 temp*=65536;//溢出时间总和,定时器溢出个数*定时器计数满的值 temp+=TIM2CH1_CAPTURE_VAL;//加上一个不够溢出的定时器计数时间,得到总的高电平时间 printf("HIGH:%d us\r\n",temp);//打印总的高电平时间,计数频率为1Mhz,计数周期为1us TIM2CH1_CAPTURE_STA=0;//开启下一次捕获,目的是为了清除第7位(捕获完成标志位) } } }[/mw_shl_code]
应该是50000us,但是串口显示是29us或者30us,我试着改变为 [mw_shl_code=c,true]TIM_SetCompare2(TIM3,1200);结果还是30us。要作为捕获通道要设置为浮空输入,原子哥设置为下拉也好使啊。 最后感谢大神帮助[/mw_shl_code]


愈挫愈勇
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

180

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
348
金钱
348
注册时间
2013-4-23
在线时间
25 小时
发表于 2014-5-13 21:52:39 | 显示全部楼层
一会TIM5一会TIM3一会TIM2,看着蛋真的疼了,楼主代码规整点可以不
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-13 22:29:46 | 显示全部楼层
回复【2楼】wobukansanguo:
---------------------------------
不是啊,是这个意思,可能是我表述的不好
我用TIM5可以捕获为50000us,显示在串口助手上。
用TIM2也可以捕获为50000us,显示在串口助手上。
以上都是用上面的代码,只是修改下定时器和GPIO口。
但是TIM2部分映射以后,将管脚A0映射到A15以后,也可以捕获,但是捕获结果出错了,结果为30us,不管怎么修改输出比较值,都是29-30us
求分析错误原因
愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-13 23:13:42 | 显示全部楼层
关闭JTAG先.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-13 23:20:23 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
好,我试试,谢谢原子哥
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-13 23:21:27 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,JTAG不是在PB3和4上吗?对输入捕获有影响吗
愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-13 23:26:39 | 显示全部楼层
你不是用PA15么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-13 23:28:36 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
JTAG不是在PB3和4上吗?对A15有什么影响呢,小弟是菜鸟,麻烦原子哥了
愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-13 23:30:24 | 显示全部楼层
回复【8楼】非常完美:
---------------------------------
你看看原理图的PA15先....看看是不是i还有什么JTDI之类的东东
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-13 23:37:38 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
好的,看到了,原子哥,麻烦你了,不是我懒,是我没有这个意识,非常感谢你
愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-14 09:51:08 | 显示全部楼层
[mw_shl_code=c,true] RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能GPIOA时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable ,ENABLE); //关闭SWJ 完全失能(JTAG+SW-DP) //设置按键输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15 清除之前设置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA15 输入 GPIO_Init(GPIOA, &GPIO_InitStructure);[/mw_shl_code] [mw_shl_code=c,true] [mw_shl_code=c,true]GPIO_ResetBits(GPIOA,GPIO_Pin_15);[/mw_shl_code]

[/mw_shl_code]


愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-14 09:52:12 | 显示全部楼层
[mw_shl_code=c,true] RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //使能GPIOA时钟 GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable ,ENABLE); //关闭SWJ 完全失能(JTAG+SW-DP) //设置按键输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //PA15 清除之前设置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //PA15 输入 GPIO_Init(GPIOA, &GPIO_InitStructure);[/mw_shl_code] [mw_shl_code=c,true] [mw_shl_code=c,true] GPIO_ResetBits(GPIOA,GPIO_Pin_15);[/mw_shl_code] [mw_shl_code=c,true] [/mw_shl_code] [mw_shl_code=c,true]

[/mw_shl_code] [/mw_shl_code]


愈挫愈勇
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-14 09:54:11 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥,代码改为
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIOA时钟
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);     //TIM2部分重映射1
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable ,ENABLE);     //SWJ 完全失能(JTAG+SW-DP)

结果还是30us.再次麻烦原子哥了,非常感谢
愈挫愈勇
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-15 00:18:32 | 显示全部楼层
回复【13楼】非常完美:
---------------------------------
这就不知道怎么回事了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
 楼主| 发表于 2014-5-15 08:41:49 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
恩,感谢原子哥
愈挫愈勇
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-22 15:06:45 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
参考手册写的输入捕获用 浮空输入,为什么例程里是下拉也可以呢?
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-23 00:21:18 | 显示全部楼层
回复【16楼】jiutianshenjian:
---------------------------------
 为什么不可以呢?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
发表于 2014-11-23 17:14:27 | 显示全部楼层
回复【16楼】jiutianshenjian:
---------------------------------
浮空——其实 只对 模拟输入 才是必须的。。。

上拉,下拉:其实 都几乎不影响 数字输入,
除非:你得上级驱动源 品质不好 。。。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-24 15:35:21 | 显示全部楼层
回复【17楼】正点原子:
---------------------------------
搞不懂。。。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-11-24 15:36:45 | 显示全部楼层
回复【18楼】caosix:
---------------------------------
不理解,浮空和模拟都是输入,怎么能说一个是对另一个必须的呢?
小小蜗牛
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
发表于 2014-11-25 15:47:15 | 显示全部楼层
回复【20楼】jiutianshenjian:
---------------------------------
我的 理解是——只有输入 模拟信号 才有必要 用‘浮空’。。

输入数字 信号,,用 上下拉 都 可以。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 20:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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