- 打卡等级:初来乍到
- 打卡总天数: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
|