打印
[STM32F1]

怎么才能跳出中断

[复制链接]
601|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tian111|  楼主 | 2022-2-20 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助,写了一个小程序,怎么才能跳出中断啊,求各位大佬解惑!
#include <reg52.h>
void GPIO_Init();
void P1_IODect();
void P2_IODect();
void TURN_Left();
void TURN_Right();
void TIMER_A0_1();
void TIMER_A1_1();
int main(void) {
    WDTCTL = WDTPW | WDTHOLD;
    GPIO_Init();
    TIMER_A0_1();
    TIMER_A1_1();
    _enable_interrupts();
}
void GPIO_Init(){
P1DIR |= BIT0+BIT1;
P1OUT |= BIT1;
P1OUT &= ~BIT0;
P1SEL |= BIT6;
P1DIR |= BIT6;
P2DIR |= BIT0+BIT1;
P2OUT |= BIT1;
P2OUT &= ~BIT0;
P2SEL |= BIT2;
P2DIR |= BIT2;
P1REN |= BIT3;
P1OUT |= BIT3;
P1DIR &=~ BIT3;
P1IES |= BIT3;
P1IE |= BIT3;
P2REN |= BIT3;
P2OUT |= BIT3;
P2DIR &=~ BIT3;
P2IES |= BIT3;
P2IE |= BIT3;
}
void TIMER_A0_1(){
TA0CTL=0;     //清除以前的设置
TA0CTL |= TASSEL_1+MC_1; //使用子系统时钟,帧计数模式,不倍频
TA0CTL|=ID_0;    //使用子系统时钟,帧计数模式,不倍频
    TA0CCTL1 = OUTMOD_7;
TA0CCR0 = 1000;             //时钟频率为32768HZ,100HZ
TA0CCR1 = 400;             //占空比CCR1/CCR0=1/3
TA0CTL |= TACLR;
}
void TIMER_A1_1(){
TA1CTL=0;     //清除以前的设置
TA1CTL |= TASSEL_1+MC_1; //使用子系统时钟,帧计数模式,不倍频
TA1CTL|=ID_0;    //使用子系统时钟,帧计数模式,不倍频
TA1CCTL1 = OUTMOD_7;
TA1CCR0 = 1000;             //时钟频率为32768HZ,100HZ
TA1CCR1 = 400;             //占空比CCR1/CCR0=1/3
TA1CTL |= TACLR;
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1_ISR(void)
{
P1_IODect();
    P1IFG=0;
}
void P1_IODect()
{
unsigned int Push_Key=0;
Push_Key=P1IFG&(~P1DIR);
if((P1IN&Push_Key)==0)
   {
  switch(Push_Key){
  case BIT3:
   TURN_Right();
   P1IN ^= BIT3;
   break;
  default:       break;
  }
   }
}
#pragma vector = PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
P2_IODect();
    P2IFG=0;
}
void P2_IODect()
{
unsigned int Push_Key=0;
Push_Key=P2IFG&(~P2DIR);
if((P2IN&Push_Key)==0)
   {
  switch(Push_Key){
  case BIT3:  TURN_Left();
                 P2IN ^=BIT3;
                 break;
  default:       break;
  }
}
}
void TURN_Left(){
unsigned int MILL1=400;
unsigned int MILL2=400;
while((P2IN&0x04)==0){
  MILL1=MILL1+40;
  MILL2=MILL2-40;
  TA0CCR1=MILL1;
        TA1CCR1=MILL2;
}
}
void TURN_Right(){
unsigned int MILL1=400;
unsigned int MILL2=400;
    MILL1=MILL1-40;
    MILL2=MILL2+40;
    while((P1IN&0x04)==0){
        MILL1=MILL1-40;
        MILL2=MILL2+40;
        TA0CCR1=MILL1;
        TA1CCR1=MILL2;
     }
}

使用特权

评论回复
沙发
jiajs| | 2022-2-20 21:05 | 只看该作者
你这是 MCU51 内核的吧!

使用特权

评论回复
板凳
juventus9554| | 2022-2-20 21:12 | 只看该作者
中断里用了太多的while,那么只要条件符合,肯定就跳不出来了

使用特权

评论回复
地板
supernan| | 2022-2-20 21:15 | 只看该作者
当while的条件不符合的时候,也应该能跳出来才对。

使用特权

评论回复
5
dengdc| | 2022-2-20 21:17 | 只看该作者
中断所起的作用没有说明...

使用特权

评论回复
6
zwll| | 2022-2-20 21:19 | 只看该作者

__interrupt void PORT1_ISR(void)
{
P1_IODect();
    P1IFG=0;
}

__interrupt void PORT2_ISR(void)
{
P2_IODect();
    P2IFG=0;
}

使用特权

评论回复
7
supernan| | 2022-2-20 21:21 | 只看该作者
没有对对应中断标志位清零,要找到这两个中断源的控制寄存器,然后找到对应位,对其置1·即可跳出中断了

使用特权

评论回复
8
supernan| | 2022-2-20 21:23 | 只看该作者
找到对应中断标志位,清除。。

使用特权

评论回复
9
dengdc| | 2022-2-20 21:25 | 只看该作者
P1_IODect();

P1IFG=0这样不行么?

使用特权

评论回复
10
jiaxw| | 2022-2-20 21:27 | 只看该作者
进入后先关闭中断,然后清理标志位,处理任务,处理完重启中断,退出。

使用特权

评论回复
11
chuxh| | 2022-2-20 21:31 | 只看该作者
清除中断标志位,运行完中断处理程序之后自然就出来了啊

使用特权

评论回复
12
wuhany| | 2022-2-20 21:33 | 只看该作者
我没明白 难道楼主在跑程序的时候 一直在中断里边出不来吗?

使用特权

评论回复
13
午夜粪车| | 2022-2-20 21:35 | 只看该作者
最好别用while 很容易掉进去

使用特权

评论回复
14
dingy| | 2022-2-20 21:37 | 只看该作者
需要清除中断标志位的哦

使用特权

评论回复
15
yinxiangh| | 2022-2-20 21:39 | 只看该作者
如果用while语句的话 就要确保能跳出这种状态 否则是出不来中断的

使用特权

评论回复
16
xxmmi| | 2022-2-20 21:42 | 只看该作者
中断标志位是自动清除的吧

使用特权

评论回复
17
jiajs| | 2022-2-20 21:44 | 只看该作者
难道楼主一直在中断里边出不来吗

使用特权

评论回复
18
tian111|  楼主 | 2022-2-20 21:46 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

评论回复
19
SantaBunny| | 2023-3-3 20:39 | 只看该作者
一般都不在中断里面跳到主程序都是在中断里面赋个状态,然后在主程序判断状态执行相应动作

使用特权

评论回复
20
Henryko| | 2023-3-3 22:52 | 只看该作者
是一直在中断里跳不出来吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

797

主题

8878

帖子

7

粉丝