飞捷 发表于 2024-3-25 10:35:39

STC32G PWMA和PWMB中断入口错了,但是程序居然没出问题

因为参考例程,把PWMA中断入口26和PWMB中断入口27弄错了,然后PWMA中断的时候居然还进入PWMB的中断入口,为什么可以这样?








void UpdatePwm(void)
{
      PWMA_ARRH = (Period>>8);
            PWMA_ARRL = Period;
            PWMA_CCR4H = (Period >> 9);   
      PWMA_CCR4L = (Period >> 1);                //设置占空比时间: Period/2
}


/******************** 主函数 **************************/
void PWM_INT()
{
      
   plus0_now_plus = 0;
//         Counter = 0;
//   Period = 0x1000;
    P_SW2 |= 0x80;                              //使能XFR访问
   PPWMAH=1;
            PPWMA=1;

//            IP2|=0x08;
//            IP2H|=0x08;                           //中断优先级

         PWMA_PSCRL=1;                            //使能输出2分频
               PWMA_PSCRH=0;
      
   PWMA_ENO = 0x00;
    PWMA_ENO |= ENO4P;                        //使能输出
            PWMA_RCR=0;
               PWMA_PS = 0x00;                           //高级 PWM 通道输出脚选择位
               PWMA_PS |= PWM4_2;                        //选择 PWM6_2 通道
//         PWMB_PS = 0x00;                           //高级 PWM 通道输出脚选择位
//               PWMB_PS |= PWM6_2;                        //选择 PWM6_2 通道
      
      
//         PWMA_EGR=0;
    UpdatePwm();
               
                        PWMA_BKR=0X80;
                        
                        PWMA_CCER2 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
                        PWMA_CCMR4 = 0x5c;                        //设置 PWM4 模式2 强制 高电平
                        PWMA_CCER2 = 0x10;                        //使能 CC4E 通道, 低电平有效
//                        PWMA_CR1 |= 0x04;
                        PWMA_CR1 = 0x84;
//                        PWMA_CR1 |= 0x01;   
                        
//                PWMB_CCER1 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
//                PWMB_CCMR2 = 0x5c;                        //设置 PWM2 模式2 强制 高电平
//                PWMB_CCER1 = 0x10;                        //使能 CC1E 通道, 高电平有效
//                PWMB_CR1 |= 0x04;
//                PWMB_CR1 |= 0x01;                           
//               PWMB_CR1 &= 0xFE;
//               PWMB_CR1 |= 0x01;                           //开始计时

   PWMB_IER = 0x00;                  //关闭中断

    EA = 1;                                     //打开总中断


}

/************* 发送脉冲函数 **************/
void TxPulse(void)
{
//    PWMB_CCER1 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
//    PWMB_CCMR2 = 0x6c;                        //设置 PWM2 模式7 输出
//    PWMB_CCER1 = 0x10;                        //使能 CC1E 通道, 高电平有效
//    PWMB_SR1 = 0;                               //清标志位
//    PWMB_CNTRH = 0;                              //清计数器
//          PWMB_CNTRL = 0;
//          PWMB_BKR = 0x80;                            //使能主输出
//    PWMB_CR1 |= 0x01;                           //开始计时
//    PWMB_IER = 0x04;                            //使能捕获/比较 1 中断
      
                        PWMA_CCER2 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
                        PWMA_CCMR4 = 0x6c;                        //设置 PWM4 模式2 强制 高电平
                        PWMA_CCER2 = 0x10;                        //使能 CC4E 通道, 低电平有效
      
                        PWMA_SR1 = 0;                               //清标志位
                        PWMA_CNTRH = 0;                              //清计数器
                        PWMA_CNTRL = 0;
                        PWMA_BKR = 0x80;                            //使能主输出
                        PWMA_CR1 |= 0x01;                           //开始计时
                        PWMA_IER = 0x10;                            //使能捕获/比较 1 中断
      
      
      
}

/********************** Timer0 1ms中断函数 ************************/


/******************* PWM中断函数 ********************/
void PWMB_ISR() interrupt 27
{
   if(PWMA_SR1 & 0X10)
   {
                        //清标志位
      plus0_now_plus++;
                         UpdatePwm();
      if( plus0_now_plus>=plus0_set_plus)                     //计数10个脉冲后关闭PWM计数器
      {   
                                          PWMB_IER = 0x00;                  //关闭中断

//            PWMB_CCER1 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
//                                                PWMB_CCMR2 = 0x5c;                        //设置 PWM2 模式2 强制 高电平
//                                                PWMB_CCER1 = 0x10;                        //使能 CC1E 通道, 高电平有效
                                       
                                                PWMA_CCER2 = 0x00;                        //写 CCMRx 前必须先清零 CCxE    关闭通道
                                                PWMA_CCMR4 = 0x5c;                        //设置 PWM4 模式2 强制 高电平
                                                PWMA_CCER2 = 0x10;                        //使能 CC4E 通道, 低电平有效
            plus0_now_plus = 0;
//                                          PWMB_CR1 &= 0xFE;                        //开始计时

      }
                                  PWMA_SR1 &=~0X10;   
   }
               PWMA_SR1=0;
               
}


zxcv1973 发表于 2024-3-25 11:56:09

很正常啊,PWMB中断入口在PWMA中断入口下面,PWMA中断入口里没有跳转的话就一直执行到PWMB中断入口

飞捷 发表于 2024-3-25 11:59:59

zxcv1973 发表于 2024-3-25 11:56
很正常啊,PWMB中断入口在PWMA中断入口下面,PWMA中断入口里没有跳转的话就一直执行到PWMB中断入口 ...

按照这逻辑,如果没有PWMA中断入口,也没有PWMB中断入口,那么会进入到其它中断了?

zxcv1973 发表于 2024-3-25 12:05:09

飞捷 发表于 2024-3-25 11:59
按照这逻辑,如果没有PWMA中断入口,也没有PWMB中断入口,那么会进入到其它中断了? ...

那得看PWMB中断入口下面的其他中断有没有用到,有用到的话是这样,都没用到的话就不确定了,反正是会一直往下执行,直到碰到分支类指令

梁工 发表于 2024-3-25 15:56:01

错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。

飞捷 发表于 2024-3-25 16:02:03

梁工 发表于 2024-3-25 15:56
错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。 ...

主要是因为其它原因,查代码,发现以前写错了。。。然后程序还是正常的。就好奇了。
是不是存在26中断没设入口就会跳到27中断入口?

小飞侠 发表于 2024-3-25 17:18:35

梁工 发表于 2024-3-25 15:56
错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。 ...

必须把错误改正,否则可能会遇到匪夷所思的问题

梁工 发表于 2024-3-25 21:19:53

飞捷 发表于 2024-3-25 16:02
主要是因为其它原因,查代码,发现以前写错了。。。然后程序还是正常的。就好奇了。
是不是存在26中断没 ...

对于明显错误的程序,我不会花时间去猜测。你改正过来,不要浪费时间在错误的地方。
页: [1]
查看完整版本: STC32G PWMA和PWMB中断入口错了,但是程序居然没出问题