硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3131|回复: 11
收起左侧

[有问必答] 新手求助!关于例程中的外部中断

[复制链接]

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2018-9-26 10:22:45 | 显示全部楼层 |阅读模式
在例程“V5-002a_EXIT实验_外部硬件中断”中,主函数里通过                ucKeyCode = bsp_GetKey();        /* ¶á衼üÖμ, ÎT¼ü°′ÏÂê±·μ»Ø KEY_NONE = 0 */
来读取键值,进入bsp_GetKey();函数中,有一句
         if (s_tKey.Read == s_tKey.Write)
         。。。。
        else
        。。。。。
这里的s_tKey.Read和s_tKey.Write的值,是在哪个函数里面进行修改的呢?

本人菜鸟,看了几天例程了,但是还是找不到,请各位赐教!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-26 11:00:25 | 显示全部楼层
函数bsp_KeyScan
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-9-26 11:10:44 | 显示全部楼层

bsp_KeyScan()里面调用
    bsp_DetectKey(),
可是bsp_DetectKey()操作的是
    pBtn = &s_tBtn;
并没有对s_tKey操作啊。。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-26 11:16:41 | 显示全部楼层
QQ截图20180926111621.png
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-9-26 12:02:57 | 显示全部楼层

哦哦,看到了。
再问一下,这个bsp_KeyScan()注释里写着:“被systick中断周期性的调用”,应该是指SysTick_ISR()函数吧(因为里面有bsp_RunPer10ms()这一句)。SysTick_ISR()又是被SysTick_Handler()调用,也就是说,这个顺序是:
SysTick_Handler → SysTick_ISR() → bsp_RunPer10ms() → bsp_KeyScan() → bsp_DetectKey() → bsp_PutKey()→s_tKey这样的顺序。
我想问的是,这一顺序的开头,SysTick_Handler ,注释里写着“启动文件中引用”,这个是在哪边引用的呢?我就是想找到这个例程功能的源头。我就是猜想,在底层应该有一个类似于把中断服务号(或者说这个SysTick_Handler函数名)添加进去的过程吧。
不知道您有没有看懂我的意思。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-26 12:05:42 | 显示全部楼层
红烧鱼头 发表于 2018-9-26 12:02
哦哦,看到了。
再问一下,这个bsp_KeyScan()注释里写着:“被systick中断周期性的调用”,应该是指SysT ...

XXX.S启动文件里面。

也就是中断向量表。
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-9-28 13:13:02 | 显示全部楼层
本帖最后由 红烧鱼头 于 2018-9-28 13:20 编辑

还是这个例程,在static void bsp_DetectKey(uint8_t i)函数中,
        KEY_T *pBtn;
        pBtn = &s_tBtn;
        if (pBtn->IsKeyDownFunc())
        {
                if (pBtn->Count < KEY_FILTER_TIME)
                {
                        pBtn->Count = KEY_FILTER_TIME;
                }
                else if(pBtn->Count < 2 * KEY_FILTER_TIME)
                {
                        pBtn->Count++;
                }
这个语句的功能就是让pBtn->Count在0,5-9之间循环。
第一次进入函数,pBtn->Count值是0,满足条件 (pBtn->Count < KEY_FILTER_TIME),则赋值为5(KEY_FILTER_TIME);
第二次进入函数,pBtn->Count值是5,满足条件(pBtn->Count < 2 * KEY_FILTER_TIME),则自加1,变为6;
第三次进入函数,pBtn->Count值是6,满足条件(pBtn->Count < 2 * KEY_FILTER_TIME),则自加1,变为7;
第四次进入函数,pBtn->Count值是7,满足条件(pBtn->Count < 2 * KEY_FILTER_TIME),则自加1,变为8;
第五次进入函数,pBtn->Count值是8,满足条件(pBtn->Count < 2 * KEY_FILTER_TIME),则自加1,变为9;
第六次进入函数,pBtn->Count值是9,满足条件(pBtn->Count < 2 * KEY_FILTER_TIME),则自加1,变为10;
第七次进入函数,pBtn->Count值是10,不满足条件,则值不变,修改按键状态、发送按键信息。

这样算来,算上按下按钮到进入函数也需要0-10ms,滤波时间应该是60-70ms,而不是注释里写的50ms。是这样吗?
还有,为什么不直接用
                if(pBtn->Count < KEY_FILTER_TIME)
                {
                        pBtn->Count++;
                }
KEY_FILTER_TIME可以设置成6,而要用更复杂的写法?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-28 15:03:23 | 显示全部楼层
红烧鱼头 发表于 2018-9-28 13:13
还是这个例程,在static void bsp_DetectKey(uint8_t i)函数中,
        KEY_T *pBtn;
        pBtn = & ...

你学的很认真

因为此函数后面还有一个松手检测。要继续用到 KEY_FILTER_TIME,所以就搞了个 KEY_FILTER_TIME和2* KEY_FILTER_TIME
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-9-28 15:37:23 | 显示全部楼层
eric2013 发表于 2018-9-28 15:03
你学的很认真

因为此函数后面还有一个松手检测。要继续用到 KEY_FILTER_TIME,所以就搞了个 KEY_ ...

我似乎明白了,为了让按下(累加)和松开(累减)的时间一样,就要循环同样的次数。在pBtn->Count大于KEY_FILTER_TIME的情况下,看不出效果;如果pBtn->Count 小于 KEY_FILTER_TIME,那么滤波时间就会短于设定的50ms(其实根据我上面的推演,应该是60-70ms吧?),这个时候要是手抖了一下,可能就被误判为松手了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-29 10:24:44 | 显示全部楼层
红烧鱼头 发表于 2018-9-28 15:37
我似乎明白了,为了让按下(累加)和松开(累减)的时间一样,就要循环同样的次数。在pBtn->Count大于KEY ...

不会有松手误触发,因为有个pBtn->State限制。

回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2018-9-29 14:02:56 | 显示全部楼层
eric2013 发表于 2018-9-29 10:24
不会有松手误触发,因为有个pBtn->State限制。

嗯嗯。
这个滤波时间其实就是延时消抖吧?好像一般就是延时10ms,这边延时了60-70ms,为什么搞这么长呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2018-9-30 00:27:14 | 显示全部楼层
红烧鱼头 发表于 2018-9-29 14:02
嗯嗯。
这个滤波时间其实就是延时消抖吧?好像一般就是延时10ms,这边延时了60-70ms,为什么搞这么长呢 ...

以我们打游戏为例,顶级的游戏玩家,APM能够搞到400+,按照这个速度就是每秒7-8下,所以60-70绰绰有余。

普通人也就3-5下。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 03:04 , Processed in 0.245169 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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