OpenEdv-开源电子网

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

STM8S003P6 外部中断 动作两次

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-1
在线时间
1 小时
发表于 2018-9-1 21:45:46 | 显示全部楼层 |阅读模式
1金钱
外部开关拨到地后,中断触发,但是LED_ON()函数在每一次触发后执行两次,另外开关断开后,LED_OFF()这个函数貌似没有执行的可能性,但是为什么也执行了两遍呢,百撕不得其解,小白求指教,谢谢。
main函数如下所示:
int main(void)
{     
        asm("sim");
        All_Congfig();

        asm("rim");
        __enable_interrupt();
        while (1)
        {   
                feed_dog( );
        }
}


按钮输入端口初始化如下:
void Buttom_Init(void)
{
        GPIO_Init(GPIOD,Buttom3,GPIO_MODE_IN_PU_IT);
        EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOD, EXTI_SENSITIVITY_FALL_ONLY);
}

中断触发后如下:
case EXTI_SENSITIVITY_FALL_ONLY :// Interrupt on Falling edge only
        if(GPIOD->IDR & (0x08))//外部开关断开后,执行关灯操作
        {
                delay_ms(500/10);//  消抖
                if(GPIOD->IDR & (0x08))
                {
                        LED_OFF();
                }
        }
        if(!(GPIOD->IDR & (0x08)))//外部开关接地后,执行开灯操作
        {
                delay_ms(500/10);//  消抖
                if(!(GPIOD->IDR & (0x08)))
                {
                        LED_ON();
                }
        }
        break;

最佳答案

查看完整内容[请看2#楼]

一) asm("rim"); 之前要先清PendingFlag, 中断后也要清 二)你是设置为EXTI_SENSITIVITY_FALL_ONLY(下降沿),当然断开不会给你中断了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2018-9-1 21:45:47 | 显示全部楼层
一) asm("rim"); 之前要先清PendingFlag, 中断后也要清
二)你是设置为EXTI_SENSITIVITY_FALL_ONLY(下降沿),当然断开不会给你中断了

回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-1
在线时间
1 小时
 楼主| 发表于 2018-9-2 07:31:07 来自手机 | 显示全部楼层
关于第二个问题,按照道理是不会有中断进来的,但实际是我测试的时候却进来了……如果改为上升下降沿触发中断却反而执行不了ledoff
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-1
在线时间
1 小时
 楼主| 发表于 2018-9-2 11:59:03 | 显示全部楼层
edmund1234 发表于 2018-9-1 21:45
一) asm("rim"); 之前要先清PendingFlag, 中断后也要清
二)你是设置为EXTI_SENSITIVITY_FALL_ONLY(下 ...

再请教一下
1。STM8S貌似没有中断标志位啊,怎么在手册里找不见?
2。按照道理按键松开后,是不会有中断进来的,但实际是我测试的时候却进来了……如果改为上升下降沿触发中断却反而执行不了ledoff
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2018-9-2 13:45:21 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-2 13:50 编辑
onetwo3 发表于 2018-9-2 11:59
再请教一下
1。STM8S貌似没有中断标志位啊,怎么在手册里找不见?
2。按照道理按键松开后,是不会有中 ...

是,stm8是没有中断标志位的
边沿触发中断, 与IO的状态没有必然的关糸,  因为响应中断需要时间, 下降沿触发中断, 到中断跳到中断处理程式里检查IO状态, 是有时间差, 这段时间IO的状态可以是有变化的
另外, 在中断里不应该用DELAY, 你的问题应该是DELAY引起的
一个下降沿触发了中断, 延迟了T_int(中断响应时间)检查了io的状态, 然后DELAY50ms, 在这50ms里, IO的状态有没改变? 又或者已经触发了另一次的下降沿中断? 因你用了DELAY而全都被忽略了, 又或者, DELAY50ms的头10ms, 有另一下降沿中断, 在你DEALY后, 退出中断时, 马上又进中断(这是响应40ms前的下降沿),这时你再检查IO的状态, 能以此判断什么沿触发的么?
对于mcu编程, DELAY不是个好东东, 戒之
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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