OpenEdv-开源电子网

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

关于电容触摸按键实验问题

[复制链接]

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
发表于 2014-5-3 15:14:25 | 显示全部楼层 |阅读模式
1.寄存器版本
u16 TPAD_Get_Val(void)
{   
TPAD_Reset();
while((TIM5->SR&0X04)==0)//等待捕获上升沿
  {
  if(TIM5->CNT>TPAD_ARR_MAX_VAL-500)
 return TIM5->CNT;//超时了,直接返回CNT的值

 };
return TIM5->CCR2;  

-------------------------------------------
2.库函数版本

u16 TPAD_Get_Val(void)
{       
 TPAD_Reset();
 while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)//等待溢出( 或用TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)代替)
   {
     if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)
    return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值
    };
  return TIM_GetCapture2(TIM5);   
}
-------------------------------------------------
我的问题是
1)既然TIM_GetITStatus()和TIM_GetFlagStatus()的主要区别在于有没有判断是否使能中断,其他都一样 
那为什么一个是TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET 
              一个是TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET?

2)我感觉要改成这样
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);
  但为什么不可以

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

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-3 15:59:00 | 显示全部楼层
回复【2楼】chengmingluo:
---------------------------------
怎么没人。。
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-3 16:01:33 | 显示全部楼层
@正点原子
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-3 16:01:42 | 显示全部楼层
回复【楼主位】chengmingluo:
---------------------------------
1,可以去看这两个函数内部的实现方式,就是看寄存器,然后找《stm32参考手册》,寄存器的对比。
2,可以自己测试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-3 16:25:03 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
1)一个是有检查DIER是否使能 一个没有,但读取SR的状态是一样的,但我觉得好像实现的方式一样,就是不知道为什么一个是等于,一个是不等于
2)不可以,不知道为什么
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 09:33:52 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
1.看了手册,TIM_GetITStatus()是同时检验SR和DIER的(但是程序中没有使能中断,那么这个while判断不是为0?)
               TIM_GetFlagStatus()只检验SR
2.如果我用寄存器版本的话,while((TIM5->SR&0X02)==0)是否和while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)等价?
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 11:10:44 | 显示全部楼层
求教
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-4 11:18:42 | 显示全部楼层
回复【7楼】 chengmingluo :
---------------------------------
[mw_shl_code=c,true]FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG) { ITStatus bitstatus = RESET; /* Check the parameters */ assert_param(IS_TIM_ALL_PERIPH(TIMx)); assert_param(IS_TIM_GET_FLAG(TIM_FLAG)); if ((TIMx->SR & TIM_FLAG) != (uint16_t)RESET) { bitstatus = SET; } else { bitstatus = RESET; } return bitstatus; }[/mw_shl_code]


 
 
TIM_GetFlagStatus函数的实现,注意, 
 
TIMx->SR & TIM_FLAG的返回值,等于RESET的时候,说明:
TIMx->SR & TIM_FLAG ==0

在tpad.c里面


[mw_shl_code=c,true]//得到定时器捕获值 //如果超时,则直接返回定时器的计数值. u16 TPAD_Get_Val(void) { TPAD_Reset(); while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)//等待捕获上升沿 { if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值 }; return TIM_GetCapture2(TIM5); } [/mw_shl_code]


替换一下,不难理解,这就是判断:
TIMx->SR & TIM_FLAG ==0
再看寄存器代码:



[mw_shl_code=c,true]u16 TPAD_Get_Val(void) { TPAD_Reset(); while((TIM5->SR&0X04)==0)//等待捕获上升沿 { if(TIM5->CNT>TPAD_ARR_MAX_VAL-500)return TIM5->CNT;//超时了,直接返回CNT的值 }; return TIM5->CCR2; } [/mw_shl_code]


这不是一个意思么?


简单的问题,看你纠结了几天,我也真心纠结。。。。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2013-10-7
在线时间
5 小时
发表于 2014-5-4 11:59:59 | 显示全部楼层
你考虑过。四个独立的触摸按键挂在一个定时器上怎么工作?
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 15:52:44 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
谢谢原子的耐心回答

在TIM_GetITStatus中
 
  itstatus = TIMx->SR & TIM_IT;
  itenable = TIMx->DIER & TIM_IT;

 if ((itstatus != (uint16_t)RESET) && (itenable != (uint16_t)RESET))
  {bitstatus = SET;}
 else
  {bitstatus = RESET;}
  ------------------------
为什么我在实验中看不到操作TIMx->DIER的函数呢,我查找过只有TIM_ITConfig(),TIM_DMACmd()才操作DIER,但在实验中都没有这两个函数
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 16:03:27 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
就是说
while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET)
等价于
while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) != SET)
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 23:12:48 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
原子哥 
那么 while(TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET)
这句的寄存器版本是
while(((TIM5->SR&0X04)!=RESET)&&((TIM5->DIER&0x04)!=RESET)!=RESET)吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-4 23:13:56 | 显示全部楼层
回复【12楼】chengmingluo:
---------------------------------
你这要是等价,写这个函数的人就可以跳楼了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-4 23:14:22 | 显示全部楼层
回复【13楼】chengmingluo:
---------------------------------
你自己写代码慢慢测试吧,我该说的都说完了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 23:18:33 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
那怎么才是等价
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 23:24:37 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
是不是改成while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) != 0x04)
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-4 23:26:27 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
这里我看错了,不好意思.

就是说 
while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) == RESET) 
等价于 
while(TIM_GetFlagStatus(TIM5, TIM_IT_CC2) != SET)

是正确的
我看丢了!,sorry.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 23:38:25 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
哦哦。
再问一个问题,
如果用TIM_GetITStatus,那要开启TIMx->DIER寄存器,
那为什么我在实验中看不到操作TIMx->DIER的函数呢,我查找过只有TIM_ITConfig(),TIM_DMACmd()才操作DIER,但在实验中都没有这两个函数
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-4 23:49:54 | 显示全部楼层
回复【19楼】chengmingluo:
---------------------------------
没用到中断,所以不需要开启
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-4 23:58:06 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
那么在TIM_GetITStatus中 

 itenable = TIMx->DIER & TIM_IT(这个不是等于0了?)

 那这个函数的返回值就一定是RESET了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-5 16:35:53 | 显示全部楼层
回复【21楼】chengmingluo:
---------------------------------
多写代码测试吧
纸上谈兵谈了几天了,呵呵.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

87

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-4-2
在线时间
0 小时
 楼主| 发表于 2014-5-5 17:03:10 | 显示全部楼层
回复【22楼】正点原子:
---------------------------------
主要是不太会调试。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-5-5 17:19:01 | 显示全部楼层
回复【23楼】chengmingluo:
---------------------------------
任何东西都是由不会-->会的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-4-11
在线时间
0 小时
发表于 2015-4-11 15:58:44 | 显示全部楼层
回复【18楼】正点原子:
---------------------------------
原子哥:
    我今天看到这个帖子了,觉得这两个函数是像你第一次说的:不能等同。SET=1,第一:要是输入捕获中断位置1,读回来的结果是不等于1的;第二:如果输入捕获中断没有置1,也就是0,那么这个语句也是成立的,希望我没有理解错,谢谢大家。
我是个蒸不烂、煮不熟、捶不匾、炒不爆、响珰珰一粒铜豌豆.
回复 支持 反对

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-4-27 13:18:30 | 显示全部楼层
正点原子 发表于 2014-5-3 16:01
回复【楼主位】chengmingluo:
---------------------------------
1,可以去看这两个函数内部的实现方式, ...

原子哥,是不是这个地方用TIM_GetITStatus(TIM5, TIM_IT_CC2) != RESET这个函数就不对把,因为没开中断,他永远都没有等待到上升沿,所以把return TIM_GetCapture2(TIM5)放在while循环里面就永远没有返回值,但是为什么用这个函数却还好使呢?不是应该进入这个函数就直接返回return TIM_GetCapture2(TIM5)了么?
回复 支持 反对

使用道具 举报

7

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
200
金钱
200
注册时间
2016-4-27
在线时间
29 小时
发表于 2016-4-27 16:10:54 | 显示全部楼层
chengmingluo 发表于 2014-5-4 23:58
回复【20楼】正点原子:
---------------------------------
那么在TIM_GetITStatus中 

 itenabl ...

你可以把这个while删掉试试,程序一样好使,所以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); 当有上升沿的时候,自动读取。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2018-9-1
在线时间
4 小时
发表于 2018-9-27 22:45:50 | 显示全部楼层
顶一下,我在电容触摸这里也遇到了问题,输入捕获实验例程中打开了捕获中断,而在下一章的电容触摸实验中却没有使能中断,很纳闷,现在在这个帖子中找到了答案,原来是两条不一样的语句
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2018-9-1
在线时间
4 小时
发表于 2018-9-27 22:50:18 | 显示全部楼层
萝卜啊哈哈哈 发表于 2018-9-27 22:45
顶一下,我在电容触摸这里也遇到了问题,输入捕获实验例程中打开了捕获中断,而在下一章的电容触摸实验中却 ...

怎么删除
回复 支持 反对

使用道具 举报

3

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2020-12-23
在线时间
13 小时
发表于 2020-12-29 10:31:01 | 显示全部楼层
if(TIM_GetCounter(TIM5)>TPAD_ARR_MAX_VAL-500)return TIM_GetCounter(TIM5);//超时了,直接返回CNT的值
为什么>TPAD_ARR_MAX_VAL-500,这个值是自己设定的吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-24 13:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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