_奶咖君_ 发表于 2024-4-3 09:25:37

关于STC8A8K64D4单片机中15bit增强型PWM的 归零中断 问题

关于试验箱例程中 避免第一次开启PWM计数时 会触发一次归零中断的避免方法这里



//PWMCEN写0再写1时, 会立即产生一个归零中断, 通过以下方法屏蔽掉这个中断
                EA = 0;
                PWMCFG = 0x05; //启动 PWM 模块, 使能计数器归零中断
                _nop_();
                _nop_();
                PWMCFG &= ~0x08;      //清标志位
                EA = 1;是否可以理解为 关闭总中断后 开启PWM计数时 虽然归零标志位仍然会置位但是 由于关闭了总中断,清除了归零标志之后 再打开总中断也不会触发 PWM中断。。

那么基于以上理解,那是不是可以不用关闭总中断。 只是 不开启归零中断,在清除了归零标志位后再开启归零中断,,是否可以达到相同的效果。
    PWMCFG |= PWMCEN; // 启动PWM 但不开启归零中断
    _nop_();
    _nop_();
    PWMCFG &= ~PWMCBIF; // 清标志位
    PWMCFG |= PWMCBIE; //开启归零中断


梁工 发表于 2024-4-3 22:57:31

基本上,正常的开启中断都是: 清除中断标志,NOP(3); 开中断。
比如外中断INT0~INT4用于下降沿中断,在禁止终端期间,只要出现过下降沿,则中断标志就为1,一旦允许中断,马上进去,所以要先清除中断标志,NOP(3); 开中断。
同理,定时器也一样,一旦溢出,中断标志就会置1,开中断前,先清除标志,NOP(3); 再开中断。

_奶咖君_ 发表于 2024-4-7 16:32:11

梁工 发表于 2024-4-3 22:57
基本上,正常的开启中断都是: 清除中断标志,NOP(3); 开中断。
比如外中断INT0~INT4用于下降沿中断,在禁 ...

嗯嗯 虽然没有正面回答我的问题,,

但是梁工描述的和我理解的基本吻合,,

zanjun 发表于 2026-2-2 15:41:51

你好,用您上面的代码,并不能屏蔽第一个归零中断,我把延时加长了,还是不行

_奶咖君_ 发表于 2026-2-3 14:47:27

zanjun 发表于 2026-2-2 15:41
你好,用您上面的代码,并不能屏蔽第一个归零中断,我把延时加长了,还是不行 ...

抱歉,已经是很久之前测试的代码了。。。

由于我实际的应用中,多一个中断少一个中断并没有太大差距。所以这里也有浅尝辄止的问了问。

如果您能把出现问题的最简工程发上来,或许我能看出来是不是有其他的问题。

zanjun 发表于 2026-2-14 08:49:40

_奶咖君_ 发表于 2026-2-3 14:47
抱歉,已经是很久之前测试的代码了。。。

由于我实际的应用中,多一个中断少一个中断并没有太大差距。所 ...
我的一个程序,需要单次启动PWM,延时一定时间,改T1/T2,
再单次启动PWM,延时,如此重复,
实验的结果不能正常运行,输出的波形和设计的不一样,
单次启动,就是设好T1/T2,启动,在归零中断中,停止PWM
之前,连续运行PWM,在归零中断里改T1/T2,就没有问题,
至于第一次就不关心了

神农鼎 发表于 2026-2-14 09:56:16

zanjun 发表于 2026-2-14 08:49
我的一个程序,需要单次启动PWM,延时一定时间,改T1/T2,
再单次启动PWM,延时,如此重复,
实验的结果不 ...

你重新发个贴,MCU型号,
要实现的功能,你的完整简单测试程序,
现象,我请研发帮您分析
页: [1]
查看完整版本: 关于STC8A8K64D4单片机中15bit增强型PWM的 归零中断 问题