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

2019-08-17 02:37发布

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)的判断


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
正点原子
1楼-- · 2019-08-17 06:54
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-08-17 11:21
1,放while里面,当然不行了,这样你都没等待上升沿了...
2,软件仿真还是硬件仿真?
3,等待溢出确实有点歧义,等待上升沿比较好.当然也可能溢出了,还是没有上升沿到来...
jiajia
3楼-- · 2019-08-17 14:00
回复【2楼】正点原子:
---------------------------------
2.我硬件仿真,断点设置在循环里面,但是发现无论如何执行不到断点。另外发现KEIL没有TIM5定时器参数??
3.我感觉while()是否可以改成if()??因为我的理解是如果没有检测到上升沿,捕获标志位为0,因此while()会直接跳过;而检测到上升沿后根据手册描述在while()读捕获标志位后又会立刻清除标志位,所以while()也就只循环一次就退出了,不知道我的理解对吗???

另外,关于定时器计数,在定时计数从0计数到超过ARR中预设的0xffff时会自动从0重新开始计数吧??因此在循环语句中if的判断是不是存在漏洞?如果是,是不是在加入定时更新标志位判断更严谨一些??
正点原子
4楼-- · 2019-08-17 17:58
回复【3楼】jiajia:
---------------------------------
2,这里用错了一个函数,应该用:TIM_GetFlagStatus才对.
3,你测试下吧.
是否从0开始要看你的计数器模式,比如有中央对齐模式,加到arr再从arr减到0,那就不是突然变为0 了...
正点原子
5楼-- · 2019-08-17 22:19
不需要加更新标志.因为还没等他更新,我就退出了.
jiajia
6楼-- · 2019-08-17 22:53
 精彩回答 2  元偷偷看……

一周热门 更多>