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.

[参考译文] TMS320F28388D:

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1228115/tms320f28388d

器件型号:TMS320F28388D

您好、我正在尝试将 PWM 占空比自检从379D 移植到388D、但在 CPU2上运行测试、我的问题是自检代码中有一条用于设置 输入选择寄存器的指令(

EALLOW;

HWREGH (base + XBAR_O_INPUT1SELECT +(uint16_t)输入)=引脚;

EDIS;

)但当我调试时,它似乎没有被设置,除了我无法从 CPU2可视化寄存器之外,我必须停止运行 CPU1才能看到它的内容。

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

    EALLOW;

    HWREGH (base + XBAR_O_INPUT1SELECT +(uint16_t)输入)=引脚;

    EDIS;

    [/报价]

    我认为这部分代码只能从 CPU1执行、正确吗?

    此外、当您从379D 移植到388D 时、388D 中需要一个额外的 base 参数、其中需要明确提到 INPUTXBAR_BASE 作为有效输入。 您能否检查一下您是否配置正确?

    最好分享这部分代码、以便更好地理解和调试问题。

    谢谢。

    Aditya.

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

    尊敬的 Abitya、感谢您的快速响应;

    实际上、用于 PWM 测试的代码在 CPU2上执行。

    关于你的第二点,我不太明白,但我会分享的代码:  

    下面的函数尝试配置 ECAP、并在最后一条指令中调用我在前一条消息中放入的代码:

    void STL_PWM_TRIP_CONFIGECAP (const STL_PWM_TRIP_TestHandle testHandle)

    uint32_t eCAPBase = testHandle->eCAPBase;
    uint32_t XbarInputBase = INPUTXBAR_BASE;

    //
    //禁用并清除所有捕捉标志和中断
    // DID_30_20、DID_30_21
    //
    /*LDRA_已检查87 S MR:R.18.4 "LDRA 工具问题、无实际指针
    代码中的算术"*/
    /*LDRA_Inspectified 567 S MR:R.18.R.18.4 "LDRA 工具问题,无实际指针
    代码中的算术"*/
    HWREGH (testHandle->eCAPBase + ECAP_O_ECEINT)&=~0x00FFU;

    /*LDRA_已检查87 S MR:R.18.4 "LDRA 工具问题、无实际指针
    代码中的算术"*/
    /*LDRA_Inspectified 567 S MR:R.18.R.18.4 "LDRA 工具问题,无实际指针
    代码中的算术"*/
    HWREGH (testHandle->eCAPBase + ECAP_O_ECCLR)= 0x00FFU;

    //
    //禁用 CAP1-CAP4寄存器加载
    // DID_30_22.
    //
    eCAP_disableTimeStampCapture (eCAPBase);

    //
    //停止计数器
    // DID_30_23.
    //
    ecap_stopCounter (eCAPBase);

    //
    //将模块置于捕获模式
    // DID_30_24
    //
    ECAP_enableCaptureMode (eCAPBase);

    //
    //使用单次触发模式并在事件3处停止捕捉
    // DID_30_25.
    //
    ECAP_setCaptureMode (eCAPBase、ECAP_ONE_SHOT_CAPTURE_MODE、ECAP_EVENT_3);

    //
    //将事件1-3的极性设置为上升、下降和上升
    // DID_30_26.
    //
    eCAP_setEventPolarity (eCAPBase、ECAP_EVENT_1、ECAP_EVNT_RISING_EDGE);
    eCAP_setEventPolarity (eCAPBase、ECAP_EVENT_2、ECAP_EVNT_FALLING_EDGE);
    eCAP_setEventPolarity (eCAPBase、ECAP_EVENT_3、ECAP_EVNT_RISING_EDGE);

    //
    //仅在事件1时重置计数器
    // DID_30_27.
    //
    ECAP_enableCounterResetOnEvent (eCAPBase、ECAP_EVENT_1);
    ECAP_disableCounterResetOnEvent (eCAPBase、ECAP_EVENT_2);
    ECAP_disableCounterResetOnEvent (eCAPBase、ECAP_EVENT_3);

    //
    //启用模块
    // DID_30_28.
    //
    ECAP_enableLoadCounter (eCAPBase);
    ecap_startCounter (eCAPBase);

    //
    //设置输入 X-BAR
    // DID_30_29.
    //
    XBAR_setInputPin (XbarInputBase、testHandle->xbarInput、testHandle->GPIO);

    }

    PS:我正在尝试将输入 XBAR_INPUT7 (其中 PWM 信号是输出的 GPIO 4)连接到 ECAP1

    另一个问题是我在论坛中查看、我发现在388d 中、我们实际上应该使用 ECCTL0寄存器、而不是 xbar.inputselect、是正确的吗?

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

    那么您是对的。 对于从 F28379D 到 F28388D 的转换、还必须从 ECAP 模块添加额外的配置:

    ECAP_selectECAPInput (ECAPx_BASE、ECAP_INPUT_INPUTXBAR7);

    我需要从设计的角度检查这是否真的阻止了对 INPUTXBAR 寄存器的写入。 您能否尝试添加上述代码行、看看它是否能够根据需要工作?

    谢谢。

    Aditya.

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

    大家好、我现在可以向该寄存器写入 intp (如下所示) 但我的自检仍然不起作用、我发现我无法写入 ECCTL2寄存器的 ECAP 重新 ARM 位、这是与37x 和38x 的变化有关的吗?

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

    您好!

    F28379D 中没有对 ECCTL2寄存器的写保护。 F28388D 中添加了写保护。

    如果您使用的是 driverlib 函数、它会自动进行更改。 如果您使用 HWREG 方法直接写入寄存器、则必须包含 EALLOW 和 EDIS、如您共享的映像所示。

    谢谢。
    Aditya.

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

    但在这里、我要寻找的是、为什么即使我以代码中显示的形式写入、重新 ARM 位也未更新

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

    您能否共享您为 F28379D 和 F28388D 编写的代码行? 除了 F28379D 的写保护外、没有其他变化。

    BTW、读取该位将始终返回0、因为这仅是一个只写位。 您只是根据寄存器视图进行检查、还是也检查了功能操作? 读取将返回0、您可以使用该功能验证操作。

    谢谢。
    Aditya.

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

    啊、我想您说得对、但无论如何、我检查过、我使用占空比更新存储器、但从 ECAP 侧、我无法捕获任何内容  

    您可以在下面找到测试占空比和被调用函数的代码部分

    文件:test.c

    案例 STA_PWM_DUTY_TEST:

    uint16_t pwmTestStatus;

    STA_User_initPWMTripTest ();

    //
    //在 GPIO4上输出 PWM 信号
    //
    GPIO_setPinConfig (GPIO_4_EPWM3A);

    //
    //创建 PWM 信号并配置 EeCAP
    //
    STL_PWM_TRIP_configEPWM (EPWM3_BASE、XBAR_TRIP4、
    STA_USER_PWM_TRIP_PERIOD、70.0);
    STL_PWM_TRIP_configECAP (STA_User_pwmTestHandle);

    //
    //开始寻找三个边沿
    //
    STL_PWM_TRIP_startECAP (STA_User_pwmTestHandle);

    //
    //延迟足够长的时间以允许三个边沿发生。 。
    //以下延迟大约是 PWM 信号周期的两倍。
    //
    STL_Util_delayUS (800U);

    //
    //检查占空比是否正确
    //
    pwmTestStatus = STL_PWM_TRIP_TEST (STA_User_pwmTestHandle、70.0);

    IF (STA_Tests_inprytError)

    //
    //该占空比与下面的预期占空比不同
    //
    STL_PWM_TRIP_configEPWM (EPWM3_BASE、XBAR_TRIP4、
    STA_USER_PWM_TRIP_PERIOD、29.8);
    }
    方案

    //
    //该占空比与下面的预期占空比相同
    //
    STL_PWM_TRIP_configEPWM (EPWM3_BASE、XBAR_TRIP4、
    STA_USER_PWM_TRIP_PERIOD、32.1);
    }

    //
    //开始寻找三个边沿
    //
    STL_PWM_TRIP_startECAP (STA_User_pwmTestHandle);

    //
    //延迟足够长的时间以允许三个边沿发生。 。
    //以下延迟大约是 PWM 信号周期的两倍。
    //
    STL_Util_delayUS (800U);

    //
    //检查占空比是否正确
    //
    #if STA_UTIL_PROFILE
    STA_Util_startProfiler (CPUTIMER1_BASE);
    #endif
    pwmTestStatus |= STL_PWM_TRIP_TEST (STA_User_pwmTestHandle、32.1);
    #if STA_UTIL_PROFILE
    uint32_t cycleCount = STA_Util_stopProfiler (CPUTIMER1_BASE);
    STA_Tests_cycleCounts [STA_PWM_Duty_test]= cycleCount;
    #endif

    if (STL_PWM_TRIP_PASS == pwmTestStatus)

    STA_Tests_passCount++;
    testReport ="\r\n\n\n 测试通过:PWM 跳闸占空比测试!\0";
    }
    否则为(STL_PWM_TRIP_FAIL_DUTY_CYCLE = pwmTestStatus)

    testReport ="\r\n\n\n 测试失败:PWM 跳闸占空比测试!\0";
    }
    方案

    //
    //未检测到边沿。 测试因错误原因失败。
    //
    testReport ="\r\n\n\n 测试失败:PWM 跳闸占空比测试!\0";
    ESTOP0;
    }

    中断;
    }

    文件:STL_PWM_TRIP.c   

    //#############################################################################
    //
    // FILE:  stl_pwm_trip.c
    //
    // TITLE: Diagnostic Library PWM software module source
    //
    //#############################################################################
    // $TI Release: F2837xD Diagnostic Library v1.00.02.00 $
    // $Release Date: Mon Dec 18 16:58:06 CST 2017 $
    // $Copyright:
    // Copyright (C) 2016-2017 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################
    
    #include "math.h"
    #include "interrupt.h"
    #include "sysctl.h"
    #include "stl_pwm_trip.h"
    
    //*****************************************************************************
    //
    // STL_PWM_Trip_configEPWM(uint32_t ePWMBase, XBAR_TripNum trip,
    //                         uint16_t period, float32_t dutyCycle)
    //
    //*****************************************************************************
    void STL_PWM_Trip_configEPWM(uint32_t ePWMBase, XBAR_TripNum trip,
                                 uint16_t period, float32_t dutyCycle)
    {
        uint16_t tripInputMask;
        uint16_t dutyCycleCount;
    
        //
        // Freeze the time base counter
        // DID_30_11
        //
        EPWM_setTimeBaseCounterMode(ePWMBase, EPWM_COUNTER_MODE_STOP_FREEZE);
    
        //
        // Set the time base clock prescalers to /1
        // DID_30_12
        //
        EPWM_setClockPrescaler(ePWMBase, EPWM_CLOCK_DIVIDER_1,
                               EPWM_HSCLOCK_DIVIDER_1);
    
        //
        // Set phase shift to 0
        //
        EPWM_setPhaseShift(ePWMBase, 0U);
    
        //
        // Disable the shadow load; the load will be immediate instead
        //
        EPWM_disableCounterCompareShadowLoadMode(ePWMBase,
                                                 EPWM_COUNTER_COMPARE_A);
    
        //
        // Set the compare A value to produce specified duty cycle
        // DID_30_13
        //
        dutyCycleCount = (dutyCycle / (float32_t)100.0) * (float32_t)period;
        EPWM_setCounterCompareValue(ePWMBase, EPWM_COUNTER_COMPARE_A,
                                        dutyCycleCount);
    
        //
        // Set action qualifier behavior on compare A events
        // --> 0 when CTR = CMPA and increasing
        // --> 1 when CTR = CMPA and decreasing
        //
        EPWM_setActionQualifierAction(ePWMBase, EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_LOW,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        EPWM_setActionQualifierAction(ePWMBase, EPWM_AQ_OUTPUT_A,
                                      EPWM_AQ_OUTPUT_HIGH,
                                      EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        //
        // Configure ePWMxA to output high on TZA TRIP and
        // DID_30_16, DID_30_17
        //
        EPWM_setTripZoneAction(ePWMBase, EPWM_TZ_ACTION_EVENT_TZA,
                               EPWM_TZ_ACTION_HIGH);
        EPWM_setTripZoneAction(ePWMBase, EPWM_TZ_ACTION_EVENT_DCAEVT1,
                               EPWM_TZ_ACTION_HIGH);
    
        //
        // Trigger event when DCAH is high
        //
        EPWM_setTripZoneDigitalCompareEventCondition(ePWMBase,
                                                     EPWM_TZ_DC_OUTPUT_A1,
                                                     EPWM_TZ_EVENT_DCXH_HIGH);
        //
        // Configure DCAH to use the specified as an input
        //
        /*LDRA_INSPECTED 123 S MR:R.10.1,R.10.3,R.10.4 Comment_123S*/
        if((uint16_t)trip < (uint16_t)XBAR_TRIP7)
        {
            tripInputMask = 0x8U << (uint16_t)((uint16_t)trip / 2U);
        }
        else
        {
            tripInputMask = 0x8U << (uint16_t)(((uint16_t)trip / 2U) + 1U);
        }
    
        EPWM_enableDigitalCompareTripCombinationInput(ePWMBase,
                                                      tripInputMask,
                                                      EPWM_DC_TYPE_DCAH);
    
        //
        // Enable DCA as OST
        //
        EPWM_enableTripZoneSignals(ePWMBase, (EPWM_TZ_SIGNAL_OSHT4 |
                                              EPWM_TZ_SIGNAL_DCAEVT1));
    
        //
        // Configure the DCA path to be unfiltered and asynchronous
        //
        EPWM_setDigitalCompareEventSource(ePWMBase,
                                          EPWM_DC_MODULE_A,
                                          EPWM_DC_EVENT_1,
                                          EPWM_DC_EVENT_SOURCE_ORIG_SIGNAL);
    
        //
        // Initializing values for ePWM counter and period
        // DID_30_15
        //
        EPWM_setTimeBaseCounter(ePWMBase, 0U);
        EPWM_setTimeBasePeriod(ePWMBase, period);
    
        //
        // Clear trip flags
        // DID_30_18
        //
        EPWM_clearTripZoneFlag(ePWMBase, EPWM_TZ_INTERRUPT |
                               EPWM_TZ_INTERRUPT_OST);
    
        //
        // Put the time base counter into up-down-count mode
        // DID_30_19
        //
        EPWM_setTimeBaseCounterMode(ePWMBase, EPWM_COUNTER_MODE_UP_DOWN);
    }
    
    //*****************************************************************************
    //
    // STL_PWM_Trip_configECAP(const STL_PWM_Trip_TestHandle testHandle)
    //
    //*****************************************************************************
    void STL_PWM_Trip_configECAP(const STL_PWM_Trip_TestHandle testHandle)
    {
        uint32_t eCAPBase = testHandle->eCAPBase;
        uint32_t XbarInputBase = INPUTXBAR_BASE;
    
        //
        // Disable and clear all capture flags and interrupts
        // DID_30_20, DID_30_21
        //
        /*LDRA_INSPECTED 87 S MR:R.18.4 "LDRA Tool Issue, no actual pointer
          arithmetic in code"*/
        /*LDRA_INSPECTED 567 S MR:R.18.1,R.18.4 "LDRA Tool Issue, no actual pointer
          arithmetic in code"*/
        HWREGH(testHandle->eCAPBase + ECAP_O_ECEINT) &= ~0x00FFU;
    
        /*LDRA_INSPECTED 87 S MR:R.18.4 "LDRA Tool Issue, no actual pointer
          arithmetic in code"*/
        /*LDRA_INSPECTED 567 S MR:R.18.1,R.18.4 "LDRA Tool Issue, no actual pointer
          arithmetic in code"*/
        HWREGH(testHandle->eCAPBase + ECAP_O_ECCLR) = 0x00FFU;
    
        //
        // Disable CAP1-CAP4 register loads
        // DID_30_22
        //
        ECAP_disableTimeStampCapture(eCAPBase);
    
        //
        // Stop the counter
        // DID_30_23
        //
        ECAP_stopCounter(eCAPBase);
    
        //
        // Put the module into capture mode
        // DID_30_24
        //
        ECAP_enableCaptureMode(eCAPBase);
    
        //
        // Use one-shot mode and stop the capture at event 3
        // DID_30_25
        //
        ECAP_setCaptureMode(eCAPBase, ECAP_ONE_SHOT_CAPTURE_MODE, ECAP_EVENT_3);
    
        //
        // Set the polarity of events 1-3 to rising, falling, and rising
        // DID_30_26
        //
        ECAP_setEventPolarity(eCAPBase, ECAP_EVENT_1, ECAP_EVNT_RISING_EDGE);
        ECAP_setEventPolarity(eCAPBase, ECAP_EVENT_2, ECAP_EVNT_FALLING_EDGE);
        ECAP_setEventPolarity(eCAPBase, ECAP_EVENT_3, ECAP_EVNT_RISING_EDGE);
    
        //
        // Reset the counter on event 1 only
        // DID_30_27
        //
        ECAP_enableCounterResetOnEvent(eCAPBase, ECAP_EVENT_1);
        ECAP_disableCounterResetOnEvent(eCAPBase, ECAP_EVENT_2);
        ECAP_disableCounterResetOnEvent(eCAPBase, ECAP_EVENT_3);
    
        //
        // Enable the module
        // DID_30_28
        //
        ECAP_enableLoadCounter(eCAPBase);
        ECAP_startCounter(eCAPBase);
    
        //
        // Set up the Input X-BAR
        // DID_30_29
        //
        XBAR_setInputPin(XbarInputBase, testHandle->xbarInput, testHandle->gpio);
        //added to restor the compatibility with the 37x
        //setting the register ECCCTLx.INPUTSEL
        EALLOW;
    
        HWREGH(ECAP1_BASE + ECCTL0_offset + (uint16_t)input) = pin;
    
        EDIS;
        //ECAP_selectECAPInput(ECAP1_BASE,ECAP_INPUT_INPUTXBAR7);
        //ECAP_selectECAPInput(ECAP1_BASE,ECAP_INPUT_INPUTXBAR7);
    }
    
    //*****************************************************************************
    //
    // STL_PWM_Trip_configCTRIP(const STL_PWM_Trip_CTRIPHandle ctripHandle)
    //
    //*****************************************************************************
    void STL_PWM_Trip_configCTRIP(const STL_PWM_Trip_CTRIPHandle ctripHandle)
    {
        uint32_t cmpssBase = ctripHandle->cmpssBase;
        uint32_t dacBase = ctripHandle->dacBase;
    
        //
        // Set the DAC reference voltage
        // DID_30_30
        //
        DAC_setReferenceVoltage(dacBase, (DAC_ReferenceVoltage)ctripHandle->dacRef);
    
        //
        // Load the DAC value from the shadow on SYSCLK (not PWMSYNC)
        // DID_30_30
        //
        DAC_setLoadMode(dacBase, DAC_LOAD_SYSCLK);
    
        //
        // Enable the DAC output
        // DID_30_31
        //
        DAC_enableOutput(dacBase);
    
        //
        // Set the DAC shadow output to a midpoint value
        // DID_30_32
        //
        DAC_setShadowValue(dacBase, STL_PWM_TRIP_CTRIP_MIDPOINT);
    
        //
        // Enable CMPSS and configure the negative input signal to come from
        // the DAC
        // DID_30_33, DID_30_34, DID_30_35
        //
        CMPSS_enableModule(cmpssBase);
        CMPSS_configHighComparator(cmpssBase, CMPSS_INSRC_DAC);
        CMPSS_configLowComparator(cmpssBase, (CMPSS_INSRC_DAC|CMPSS_INV_INVERTED));
    
        //
        // Set the reference for the DACs and set their values to arbitrary values
        // DID_30_36, DID_30_37
        //
        CMPSS_configDAC(cmpssBase, (uint16_t)(ctripHandle->cmpssRef |
                                        CMPSS_DACVAL_SYSCLK | CMPSS_DACSRC_SHDW));
        CMPSS_setDACValueHigh(cmpssBase, STL_PWM_TRIP_CTRIP_HIGH_THRESH);
        CMPSS_setDACValueLow(cmpssBase, STL_PWM_TRIP_CTRIP_LOW_THRESH);
    
        //
        // Configure the output signals to be asynchronous
        // DID_30_38
        //
        CMPSS_configOutputsHigh(cmpssBase, (CMPSS_TRIP_ASYNC_COMP |
                                            CMPSS_TRIPOUT_ASYNC_COMP));
        CMPSS_configOutputsLow(cmpssBase, (CMPSS_TRIP_ASYNC_COMP |
                                           CMPSS_TRIPOUT_ASYNC_COMP));
    
        //
        // Configure the PWM XBAR
        // DID_30_39
        //
        XBAR_setEPWMMuxConfig(ctripHandle->trip, ctripHandle->muxConfig);
        EALLOW;
    
        /*LDRA_INSPECTED 93 S MR:R.10.1,R.10.3,R.10.4,R.10.5,R.11.1 "LDRA Tool
          Issue, both sides of the operation are the same (uint32_t)"*/
        /*LDRA_INSPECTED 95 S MR:R.11.1,R.11.2,R.11.3,R.11.5,R.11.7 Comment_95S*/
        HWREG(XBAR_EPWM_EN_REG_BASE + (uint16_t)ctripHandle->trip) =
            (uint32_t)1U << (((uint32_t)ctripHandle->muxConfig & 0xFF00U) >> 9);
        EDIS;
    }
    
    //*****************************************************************************
    //
    // STL_PWM_Trip_test(uint32_t eCAPBase, float32_t dutyCycle)
    //
    //*****************************************************************************
    uint16_t STL_PWM_Trip_test(const STL_PWM_Trip_TestHandle testHandle,
                               float32_t dutyCycle)
    {
        uint16_t testStatus;
        uint32_t timeHigh, period;
        float32_t calcDuty;
    
        //
        // Check to make sure all three edges have happened
        // DID_30_48
        //
        if((ECAP_getInterruptSource(testHandle->eCAPBase) &
            ECAP_ISR_SOURCE_CAPTURE_EVENT_3) == ECAP_ISR_SOURCE_CAPTURE_EVENT_3)
        {
            //
            // Calculate the duty cycle based on the values of CAP2 and CAP3
            // DID_30_49
            //
            timeHigh = ECAP_getEventTimeStamp(testHandle->eCAPBase, ECAP_EVENT_2);
            period = ECAP_getEventTimeStamp(testHandle->eCAPBase, ECAP_EVENT_3);
    
            calcDuty = ((float32_t)timeHigh / (float32_t)period) *
                        (float32_t)100.0;
    
            //
            // Check if the calculated duty cycle matches the expected one
            // DID_30_49
            //
            if(fabsf(dutyCycle - calcDuty) <= testHandle->delta)
            {
                //
                // DID_30_51
                //
                testStatus = STL_PWM_TRIP_PASS;
            }
            else
            {
                //
                // Duty cycle didn't match
                // DID_30_50, DID_30_51
                //
                testStatus = STL_PWM_TRIP_FAIL_DUTY_CYCLE;
                STL_Util_setErrorFlag(STL_UTIL_PWM_TRIP_DUTY_CYCLE);
            }
        }
        else
        {
            //
            // eCAP never detected a third edge
            // DID_30_50, DID_30_51
            //
            testStatus = STL_PWM_TRIP_FAIL_MISSING_EDGES;
            STL_Util_setErrorFlag(STL_UTIL_PWM_TRIP_MISSING_EDGES);
        }
    
        //
        // DID_30_51
        //
        return(testStatus);
    }
    
    //
    // End of File
    //
    

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

    另请注意、当我向其写入0x8U 时、ECCLR 寄存器并未更新!!

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

    ECCLR 也是只读0写寄存器。 您可以在参考手册中了解任何寄存器的读写属性。

    谢谢。

    Aditya.