您好、我正在尝试将 PWM 占空比自检从379D 移植到388D、但在 CPU2上运行测试、我的问题是自检代码中有一条用于设置 输入选择寄存器的指令(
EALLOW;
HWREGH (base + XBAR_O_INPUT1SELECT +(uint16_t)输入)=引脚;
EDIS;
)但当我调试时,它似乎没有被设置,除了我无法从 CPU2可视化寄存器之外,我必须停止运行 CPU1才能看到它的内容。

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.
您好、我正在尝试将 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.
啊、我想您说得对、但无论如何、我检查过、我使用占空比更新存储器、但从 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 //