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

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

[复制链接]
  • TA的每日心情
    开心
    昨天 08:43
  • 签到天数: 135 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    577

    积分

    高级会员

    积分
    577
    发表于 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
    纸上得到终觉浅,绝知此事要躬行。
    回复 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    110

    回帖

    615

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:43
  • 签到天数: 135 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    577

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    1

    主题

    110

    回帖

    615

    积分

    高级会员

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

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

    使用道具 举报

    该用户从未签到

    45

    主题

    2912

    回帖

    6546

    积分

    超级版主

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

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:43
  • 签到天数: 135 天

    [LV.7]常住居民III

    34

    主题

    323

    回帖

    577

    积分

    高级会员

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

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

    点评

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

    使用道具 举报

  • TA的每日心情
    慵懒
    11 小时前
  • 签到天数: 63 天

    [LV.6]常住居民II

    4

    主题

    404

    回帖

    1082

    积分

    金牌会员

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

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

    使用道具 举报

    该用户从未签到

    45

    主题

    2912

    回帖

    6546

    积分

    超级版主

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-27 17:36 , Processed in 0.066115 second(s), 60 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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