近日收到两位坛友关于PWM疑似丢失中断的问题:
https://www.stcaimcu.com/thread-25324-1-1.html
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=22231
今早抽空尝试了下,发现了解决之道:
程序中对PWMA_SR1置位操作无效,不会引发中断;(如PWMA_SR1=0xFF)
因此程序中对PWMA_SR1清零操作,可以只清除某一位;(如PWMA_SR1 = ~0x01;//只清除bit0)
建议这样写(已经本人验证,手册中有部分例程有类似写法):
- if(PWMA_SR1 & 0x01)
- {
- PWMA_SR1 = ~0x01;//只清除bit0
- }
- if(PWMA_SR1 & 0x02)
- {
- PWMA_SR1 = ~0x02;//只清除bit1
- }
复制代码 考虑到效率,另一种写法:
- uchar sr;
- sr = PWM1_SR1;
- PWM1_SR1 = ~sr;//只清除读到为1的状态位
- if(sr & 1)//bit0
- {
-
- }
- if(sr & 2) //bit1
- {
-
- }
复制代码
建议官方在MCU手册中在PWMA_SR1的说明中写清楚。
MCU手册中部分例程存在BUG,正如坛友遇到的那样:
(如果这两句之间PWMA_SR1有新的标志出现,就会遭到“误杀”)
- sr=PWMA_SR1;
- PWMA_SR1 =0;
复制代码 另一种写法也可能存在BUG(未经验证,暂时是猜测),
如例程中PWMA_SR1&=~0x02;这一句在编译后的汇编代码中是分为读、改、写三步操作的,(写入值可能多个位为0)
同上,若读与写之间有新标志置位,则可能被“误杀”。
建议官方研究一下,看是不是要改一下例程。
|