OpenEdv-开源电子网

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

参考原子哥stm32f407写的一个按键中断程序,每个中断里面亮灯0.5秒左右,为什么进中断之后就不能返回主函数了?

[复制链接]

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
发表于 2016-8-25 21:37:03 | 显示全部楼层 |阅读模式
12金钱
为什么每次都能进入中断,但是中断执行完之后就不再进行主函数的程序了呢?

最佳答案

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

你在5-9的中断线里面清楚0的中断标记是什么鬼???? 10-15清楚2的,0的清楚中断3的,你在逗我么
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-25 21:37:04 | 显示全部楼层
你在5-9的中断线里面清楚0的中断标记是什么鬼????
10-15清楚2的,0的清楚中断3的,你在逗我么
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-25 21:41:19 | 显示全部楼层
求大神指点一下,最近看中断感觉看的差不多了,可一看程序还是遇到了很多问题,不明白stm32是不是自动处理好了保护现场,中断返回等内容。每次中断执行完之后就不动了,百思不得其解
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-8-26 08:00:52 | 显示全部楼层
你中断里面是不是嵌套延时了

延时是不是用的一个低优先级的中断做的

高优先级嵌套低优先级的问题

一直等不到延时的返回。一直停留在中断里了
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-26 09:15:56 | 显示全部楼层
本帖最后由 hanxinfeng11 于 2016-8-26 09:20 编辑
止天 发表于 2016-8-26 08:00
你中断里面是不是嵌套延时了

延时是不是用的一个低优先级的中断做的

是用时延了,但是时延是用软件延时来写的,时延也就1秒钟,为什么等不到时延返回 呢?
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2016-8-26 09:19:29 | 显示全部楼层
用jink看看程序跑哪去了
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-26 09:40:54 | 显示全部楼层
shikihane 发表于 2016-8-26 09:19
用jink看看程序跑哪去了

新手一枚,不知道如何用jlink调试带中断的程序。百度了一下,感觉一时半会弄不好,只想根据现象来推测一些程序中的问题。
回复

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2016-8-12
在线时间
86 小时
发表于 2016-8-26 10:05:43 | 显示全部楼层
要看触发条件 触发中断和返回主函数执行
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-26 11:24:43 | 显示全部楼层
wenqian 发表于 2016-8-26 10:05
要看触发条件 触发中断和返回主函数执行

触发条件就是按键引起下降沿触发,中断函数就是先清除中断标志位,然后灯亮延时一段时间。执行完中断函数之后却不自动返回主函数执行,这是为什么呢?
回复

使用道具 举报

4

主题

38

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
339
金钱
339
注册时间
2016-8-12
在线时间
86 小时
发表于 2016-8-26 11:29:46 | 显示全部楼层
hanxinfeng11 发表于 2016-8-26 11:24
触发条件就是按键引起下降沿触发,中断函数就是先清除中断标志位,然后灯亮延时一段时间。执行完中断函数 ...

你把程序发出来 我看下
回复

使用道具 举报

4

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2016-8-26
在线时间
31 小时
发表于 2016-8-26 14:01:21 | 显示全部楼层
你在中断里亮灯,点亮后,立即退出终端,不要在里面延时,在外面延时0.5秒,然后灭灯。。。。。。
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-26 19:10:05 | 显示全部楼层
guoqingli1123 发表于 2016-8-26 14:01
你在中断里亮灯,点亮后,立即退出终端,不要在里面延时,在外面延时0.5秒,然后灭灯。。。。。。

我试过这个,这个也是无法返回主函数了
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-26 19:21:10 | 显示全部楼层
本帖最后由 hanxinfeng11 于 2016-8-26 19:24 编辑
wenqian 发表于 2016-8-26 11:29
你把程序发出来 我看下

static void Delay_ARMJISHU(__IO uint32_t nCount)
{
  for (; nCount != 0; nCount--){}
}

/////////////////////////////////////////////////////////////////////////
//外部中断5服务程序
void EXTI9_5_IRQHandler(void)
{
        
         EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
                Led_Turn_off_all();
                Delay_ARMJISHU(60000);
                if(ReadKeyDown()!=NOKEY )
                {
                        Led_Turn_on(ReadKeyDown()-1);
            Delay_ARMJISHU(0xF00000);
                }
                        
        
}        
//外部中断11he13服务程序
void EXTI15_10_IRQHandler(void)
{
        
         EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE2上的中断标志位
          Led_Turn_off_all();
                Delay_ARMJISHU(60000);
                if(ReadKeyDown()!=NOKEY )
                {
                        Led_Turn_on(ReadKeyDown()-1);
            Delay_ARMJISHU(0xF00000);
                }                 
        
}
//外部中断0服务程序
void EXTI0_IRQHandler(void)
{
        
        EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位
          Led_Turn_off_all();
                Delay_ARMJISHU(60000);
                if(ReadKeyDown()!=NOKEY )
                {
                        Led_Turn_on(ReadKeyDown()-1);
            Delay_ARMJISHU(0xF00000);
                }
         
}
//外部中断4服务程序
           
//外部中断初始化程序
//初始化PE2~4,PA0为中断输入.
void EXTIX_Init(void)
{
        NVIC_InitTypeDef   NVIC_InitStructure;
        EXTI_InitTypeDef   EXTI_InitStructure;        
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        
        GPIO_KEY_Config(); //按键对应的IO口初始化

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
        

        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource5);//PA5 连接到中断线5
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource11);//PF11 连接到中断线11
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource13);//PC13 连接到中断线13
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0
        
        /* 配置EXTI_Line5*/
        EXTI_InitStructure.EXTI_Line = EXTI_Line5;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置
        /* 配置EXTI_Line11*/        
                EXTI_InitStructure.EXTI_Line = EXTI_Line11;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置
        /* 配置EXTI_Line13*/
                EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置
        /* 配置EXTI_Line0*/
                EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
  EXTI_Init(&EXTI_InitStructure);//配置

        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;//外部中断5
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;//外部中断11he13
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
               
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);//配置
           
}
/////////////////////////////////////////////////////////////////////////


int main(void)
{
        u8 keynum=0;
        
        
        LED_config();
        
        EXTIX_Init();
        
        Led_Turn_on_all();    //点亮所有的LED灯
  Delay_ARMJISHU(6000000);
                //GPIO_ResetBits(GPIO_BEEPER,  BEEPER_PIN);        /*?????*/
          //Delay_ARMJISHU(0x60000);
                //GPIO_SetBits(GPIO_BEEPER, BEEPER_PIN);
        while(1)
        {
                Led_Turn_on_all();
                Delay_ARMJISHU(0x900000);
                Led_Turn_off_all();
                Delay_ARMJISHU(0x900000);
        }
}[/mw_shl_code]
回复

使用道具 举报

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2015-4-18
在线时间
17 小时
发表于 2016-8-26 23:41:02 | 显示全部楼层
清除line2和line3的中断标志位啥意思?中断5的优先级比中断0的高,中断5中清除了中断0的标志位,要中断0干嘛用?
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-27 09:40:43 | 显示全部楼层
本帖最后由 hanxinfeng11 于 2016-8-27 09:48 编辑
憨厚诚实大叔 发表于 2016-8-26 19:41
你在5-9的中断线里面清楚0的中断标记是什么鬼????
10-15清楚2的,0的清楚中断3的,你在逗我么

多谢提醒,参考其他程序写的,结果其他地方都改了,中断函数里面清除标志位忘改了。已经改了测试了,可以返回主函数。
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-27 09:41:46 | 显示全部楼层
本帖最后由 hanxinfeng11 于 2016-8-27 09:47 编辑
priate 发表于 2016-8-26 23:41
清除line2和line3的中断标志位啥意思?中断5的优先级比中断0的高,中断5中清除了中断0的标志位,要中断0干 ...

不好意思,这是参考其他程序写的,结果其他地方都改了,中断函数里面清除标志位忘改了。已经改了测试了,可以返回主函数。
回复

使用道具 举报

11

主题

54

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-8-24
在线时间
13 小时
 楼主| 发表于 2016-8-27 09:49:09 | 显示全部楼层
一个马虎结果导致苦思两天不得结果,真是当局者迷,多谢大家提醒,此贴终结。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 14:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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