OpenEdv-开源电子网

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

外部中断是否会影响主程序的运行?

[复制链接]

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-9-21
在线时间
18 小时
发表于 2016-9-21 09:37:28 | 显示全部楼层 |阅读模式
使用了原子哥外部中断的实验,主函数是这样的
printf("OK\n");
delay_ms(1000);          
当我连续按下外部中断时,发现串口打印时间远小于1s,不应该是大于1s钟吗?不知道是外部中断函数执行完是否回到原中的位置还是外部中断影响了原子哥delay_ms这个函数?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-9-21
在线时间
18 小时
 楼主| 发表于 2016-9-21 09:41:38 | 显示全部楼层
高手求助啊!想不通好蛋疼
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-9-21
在线时间
18 小时
 楼主| 发表于 2016-9-21 13:58:39 | 显示全部楼层
问题找到了,原来外部中断里面有10ms的延时,去掉就行了。我认为是程序运行在中断函数里面还没结束时,就再次进入中断导致程序混乱,不知道是不是这样的@原子哥
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-30
在线时间
8 小时
发表于 2016-9-22 09:00:17 | 显示全部楼层
不知道你具体程序是怎么写的,中断来到时按理说会中断正在执行的程序,转去执行中断服务函数,当中断服务函数执行完毕以后转过来继续执行被打断的程序,加上中断服务函数中的延时,打印时间应该是大于1S。
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-30
在线时间
8 小时
发表于 2016-9-22 09:01:29 | 显示全部楼层
1062517745 发表于 2016-9-21 13:58
问题找到了,原来外部中断里面有10ms的延时,去掉就行了。我认为是程序运行在中断函数里面还没结束时,就再 ...

怎么导致混乱?
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-9-21
在线时间
18 小时
 楼主| 发表于 2016-10-25 08:55:29 | 显示全部楼层

我认为是定时器中断函数运行时间过长导致的,这次的中断函数还没执行完,下次的中断就来了。不知道是不是这个意思
回复 支持 反对

使用道具 举报

7

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-10-21
在线时间
43 小时
发表于 2016-10-25 11:22:01 | 显示全部楼层

在主程中调用了delay_ms();在中断中又调用了delay_ms();
主程中运营delay_ms时,如果产生中断,中断中的delay_ms()会强行修改延时函数的参数,结果就是退出中断时,主程序的delay_ms函数也会结束,所以按下键时,会紧跟出打印数据。
回复 支持 反对

使用道具 举报

7

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
325
金钱
325
注册时间
2016-10-21
在线时间
43 小时
发表于 2016-10-25 11:30:13 | 显示全部楼层
在主程中调用了delay_ms();在中断中又调用了delay_ms();
主程中运营delay_ms时,如果产生中断,中断中的delay_ms()会强行修改延时函数的参数,结果就是退出中断时,主程序的delay_ms函数也会结束,所以按下键时,会紧跟出打印数据。

看看下面代码,分析一下,你就明白。
void delay_ms(u16 nms)
{                                     
        u32 temp;                  
        SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;           //清空计数器
        SysTick->CTRL=0x01 ;          //开始倒数  
        do
        {
                temp=SysTick->CTRL;
        }
        while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达   
        SysTick->CTRL=0x00;       //关闭计数器
        SysTick->VAL =0X00;       //清空计数器                      
}

中断产生时,会重置计数器:
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
        SysTick->VAL =0x00;           //清空计数器
        SysTick->CTRL=0x01 ;          //开始倒数  
中断的延时函数结束时,会关闭计数器:
SysTick->CTRL=0x00;       //关闭计数器
中断结束后,会进入主程序的延时函数,此时SysTick->CTRL为0,而延时循环体:
do
        {
                temp=SysTick->CTRL;
        }
        while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达   
temp读数据为0,肯定跳出循环,所以主程序的延时会在产生中断后马上退出,所以时间为小于1S.
回复 支持 反对

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-10-25 11:35:11 | 显示全部楼层
中断服务函数,加延时. 这不是 加塞吗?
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2016-9-21
在线时间
18 小时
 楼主| 发表于 2016-10-27 08:57:33 | 显示全部楼层
ldskendy 发表于 2016-10-25 11:30
在主程中调用了delay_ms();在中断中又调用了delay_ms();
主程中运营delay_ms时,如果产生中断,中断中的de ...

谢谢啦!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 11:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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