This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28069:有关寄存器写入的问题

Guru**** 2560390 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/997186/tms320f28069-questions-about-register-writing

器件型号:TMS320F28069

你(们)好。 我目前正在使用 F28069并使用在 APWM 模式下运行的 ECAP2中断。  我在 CTR 达到 CMP 时启用了中断、这里是我的中断服务函数

__interrupt void ecap2_isr(void){
    GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;

    ECap2Regs.ECCLR.bit.INT = 1;
    ECap2Regs.ECCLR.bit.CTR_EQ_CMP = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

我希望看到 占空比约为50%且频率为 APWM 一半的脉冲波形。 但实际上、当我运行程序时、我发现占空比非常小(接近0)、频率与 APWM 相同。 因此、我认为我的中断标志清除过程可能存在一些问题、它会在每个 APWM 周期中触发两次正在运行的中断函数。

之后,我做了一项修改。 我更改上面代码的两行的顺序,如下所示

__interrupt void ecap2_isr(void){
    GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
    
    ECap2Regs.ECCLR.bit.CTR_EQ_CMP = 1;
    ECap2Regs.ECCLR.bit.INT = 1;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}

波形变为与我预期的相同。 但我不知道这种现象、您能不能给我一些与这种奇怪现象相关的信息? 谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您能否尝试输入该代码  

    EALLOW;

    EDIS;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、感谢您的回复。 我认为这可能不是问题、因为这两个寄存 器、GPATOGGLE 和 ECCLR、虽然我还没有尝试过、但不受 EALLOW 保护。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    请尝试此操作、否则我将尝试在明天的设置中重新创建问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、Santosh。 我尝试将 EALLOW 和 EDIS 放置在这里、这是我的代码

    __interrupt void ecap2_isr(void){
        EALLOW;
        GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        ECap2Regs.ECCLR.bit.INT = 1;
        ECap2Regs.ECCLR.bit.CTR_EQ_CMP = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
        EDIS;
    }

    这里是 我捕获的波形。

    顶部的两个通道 是 APWM 的输出、最后一个通道是 GPIO0。 如您所见、通道2的频率与通道0和通道1相同、这不是我所期望的。 此外、GPIO0的脉冲持续时间很短、几乎为500ns (周期为500us)、这也很奇怪。

    当我将代码修改为时

    __interrupt void ecap2_isr(void){
        EALLOW;
        GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        ECap2Regs.ECCLR.bit.CTR_EQ_CMP = 1;
        ECap2Regs.ECCLR.bit.INT = 1;
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
        EDIS;
    }

    然后、波形恰好是我所期望的、它被放置在下面。

    为了完全重现此问题、我将 ECAP 初始化代码放置如下。

    void initAPWM(){
        ECap1Regs.ECEINT.all = 0x0000;             // Disable all capture interrupts
        ECap1Regs.ECCLR.all = 0xFFFF;              // Clear all CAP interrupt flags
        ECap1Regs.ECCTL2.bit.CAP_APWM = 1;   // Enable APWM mode
        ECap2Regs.ECCTL2.bit.CAP_APWM = 1;   // Enable APWM mode
    
    
        ECap2Regs.ECEINT.bit.CTR_EQ_CMP = 1; //Enable APWM interrupt when CTR equals CMP
    //    ECap2Regs.ECEINT.bit.CEVT2 = 1;
    
        ECap1Regs.ECCLR.all = 0x0FF;         // Clear pending interrupts
    
        ECap1Regs.ECCTL2.bit.APWMPOL = 1;
        ECap2Regs.ECCTL2.bit.APWMPOL = 0;
        ECap1Regs.CAP1 = pwm1_prd;         // Set Period value
        ECap1Regs.CAP2 = pwm1_cmp;         // Set Compare value
    //
        ECap2Regs.CAP1 = pwm2_prd;         // Set Period value
        ECap2Regs.CAP2 = pwm2_cmp;         // Set Compare value
        // Start counters
        ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
        ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1;
    
        ECap1Regs.ECCTL2.bit.SYNCO_SEL = 1;
        ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;
        ECap2Regs.CTRPHS  = pwm2_pha;         // Set Compare value
    }

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您是否有我可以尝试的示例项目?