| 
				打卡等级:初来乍到打卡总天数:3最近打卡:2024-05-29 10:36:09 新手上路 
 
 
	积分42 
 | 
 
| 本帖最后由 陌风 于 2024-5-30 22:10 编辑 
 在使用stc32fk54时,我遇到了这一个问题,我在定时器1的中断和主函数都调用了这一个函数。(比较新手,谢谢大神的解答)
 
 
 void pwm_duty(PWMCH_enum pwmch, uint32 duty)
 {
 uint32 match_temp;
 //读取ARR寄存器值
 uint32 arr = ((*(unsigned char volatile far *) (PWM_ARR_ADDR[pwmch>>6]))<<8) | (*(unsigned char volatile far *) (PWM_ARR_ADDR[pwmch>>6] + 1 ));
 //arr寄存器和频率有关
 //        P_SW2 |= 0x80;
 
 if(duty != PWM_DUTY_MAX)
 {
 match_temp = arr * ((float)duty/PWM_DUTY_MAX);                                //占空比
 }
 else
 {
 match_temp = arr + 1;
 }
 //用这个值设置比较寄存器CCR寄存器,当达到ccr寄存器的值时,输出0,没达到输出1
 
 
 //设置捕获值|比较值
 (*(unsigned char volatile far *) (PWM_CCR_ADDR[pwmch>>4]))                = match_temp>>8;                        //高8位
 (*(unsigned char volatile far *) (PWM_CCR_ADDR[pwmch>>4] + 1))  = (uint8)match_temp;                //低8位
 
 //        P_SW2 &= ~0x80;
 
 }
 
 主函数用了while(1){pwm_duty(PWMB_CH3_P33, 5250);}定时器1放了pwm_duty(P13,1000);已知这两个通道不冲突,但是现在出现了主函数的pwm_duty(PWMB_CH3_P33, 5250),会影响P13的输出,如图是P13的波,
 可是我在网络上了解到,中断时,数据会被储存到堆栈中断退出时,自动恢复这些寄存器原本的值,那么为啥定时器的函数运行,会影响到主函数呢?是形参不堆栈吗?只有形参引脚变了才会影响P13??
 第二次编辑:
 
 类比C51,我想我可能知道了大概是,C251在重入中,把局部变量重新赋值,并没有堆栈,所以导致主函数的引脚错误,而在最后设置比较值时,将match_temp也就是5250赋值给了,PWM_CCR_ADDR[pwmch>>4]但是注意,这个pwmch时重写的,也就是P13。
 
 但是说法还是有一些问题 为什么局部变量  match_temp;没有改变。2 在我将这两个函数分别放在不同定时中断内,运行两分钟 没出现冲突。   希望大家能给出更具体的解答
 
 | 
 
这是不正常的主函数冲突导致的   
正常的1000   |