OpenEdv-开源电子网

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

stm32如何让一个正在执行的跑马灯中断去执行我另一个程序

[复制链接]

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
发表于 2017-3-4 11:09:40 | 显示全部楼层 |阅读模式
2金钱
我把跑马灯放在主函数里   如下:while(1){                                   key=KEY_Scan(0);       
                                      if(key)
                                  {                                                  
                                   switch(key)
                                  {                               
                                 case 2:       
                                        while(1){       
                                                LED2=1;
                                                delay_ms(500);
                                                LED2=0;
                                                delay_ms(500);
                                                LED3=1;
                                               delay_ms(500);
                                               LED3=0;
                                               delay_ms(500);
                                                LED7=1;
                                               delay_ms(500);
                                                LED7=0;
                                                delay_ms(500);
                                                 LED13=1;
                                                delay_ms(500);
                                                  LED13=0;}

               然后把一盏单独亮的灯放在中断程序里:如下:
                                               void EXTI2_IRQHandler(void)
                                           {
                                        delay_ms(10);       
                                        if(KEY2==0)
                                       {                                 
                                 LED13=0;
                                 LED2=1;
                                 LED3=0;
                                 LED7=0;  
                                              }                 
         EXTI_ClearITPendingBit(EXTI_Line2);}     我想当我按下键2的时候   跑马灯立刻停止 然后执行LED2亮着   (而我现在的程序是跑马灯在运行的时候按下键2并没有停止,一直在运行)这该怎么办
                                                                   求大神回复!!

                               
                               
               
       

最佳答案

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

你进入外部中断之后,执行完,马上就退出了啊,然后又去执行while了,可以设定一个标志啊,一般情况下执行while,中断过后,改变标志,执行另一部分程序
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-4 11:09:41 | 显示全部楼层
你进入外部中断之后,执行完,马上就退出了啊,然后又去执行while了,可以设定一个标志啊,一般情况下执行while,中断过后,改变标志,执行另一部分程序
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-3-4 11:27:09 | 显示全部楼层
额,你对中断了解的太少了。中断服务函数执行完成以后就会返回到被中断的代码接着执行!这个过程很快!
回复

使用道具 举报

12

主题

76

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2017-2-21
在线时间
49 小时
发表于 2017-3-4 11:44:46 | 显示全部楼层
中断里面做个 按键while循环,释放按键再退出中断 就看得见效果了
回复

使用道具 举报

头像被屏蔽

345

主题

422

帖子

0

精华

禁止访问

积分
1250
金钱
1250
注册时间
2016-10-14
在线时间
33 小时
发表于 2017-3-4 12:06:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
 楼主| 发表于 2017-3-4 13:51:45 | 显示全部楼层
s8088 发表于 2017-3-4 12:06
可以直接在 while()程序里面多一个检测key2 如果按下就 break 就跳出while了,如果你一定要有那个中断服务 ...

您说的很对 ,  那我要串口中断的话  该怎么弄,  我想串口中断发送一个字符,使一盏灯亮  这中断程序直接写串口中断里吗
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
 楼主| 发表于 2017-3-4 13:52:34 | 显示全部楼层
我是路人甲 发表于 2017-3-4 11:44
中断里面做个 按键while循环,释放按键再退出中断 就看得见效果了

嗯嗯  是的
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
 楼主| 发表于 2017-3-4 13:53:00 | 显示全部楼层
zuozhongkai 发表于 2017-3-4 11:27
额,你对中断了解的太少了。中断服务函数执行完成以后就会返回到被中断的代码接着执行!这个过程很快!

是呀 我是学stm32没多久  新手
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
 楼主| 发表于 2017-3-4 13:53:46 | 显示全部楼层
fankai 发表于 2017-3-4 11:09
你进入外部中断之后,执行完,马上就退出了啊,然后又去执行while了,可以设定一个标志啊,一般情况下执行w ...

这效果不是我想要的哎
回复

使用道具 举报

21

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
321
金钱
321
注册时间
2015-3-28
在线时间
64 小时
发表于 2017-3-4 13:56:24 | 显示全部楼层
肯定执行了,就是太快,程序逻辑跟你要实现的效果不对号
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-3-4 14:43:08 | 显示全部楼层
1009127284 发表于 2017-3-4 13:53
这效果不是我想要的哎

在中断里面不能有太多东西,肯定要赶紧退出来的,退出来又会进入while循环了
为什么要用中断啊
回复

使用道具 举报

头像被屏蔽

345

主题

422

帖子

0

精华

禁止访问

积分
1250
金钱
1250
注册时间
2016-10-14
在线时间
33 小时
发表于 2017-3-4 15:15:06 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-2-14
在线时间
2 小时
 楼主| 发表于 2017-3-4 17:00:49 | 显示全部楼层
s8088 发表于 2017-3-4 15:15
任务不多,可以这么做实验

主函数:u8 flag;
int main(void)
{
        u8 Tx_Buf[8];
        u8 t;
        u8 len;       
        u16 times=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏè¼¶·Ö×é2
        delay_init(168);    //3õê¼»ˉÑóê±oˉêy
        uart_init(115200);         //′®¿ú3õê¼»ˉ
        LED_Init();                                  //3õê¼»ˉLED¶Ë¿ú  
        BEEP_Init();        //3õê¼»ˉ·äÃùÆ÷¶Ë¿ú
        EXTIX_Init();       //3õê¼»ˉía2¿ÖD¶Ïêäèë
  KEY_Init();       
       
        while(1)
        {
               
        if(flag ==1)
        while(1){
                         
         LED2=1;delay_ms(500);
         LED2=0;delay_ms(500);
         LED3=1;delay_ms(500);
         LED3=0;delay_ms(500);
         LED7=1;delay_ms(500);
         LED7=0; delay_ms(500);
         LED13=1; delay_ms(500);
         LED13=0;
       
        }
                         
        else if(flag==2)
        {
                LED3=1;
                LED7=0;
                LED13=0;
                LED2=0;}}}


串口中断函数:
extern u8 flag;

void USART1_IRQHandler(void)                       
{
        u8 Res;
#if SYSTEM_SUPPORT_OS                
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {
                Res =USART_ReceiveData(USART1);//(USART1->DR);       
               
                if((USART_RX_STA&0x8000)==0)
                {if(Res==1) flag =1;
                else if (Res==2) flag =2;
                else flag =0;
                return ;
                }                    

  }
#if SYSTEM_SUPPORT_OS        
        OSIntExit();                                                                                           
#endif
}
#endif       


       您好 ,我问一下 ,我这是想用串口中断  发送字符1  然后跑马灯    之后就不能发送字符2了  一直在跑马灯while死循环里了    这起不到我中断的效果呀

回复

使用道具 举报

3

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2011-9-30
在线时间
11 小时
发表于 2017-3-6 10:47:42 来自手机 | 显示全部楼层
这样使用delay延时害人。
回复

使用道具 举报

头像被屏蔽

345

主题

422

帖子

0

精华

禁止访问

积分
1250
金钱
1250
注册时间
2016-10-14
在线时间
33 小时
发表于 2017-3-9 09:58:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-12 22:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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