OpenEdv-开源电子网

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

实验11 触摸按键输入

[复制链接]

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
发表于 2014-3-24 14:43:15 | 显示全部楼层 |阅读模式
原子哥你好
下面这个函数是否有点问题?
//得到定时器捕获值
//如果超时,则直接返回定时器的计数值.
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);  
}
主要是这句while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//等待溢出
应该改成while(TIM_GetITStatus(TIM5, TIM_IT_CC2)  == RESET)//等待溢出
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2013-12-27
在线时间
15 小时
发表于 2014-3-24 14:49:34 | 显示全部楼层
回复【楼主位】tuzihog:
---------------------------------
你把C语言里面while理解错了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-24 14:59:29 | 显示全部楼层
这里改为==貌似反而不能用哦。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
 楼主| 发表于 2014-3-24 15:06:40 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
改为==后程序功能是不能实现
但是从原理上分析应该是==才符合逻辑啊
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
 楼主| 发表于 2014-3-24 15:11:10 | 显示全部楼层
回复【2楼】zzz1223887687:
---------------------------------
下面是我的理解请指教:
TIM_GetITStatus(TIM5, TIM_IT_CC2)这个函数的功能是未捕获到上升沿返回RESET,捕获到上升沿返回SET吧?
这样的话while(TIM_GetITStatus(TIM5, TIM_IT_CC2)  == RESET)//等待溢出
未捕获到上升沿时,while死循环等待上升沿或者计数溢出,
捕获到上升沿后while不再成立,执行return TIM_GetCapture2(TIM5);返回捕获时的CNT值。
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
 楼主| 发表于 2014-3-24 15:16:41 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
http://www.openedv.com/posts/list/15966.htm
回复 支持 反对

使用道具 举报

9

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2012-2-16
在线时间
11 小时
 楼主| 发表于 2014-3-24 15:38:58 | 显示全部楼层
参照这个帖子看懂了怎么回事
http://www.openedv.com/posts/list/15966.htm
这里面主要是两个函数的使用区别:
TIM_GetITStatus()和TIM_GetFlagStatus()
还有就是设计思路
正确的写法应该是while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)//等待溢出
至于while(TIM_GetITStatus(TIM5, TIM_IT_CC2)  == RESET)//等待溢出    
不能工作的原因看一下TIM_GetITStatus()也就明白了。
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
发表于 2014-5-3 14:41:52 | 显示全部楼层
mark
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-5-15
在线时间
0 小时
发表于 2014-5-15 15:06:53 | 显示全部楼层
回复【2楼】zzz1223887687:
---------------------------------
没有理解错吧,while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)的意思是当TIM_GetITStatus的值为set时才执行循环体,reset时直接跳过,不是这样理解吗
回复 支持 反对

使用道具 举报

9

主题

26

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-7-29
在线时间
3 小时
发表于 2015-11-1 14:04:08 | 显示全部楼层
回复【7楼】tuzihog:
---------------------------------
为什么用TIM_GetITStatus()不行呢
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 18:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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