找回密码
 立即注册
查看: 25|回复: 1

关于AI8051高速144MHZ的高级PWMA进入中断后PWMA_SR1值异常

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-04-24 09:11:29

1

主题

1

回帖

13

积分

新手上路

积分
13
发表于 2025-4-24 09:11:29 | 显示全部楼层 |阅读模式
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);                // 捕获/比较使能寄存器1  PWMA 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;
        }
}




回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-24 09:12:00 | 显示全部楼层
在处理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寄存器的值,并尽快处理中断标志位。避免在中断服务程序中进行过多的操作,以减少寄存器访问的延迟。
  1. c
  2. void PWMAISRHandler (void) interrupt PWMAVECTOR
  3. {
  4.     u8 SR1 = ReadPWMA(PWMASR1);  // 立即读取PWMASR1寄存器的值
  5.     if (SR1 & 0x01){    // UIFA 更新中断
  6.         SR1 &= ~0x01;
  7.         P45=!P45;       // LED灯
  8.     }
  9.     if (SR1 & 0x02){    // CC1IF 捕获/比较中断
  10.         SR1 &= ~0x02;
  11.         P45=!P45;
  12.     }
  13.     // 其他中断处理逻辑...
  14. }
复制代码

2.3 检查中断优先级
检查系统中其他中断的优先级设置,确保PWMA中断不会被其他高优先级中断打断。可以通过调整中断优先级寄存器(如IP、IPH等)来优化中断处理顺序。

2.4 硬件调试
如果上述软件方法无法解决问题,建议进行硬件调试。检查PWMA模块的时钟信号、电源电压等,确保硬件环境稳定。可以使用示波器或逻辑分析仪来观察PWMA模块的工作状态。

2.5 固件更新
检查是否有最新的固件或驱动程序更新,可能厂商已经修复了类似的问题。更新固件或驱动程序后,重新测试PWMA模块的功能。

3. 总结

在AI8051高速144MHz的高级PWMA模块中,PWMASR1寄存器值异常的问题可能由中断触发机制、寄存器访问时序、中断优先级或硬件问题引起。通过检查中断触发条件、优化寄存器访问时序、调整中断优先级、进行硬件调试和更新固件等方法,可以有效解决该问题。建议按照上述步骤逐一排查,确保PWMA模块的正常工作。

如果问题仍然存在,建议联系芯片厂商的技术支持团队,获取更专业的帮助和指导。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:41 , Processed in 0.105882 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表