关于AI8051高速144MHZ的高级PWMA进入中断后PWMA_SR1值异常
AI8051高速144MHZ的高级PWMA进入中断后PWMA_SR1值异常,读出的值始终是0,直接读取和用ReadPWMA函数读取都是0。PWMA配置函数
void PWMA_config(void)
{
PWMA_PS |= (0<<2); // 选择IO, 0:选择P1.2 P1.3, 1:选择P0.2 P0.3, 2:选择P2.2 P2.3,
PWMA_CLKDIV = 1; //PWMA1分频
PWMA_ETRPS &= ~(3<<2); //外部刹车触发脚切换 默认P3.5
HSPWMA_CFG =0x04 | 0x02; // +0x04:使能异步模式下的PWM中断, 0x02:使能异步控制模式
//通过异步方式设置PWMA的相关寄存器
WritePWMA(&PWMA_PSCRH, 0x00); // 预分频寄存器
WritePWMA(&PWMA_PSCRL, 0x00);
WritePWMA(&PWMA_DTR,WMA_DtrNs); // 死区时间配置, n=0~127: DTR= n T, 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T,
WritePWMA(&PWMA_CCER1,0x05 | 0x50); // 捕获/比较使能寄存器1PWMA 1和2开启比较输出, 高电平有效
WritePWMA(&PWMA_CCMR1, 0x68); // 通道模式配置, PWM1模式1, 预装载允许
WritePWMA(&PWMA_CCMR2, 0x78); // 通道模式配置, PWM2模式2, 预装载允许
WritePWMA(&PWMA_ARRH, PWMA_PERIOD_MAX>>8); // 自动重装载寄存器,控制PWM周期
WritePWMA(&PWMA_ARRL, PWMA_PERIOD_MAX);
WritePWMA(&PWMA_CCR1H, 0); //下管打开,为电容充电
WritePWMA(&PWMA_CCR1L, 0);
WritePWMA(&PWMA_CCR2H, PWMA_Period>>8); //下管打开,为电容充电
WritePWMA(&PWMA_CCR2L, PWMA_Period);
WritePWMA(&PWMA_BKR, 0x90); // 主输出使能 相当于总开关B5=0刹车低电平=1刹车高电平B4=1开启刹车
WritePWMA(&PWMA_IER, 0x80); // 允许刹车中断
WritePWMA(&PWMA_EGR, 0x01); // 产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
WritePWMA(&PWMA_ENO,0x03 | 0x0C); // 允许IO输出 bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P,bit3: ENO2N,bit2: ENO2P,bit1: ENO1N,bit0: ENO1P
WritePWMA(&PWMA_CR1, 0xA1); // 使能计数器,
WritePWMA(&PWMA_IER, 0x81); // 允许刹车中断,打开更新中断
P1 &= 0xf0; //将P1.0~P1.3设为低电平
P1M1 &= ~0xff; // P10:推挽 P11:推挽 P12:推挽 P13:推挽
P1M0 |= 0xff;
IP2 &=~(1<<2); //PWMA中断优先级设置为2 次高
IP2H |=1<<2;
}
PWMA中断函数
void PWMA_ISR_Handler (void) interrupt PWMA_VECTOR //
{
u8 SR1 = 0;
SR1 = ReadPWMA(PWMA_SR1);
// SR1 = PWMA_SR1;
// TODO: 在此处添加用户代码
if (SR1 & 0x01){ //UIFA 更新中断
SR1 &= ~0x01;
P45=!P45; //LED灯
}if (SR1 & 0x02){ //CC1IF 捕获/比较中断
SR1 &= ~0x02;
P45=!P45;
}if (SR1 & 0x04){ //CC2IF 捕获/比较中断
SR1 &= ~0x04;
P45=!P45;
}if (SR1 & 0x08){ //CC3IF 捕获/比较中断
SR1 &= ~0x08;
P45=!P45;
}if (SR1 & 0x10){ //CC4IF 捕获/比较中断
SR1 &= ~0x10;
P45=!P45;
}if (SR1 & 0x20){ //COMIFA 中断
SR1 &= ~0x20;
P45=!P45;
}if (SR1 & 0x40){ //TIFA 触发器中断
SR1 &= ~0x40;
P45=!P45;
}if (SR1 & 0x80){ //BIFA 刹车中断
SR1 &= ~0x80;
P45=!P45;
}
}
在处理AI8051高速144MHz的高级PWMA模块时,遇到PWMASR1寄存器值异常的问题,尤其是在进入中断后读取的PWMASR1值始终为0,这可能是由多种原因引起的。以下是对该问题的详细分析和可能的解决方案。
1. 问题分析
1.1 中断触发机制
PWMA模块的中断触发机制可能存在问题。PWMASR1寄存器用于记录PWMA模块的各种中断标志位,如更新中断、捕获/比较中断、触发器中断等。如果中断触发后,PWMASR1寄存器的值未被正确更新或清除,可能会导致读取的值为0。
1.2 寄存器访问时序
在高速144MHz的时钟频率下,寄存器的访问时序可能变得非常关键。如果读取PWMASR1寄存器的时机不当,可能会导致读取到错误的值。特别是在中断服务程序中,寄存器的访问时序需要特别注意。
1.3 中断优先级和嵌套
如果系统中存在多个中断源,且中断优先级设置不当,可能会导致PWMA中断被其他高优先级中断打断,从而影响PWMASR1寄存器的读取。
1.4 硬件问题
硬件问题,如PWMA模块的时钟信号不稳定、电源噪声等,也可能导致PWMASR1寄存器的值异常。
2. 解决方案
2.1 检查中断触发条件
首先,确保PWMA模块的中断触发条件设置正确。检查PWMACR1、PWMACR2等控制寄存器,确保中断使能位(如UIE、CC1IE、CC2IE等)已正确设置。
2.2 优化寄存器访问时序
在中断服务程序中,优化PWMASR1寄存器的访问时序。可以在进入中断后立即读取PWMASR1寄存器的值,并尽快处理中断标志位。避免在中断服务程序中进行过多的操作,以减少寄存器访问的延迟。
c
void PWMAISRHandler (void) interrupt PWMAVECTOR
{
u8 SR1 = ReadPWMA(PWMASR1);// 立即读取PWMASR1寄存器的值
if (SR1 & 0x01){ // UIFA 更新中断
SR1 &= ~0x01;
P45=!P45; // LED灯
}
if (SR1 & 0x02){ // CC1IF 捕获/比较中断
SR1 &= ~0x02;
P45=!P45;
}
// 其他中断处理逻辑...
}
2.3 检查中断优先级
检查系统中其他中断的优先级设置,确保PWMA中断不会被其他高优先级中断打断。可以通过调整中断优先级寄存器(如IP、IPH等)来优化中断处理顺序。
2.4 硬件调试
如果上述软件方法无法解决问题,建议进行硬件调试。检查PWMA模块的时钟信号、电源电压等,确保硬件环境稳定。可以使用示波器或逻辑分析仪来观察PWMA模块的工作状态。
2.5 固件更新
检查是否有最新的固件或驱动程序更新,可能厂商已经修复了类似的问题。更新固件或驱动程序后,重新测试PWMA模块的功能。
3. 总结
在AI8051高速144MHz的高级PWMA模块中,PWMASR1寄存器值异常的问题可能由中断触发机制、寄存器访问时序、中断优先级或硬件问题引起。通过检查中断触发条件、优化寄存器访问时序、调整中断优先级、进行硬件调试和更新固件等方法,可以有效解决该问题。建议按照上述步骤逐一排查,确保PWMA模块的正常工作。
如果问题仍然存在,建议联系芯片厂商的技术支持团队,获取更专业的帮助和指导。
[本文内容由国芯人工智能辅助生成,仅供参考]
页:
[1]