硬汉嵌入式论坛

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

[有问必答] 外部中断程序不太对劲

[复制链接]

4

主题

11

回帖

23

积分

新手上路

积分
23
发表于 2020-11-19 13:05:32 | 显示全部楼层 |阅读模式
萌新求问。我用V5开发板配置外部中断及NVIC,简单写了个中断程序,为啥main函数里边这样写的时候LED1不会亮?而且我观察在烧进程序的一刻LED是轻微一亮就灭了,而LED3、4正常亮

回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 13:06:49 | 显示全部楼层
/*中断服务函数8*/
void EXTI9_5_IRQHandler(void)
{
        delay_ms(10);//消抖
        if(KEY1 == 0)
        {
                LED2 =~ LED2;
        }
        EXTI_ClearITPendingBit(EXTI_Line8);
}
中断程序是这样


main里边部分是这样
        LED3 = 0;
        LED4 = 0;
       
        EXTIT_Init();
       
        LED1 = 0;
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 13:07:28 | 显示全部楼层
还有我按KEY1的时候没有反应诶
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-11-19 13:11:10 | 显示全部楼层
不说话装高手 发表于 2020-11-19 13:07
还有我按KEY1的时候没有反应诶

把中断里面做延迟这种骚错做先删掉。这是非常不规范的做法,严重影响系统实时性。
delay_ms(10);//消抖

参考我好多年前写的吧,标准库网盘
https://forum.anfulai.cn/forum.php?m ... 1285&extra=page%3D1

QQ截图20201119131336.png

回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 13:35:59 | 显示全部楼层
eric2013 发表于 2020-11-19 13:11
把中断里面做延迟这种骚错做先删掉。这是非常不规范的做法,严重影响系统实时性。
delay_ms(10);//消抖 ...

例程我也有,看起来很复杂诶

我试着删掉延迟,但还是没改变
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-11-19 13:54:16 | 显示全部楼层
不说话装高手 发表于 2020-11-19 13:35
例程我也有,看起来很复杂诶

我试着删掉延迟,但还是没改变

例子很简单的,哪里不理解问就行。
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 15:14:02
eric2013 发表于 2020-11-19 13:54
例子很简单的,哪里不理解问就行。

uint8_t bsp_GetKey(void)
{
        uint8_t ret;

        if (s_tKey.Read == s_tKey.Write)
        {
                return KEY_NONE;
        }
        else
        {
                ret = s_tKey.Buf[s_tKey.Read];

                if (++s_tKey.Read >= KEY_FIFO_SIZE)
                {
                        s_tKey.Read = 0;
                }
                return ret;
        }
}

请问这里返回值是怎么跟按键名称联系到一起的?

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 15:23:07
eric2013 发表于 2020-11-19 13:54
例子很简单的,哪里不理解问就行。

uint8_t bsp_GetKey(void)
{
        uint8_t ret;

        if (s_tKey.Read == s_tKey.Write)
        {
                return KEY_NONE;
        }
        else
        {
                ret = s_tKey.Buf[s_tKey.Read];

                if (++s_tKey.Read >= KEY_FIFO_SIZE)
                {
                        s_tKey.Read = 0;
                }
                return ret;
        }
}

您好,我是看不懂这里的返回值是如何跟键值联系的

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 15:24:53 | 显示全部楼层
uint8_t bsp_GetKey(void)
{
        uint8_t ret;

        if (s_tKey.Read == s_tKey.Write)
        {
                return KEY_NONE;
        }
        else
        {
                ret = s_tKey.Buf[s_tKey.Read];

                if (++s_tKey.Read >= KEY_FIFO_SIZE)
                {
                        s_tKey.Read = 0;
                }
                return ret;
        }
}

这里返回值看不懂怎么跟键值联系的?
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2020-11-19 15:56:48 | 显示全部楼层
不说话装高手 发表于 2020-11-19 15:24
uint8_t bsp_GetKey(void)
{
        uint8_t ret;

typedef struct
{
        /* 下面是一个函数指针,指向判断按键手否按下的函数 */
        uint8_t (*IsKeyDownFunc)(void); /* 按键按下的判断函数,1表示按下 */

        uint8_t  Count;                        /* 滤波器计数器 */
        uint16_t LongCount;                /* 长按计数器 */
        uint16_t LongTime;                /* 按键按下持续时间, 0表示不检测长按 */
        uint8_t  State;                        /* 按键当前状态(按下还是弹起) */
        uint8_t  RepeatSpeed;        /* 连续按键周期 */
        uint8_t  RepeatCount;        /* 连续按键计数器 */
}KEY_T;


/* 按键FIFO用到变量 */
#define KEY_FIFO_SIZE        10
typedef struct
{
        uint8_t Buf[KEY_FIFO_SIZE];                /* 键值缓冲区 */
        uint8_t Read;                                        /* 缓冲区读指针1 */
        uint8_t Write;                                        /* 缓冲区写指针 */
        uint8_t Read2;                                        /* 缓冲区读指针2 */
}KEY_FIFO_T;


static KEY_T s_tBtn[KEY_COUNT];
static KEY_FIFO_T s_tKey;                /* 按键FIFO变量,结构体 */
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-11-20 09:37:00 | 显示全部楼层
不说话装高手 发表于 2020-11-19 15:56
typedef struct
{
        /* 下面是一个函数指针,指向判断按键手否按下的函数 */

这里有对这个按键框架的深入讲解说明,学习下https://forum.anfulai.cn/forum.php?mod=viewthread&tid=93255

QQ截图20201120094030.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 15:21 , Processed in 0.050601 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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