OpenEdv-开源电子网

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

战舰开发板电容触摸按键程序中的捕获问题

[复制链接]

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-5-23
在线时间
5 小时
发表于 2013-5-23 19:00:27 | 显示全部楼层 |阅读模式
u16 TPAD_Get_Val(void)
{   
TPAD_Reset();
while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//等待溢出
{
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值
};
return TIM_GetCapture2(TIM5);  


如上,把 return TIM_GetCapture2(TIM5);放在循环里面怎么就不行了呢??,通过仿真验证 TIM_GetITStatus(TIM5, TIM_IT_CC2) 一直为reset所以一直进不去,但是为什么会一直为RESET呢??
另外,还有一个问题上面所说的“等待溢出”不是太明白,应该是等待上升沿到来吧??根据手册检测到捕获标志位后读取标志位会清零标志位,所以while()语句实际上只运行一次


我对 while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET) 的理解是:检测到上升沿后清除捕获标志,并进入if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)的判断



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

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-5-23
在线时间
5 小时
 楼主| 发表于 2013-5-24 11:29:09 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
还是无法进入,改正语句:while(TIM_GetFlagStatus(TIM5, TIM_FLAG_CC2) != RESET),另外额外的问一下TIM_GetFlagStatus函数也会自动清除标志位吧?

按照你的设计思路认为while()语句有错误,应该改为while(**** == RESET),这样在上升沿未到时一直死循环等待上升沿到来,如果死循环持续时间超过定时器更新标志位到来时间,则退出死循环
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-24 21:27:01 | 显示全部楼层
是的,要改为==才可以,见下图:





TIM_GetFlagStatus有没有清标志之类的问题,不要问,直接进入这个函数看寄存器操作就知道了
结果告诉你,是没清的.
这里是等待捕获,一旦有捕获,那么CC2置位,那么就会退出死循环,何来一直死循环之说?
这里直到最后都没清标记,但是请你看看TPAD_RESET函数,里面做了什么...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-23 23:52:54 | 显示全部楼层
1,放while里面,当然不行了,这样你都没等待上升沿了...
2,软件仿真还是硬件仿真?
3,等待溢出确实有点歧义,等待上升沿比较好.当然也可能溢出了,还是没有上升沿到来...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-5-23
在线时间
5 小时
 楼主| 发表于 2013-5-24 09:25:44 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
2.我硬件仿真,断点设置在循环里面,但是发现无论如何执行不到断点。另外发现KEIL没有TIM5定时器参数??
3.我感觉while()是否可以改成if()??因为我的理解是如果没有检测到上升沿,捕获标志位为0,因此while()会直接跳过;而检测到上升沿后根据手册描述在while()读捕获标志位后又会立刻清除标志位,所以while()也就只循环一次就退出了,不知道我的理解对吗???

另外,关于定时器计数,在定时计数从0计数到超过ARR中预设的0xffff时会自动从0重新开始计数吧??因此在循环语句中if的判断是不是存在漏洞?如果是,是不是在加入定时更新标志位判断更严谨一些??
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-24 10:12:31 | 显示全部楼层
回复【3楼】jiajia:
---------------------------------
2,这里用错了一个函数,应该用:TIM_GetFlagStatus才对.
3,你测试下吧.
是否从0开始要看你的计数器模式,比如有中央对齐模式,加到arr再从arr减到0,那就不是突然变为0 了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-5-24 10:13:06 | 显示全部楼层
不需要加更新标志.因为还没等他更新,我就退出了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-5-23
在线时间
5 小时
 楼主| 发表于 2013-5-24 11:33:20 | 显示全部楼层
如果TIM_GetFlagStatus函数针对捕获标志位无法自动清除,那么还应在循环中加入TIM_ClearFlag()吧,否则它岂不是一直死循环下去?
回复 支持 反对

使用道具 举报

7

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-5-23
在线时间
5 小时
 楼主| 发表于 2013-5-27 08:57:28 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
明白了,非常感谢正点原子的解答!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-6-18
在线时间
0 小时
发表于 2013-6-18 00:29:34 | 显示全部楼层
记录下来!谢谢!
回复 支持 反对

使用道具 举报

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
发表于 2013-11-19 15:43:25 | 显示全部楼层
回复【4楼】正点原子:
回复【3楼】jiajia: --------------------------------- 2,这里用错了一个函数,应该用:TIM_GetFlagStatus才对. 3,你测试下吧. 是否从0开始要看你的计数器模式,比如有中央对齐模式,加到arr再从arr减到0,那就不是突然变为0 了...
---------------------------------

TIM_GetFlagStatus和TIM_GetITStatus在这的作用相同吧,都是检测是否发生了捕获中断(是否捕获到了上升沿的标志位)
回复 支持 反对

使用道具 举报

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
发表于 2013-11-19 16:58:48 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
针对改后的程序提出以下两点,望解惑
1:while(TIM_GetFlagStatus(TIM5, TIM_FLAG_CC2) == RESET),是不是应该这样解释:CC2捕获标记为0,需要判断一下是不是因为超时了。那么超时后TPAD_Get_Val()函数得到的返回值是return TIM_GetCounter(TIM5);有何意义呢?

2:在return TIM_GetCapture2(TIM5);是不是应该前面加一个标志位的判断,也就是说只有在CC2的标志位置1后返回的值才是有意义的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-19 17:29:54 | 显示全部楼层
回复【12楼】E-angel:
---------------------------------
我不用库函数。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

34

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2013-9-9
在线时间
0 小时
发表于 2013-11-20 23:07:56 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
今天回来拿板子照你那样改了while(TIM_GetITStatus(TIM5, TIM_IT_CC2) == RESET) 触摸没有反应了(绿灯不亮),红灯闪烁的频率不对了,硬件仿真中。。。
回复 支持 反对

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2014-2-19
在线时间
0 小时
发表于 2014-2-21 22:15:01 | 显示全部楼层
回复【12楼】E-angel:
---------------------------------
说实话那个地方我也不理解,可不可以解释下
一代龙影-KPL
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2014-3-24 15:44:43 | 显示全部楼层
标注一下。
有兴趣的可以参考这个链接:http://www.openedv.com/posts/list/29022.htm
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
发表于 2014-5-3 10:27:55 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
请问究竟是"==reset"还是"!=reset"呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-3 15:48:07 | 显示全部楼层
==reset
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2017-7-5
在线时间
4 小时
发表于 2017-7-7 21:30:16 | 显示全部楼层
解疑答惑啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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