找回密码
 立即注册
查看: 494|回复: 7

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-03 08:12:12
已绑定手机

40

主题

371

回帖

847

积分

高级会员

积分
847
发表于 2024-3-25 10:35:39 | 显示全部楼层 |阅读模式
因为参考例程,把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;
                 
}


截图202403251035334710.jpg
纸上得到终觉浅,绝知此事要躬行。
回复

使用道具 举报 送花

2

主题

185

回帖

1048

积分

金牌会员

积分
1048
发表于 2024-3-25 11:56:09 | 显示全部楼层
很正常啊,PWMB中断入口在PWMA中断入口下面,PWMA中断入口里没有跳转的话就一直执行到PWMB中断入口
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-03 08:12:12
已绑定手机

40

主题

371

回帖

847

积分

高级会员

积分
847
发表于 2024-3-25 11:59:59 | 显示全部楼层
zxcv*** 发表于 2024-3-25 11:56
很正常啊,PWMB中断入口在PWMA中断入口下面,PWMA中断入口里没有跳转的话就一直执行到PWMB中断入口 ...

按照这逻辑,如果没有PWMA中断入口,也没有PWMB中断入口,那么会进入到其它中断了?
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

2

主题

185

回帖

1048

积分

金牌会员

积分
1048
发表于 2024-3-25 12:05:09 | 显示全部楼层
飞*** 发表于 2024-3-25 11:59
按照这逻辑,如果没有PWMA中断入口,也没有PWMB中断入口,那么会进入到其它中断了? ...

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-3-25 15:56:01 | 显示全部楼层
错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-03 08:12:12
已绑定手机

40

主题

371

回帖

847

积分

高级会员

积分
847
发表于 2024-3-25 16:02:03 | 显示全部楼层
梁*** 发表于 2024-3-25 15:56
错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。 ...

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

点评

对于明显错误的程序,我不会花时间去猜测。你改正过来,不要浪费时间在错误的地方。  详情 回复 发表于 2024-3-25 21:19
纸上得到终觉浅,绝知此事要躬行。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:396
  • 最近打卡:2025-05-03 11:16:14

16

主题

702

回帖

2478

积分

金牌会员

积分
2478
发表于 2024-3-25 17:18:35 | 显示全部楼层
梁*** 发表于 2024-3-25 15:56
错误的程序,不要去花时间琢磨,改正过来。一旦出现这种严重错误,程序跑飞,或出现任何情况,都是正常的。 ...

必须把错误改正,否则可能会遇到匪夷所思的问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2024-3-25 21:19:53 | 显示全部楼层
飞*** 发表于 2024-3-25 16:02
主要是因为其它原因,查代码,发现以前写错了。。。然后程序还是正常的。就好奇了。
是不是存在26中断没 ...

对于明显错误的程序,我不会花时间去猜测。你改正过来,不要浪费时间在错误的地方。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 15:14 , Processed in 0.145886 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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