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.

[参考译文] TMDSPREX28335:TMDSPREX28335:GPIO 切换不稳定行为

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017080/tmdsprex28335-tmdsprex28335-gpio-toggle-erratic-behaviour

器件型号:TMDSPREX28335
Thread 中讨论的其他器件: controlSUITE

大家好、

我有一个 TMDSPREX28335实验套件。 它上面有4个 LED、它们连接到 GPIO、如下所示:

LED1:GPIO9

LED2:GPIO11

LED3:GPIO34

LED4:GPIO49

为了理解套件、我使用 了 example_2833xGpioToggle.c 程序的概念并将其修改为仅切换4个 LED 和相应的 GPIO。 为清晰起见、随附代码。

// OBJECTIVE IS TO CONFIGURE GPIOs AS GPIOs
// AND TOGGLE TO OBTAIN A PWM OUTPUT ON OSCILLOSCOPE
// using TOGGLE registers to TOGGLE
// Included Files
//
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

//
// Defines that select the example to compile in.
// Only one example should be set as 1 the rest should be set as 0.
//
#define EXAMPLE3 1  // Use TOGGLE registers to toggle I/O's

//
// Function Prototypes
//
void delay_loop(void);
void Gpio_example3(void);

//
// Main
//
void main(void)
{
    //
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
    //
    InitSysCtrl();

    //
    // Step 2. Initialize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    //
    // InitGpio();  // Skipped for this example

    //
    // For this example use the following configuration
    //
    EALLOW;
    GpioCtrlRegs.GPAMUX1.all = 0x00000000;  // All GPIO
    GpioCtrlRegs.GPAMUX2.all = 0x00000000;  // All GPIO
    GpioCtrlRegs.GPBMUX1.all = 0x00000000;  // All GPIO
    GpioCtrlRegs.GPBMUX2.all = 0x00000000;  // All GPIO
    GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;   // All outputs
    GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;   // All outputs
    GpioCtrlRegs.GPAQSEL1.all = 0x0000;    // GPIO0-GPIO15 Synch to SYSCLKOUT
    GpioCtrlRegs.GPAQSEL2.all = 0x0000;    // GPIO16-GPIO31 Synch to SYSCLKOUT
    GpioCtrlRegs.GPBQSEL1.all = 0x0000;    // GPIO32-GPIO39 Synch to SYSCLKOUT
    GpioCtrlRegs.GPBQSEL2.all = 0x0000;    // GPIO48-GPIO63 Synch to SYSCLKOUT
    GpioCtrlRegs.GPAPUD.all = 0xFFFFFFFF;    // Pullup's disabled GPIO0-GPIO31
    GpioCtrlRegs.GPBPUD.all = 0xFFFFFFFF;    // Pullup's disabled GPIO32-GPIO34
    EDIS;
    //
    // Step 3. Clear all interrupts and initialize PIE vector table
    // Disable CPU interrupts
    //
    DINT;

    //
    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
    //
    InitPieCtrl();

    //
    // Disable CPU interrupts and clear all CPU interrupt flags
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
    //
    InitPieVectTable();

    //
    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2833x_InitPeripherals.c
    //
    // InitPeripherals(); // Not required for this example

    //
    // Step 5. User specific code:
    //
#if EXAMPLE3
    //
    // This example uses TOGGLE registers to toggle I/O's
    //
    Gpio_example3();
#endif
}

//
// delay_loop -
//
void delay_loop()
{
    volatile long i;
    for (i = 0; i < 5000000; i++)
    {
        asm(" NOP");
        EALLOW;
        SysCtrlRegs.WDKEY = 0x55;
        SysCtrlRegs.WDKEY = 0xAA;
        EDIS;
    }
}

//
// Gpio_example3 -
//
void Gpio_example3(void)
{
    //
    // Example 2: Toggle I/Os using TOGGLE registers
    //

    //
    // Set pins to a known state
    //
    GpioDataRegs.GPADAT.bit.GPIO9 =1;
    GpioDataRegs.GPADAT.bit.GPIO11 =0;
    GpioDataRegs.GPBDAT.bit.GPIO34 =1;
    GpioDataRegs.GPBDAT.bit.GPIO49 =0;
    //
    // Use TOGGLE registers to flip the state of the pins.
    // Any bit set to a 1 will flip state (toggle)
    // Any bit set to a 0 will not toggle.
    //
    for(;;)
    {
        GpioDataRegs.GPATOGGLE.bit.GPIO9 =1;
        GpioDataRegs.GPATOGGLE.bit.GPIO11 =1;
        GpioDataRegs.GPBTOGGLE.bit.GPIO34 =1;
        GpioDataRegs.GPBTOGGLE.bit.GPIO49 =1;
        delay_loop();
    }
}

//
// End of File
//

如果我按照所附表中的详细信息将代码 A 位从第131行修改为第134行、我会看到套件出现异常行为。 表中也列出了这些意见。

情况1. 情况2. 情况3. 情况4. 情况5. 情况6. 情况7.
GPIO (LED) GPxDAT GPxDAT GPxSET GPxSET GPxSET GPxCLEAR GPxCLEAR
9 (1) 1 0 0 1 0 1 0
11 (2) 0 1 0 0 1 0 1
34(3) 1 0 1 1 0 1 0
49 (4) 0 1 1 0 1 0 1
观察结果 LED1和 LED2应 相互互补
但是、它们同时  打开和关闭。
LED3和 LED4之间的开关相互补充。

不稳定的行为
LED1和 LED2也会亮起。
LED3和 LED4也会亮起。


正常行为

LED1和 LED2完全不发光。 LED3和 LED4同样亮起。

不稳定的行为

LED1和 LED2也会亮起。
LED3和 LED4也会亮起。


正常行为
LED1和 LED2也会亮起。
LED3和 LED4也会亮起。


正常行为
LED1、LED2、LED3和 LED4都 同时打开和关闭。




不稳定的行为
LED1、LED2、LED3和 LED4都 同时打开和关闭。




不稳定的行为

有人能不能简单地说明 为什么我在案例1、3、6和7中遇到这种异常行为?

此致、

Ankit

PS: 可能还有更多可能的组合、我尚未尝试、这些组合可能会产生意外输出!!!!

PPS:详尽的解释或/和批评是/是非常受欢迎的

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

    Ankit、

    感谢您访问 E2E 论坛。  我在您的代码中看不到任何不正确的内容、我正在尝试在本地找到 PREX 板、以查看是否可以重现。

    同时、您能否找到跳线 J8和 J9并确保它们未被组装?  跳线的目的是将 LED1和 LED2连接到 SPI 通道以显示活动、但在本例中、这些信号的 GPIO 可能会与您在 GPIO9和 GPIO11中写入的任何"1"相对应、假设采用默认配置。

    最棒的
    Matthew

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

    Matthew、您好!

    我感谢你的慷慨投入,并对不立即答复表示诚挚的歉意。

    根据您在电路板上的建议、我确实移除了跳线 J8和 J9、令我惊讶的是、所附表中针对 GPxSET 的所有可能16种组合都得到了验证

    GPIO (LED) 情况1. 情况2. 情况3. 情况4. 情况5. 情况6. 情况7. 情况8. 判例9. 判例10 判例11. 判例12. 判例13. 判例14. 情况15. 判例16
    09(1) 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
    11 (2) 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
    34(3) 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
    49 (4) 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

    但是 、所有这16个组合在切换时都没有为 GPxCLEAR 和 GPxDAT 提供预期输出。

    CLEAR = 0和 DAT = 1 应 使 GPIO 变为高电平(根据我的理解、我肯定会出错)。 同样、CLEAR = 1和 DAT = 0应将 GPIO 设为低电平。

    因此、如果我们切换 Clear = 0;DAT = 1 (GPIO =高电平)、我们应该得到 Clear = 1;DAT = 0 (GPIO =低电平)。 那么、为什么切换会产生意外输出?

    我是否会做出错误的假设?

    如果您能为我澄清这一概念,我将不胜感激。

    此致、

    Ankit

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

    Ankit、

    我很高兴跳线是导致外部驱动器问题的原因。

    就 GPIOTOGGLE/GPIOCLEAR/GPIOSET 寄存器而言、这些寄存器将始终读回"0"。  向它们写入"1"将产生您在相应 GPIO 引脚上提到的效果、但寄存器中没有可读回的信息来确定 GPIO 引脚的状态、或者寄存器位是否之前已置位。

    只有 GPIODAT 寄存器将显示 GPIO 引脚的当前状态;此外、还可以写入该寄存器以影响 GPIO 引脚的状态。

    我们包括切换/置位/清零、因为它提供了一种更少的插入式方法来更改 GPIO 引脚状态、并且节省了 C28x CPU 的任何回读周期、而不是使用 GPIODAT 寄存器来更改引脚状态。

    最棒的

    Matthew

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

    Matthew、您好!

    我再次感谢你的意见,我必须再次对由于健康问题而造成的这种迟交的答复表示歉意。
    我知道、很难预测在切换 GPIOCLEAR=0时可能获得的输出、因此最好避免这种情况。
    但是、当切换 GPIOSET=0时、我没有遇到这样的两难问题。

     我在这里要做的另一项声明是关于 GPxDAT 寄存器的。

    GPIO
    (LED)
    情况
    1
    情况
    2.
    情况
    3.
    情况
    4.
    情况
    5.
    情况
    6.
    情况
    7.
    情况
    8.
    情况
    9.
    情况
    10.
    情况
    11.
    情况
    12.
    情况
    13.
    情况
    14.
    情况
    15.
    情况
    16.
    09(1) 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
    11 (2) 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
    34(3) 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
    49 (4) 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
    观察结果 正常行为 正常行为 正常行为 正常行为 正常行为 正常行为 正常行为 正常行为 GPIO 11、34和49应一起切换并作为 GPIO 9的补充。
    但是、所有 GPIO 同时打开和关闭。  
    GPIO 9和49应一起切换并对 GPIO 11和34进行补充。
    但是、GPIO 9、11和34同时打开和关闭、同时对 GPIO 49进行补充。
    GPIO 9和34应同时为高电平、并对 GPIO 11和49进行补充。
    而 GPIO 9、11和49显示相同的输出、并且是 GPIO 34的补充。
    GPIO 9、34和49应同相、GPIO 11应异相。 但这次9和11一起工作,但与34和49的情况相反。 GPIO 9和11应共同为高电平、34和49应共同为低电平。
    此时、GPIO 9、34和49处于同相状态、GPIO 11处于异相状态。
    GPIO 9、11和49应该是 GPIO 34的补充、但是、在测试期间、GPIO 9和34彼此同相、同时与 GPIO 11和49异相。 GPIO 9、11和34应同时为高电平、而 GPIO 49应为低电平。
    这一次、GPIO 9和49相互同相、同时对 GPIO 11和34进行补充。
    所有 GPIO 应一起切换、但是 GPIO 9与 GPIO 11、34和49异相。

    从上表中我唯一能够同意的是、切换操作是在第9个 GPIO 为0之前使用精细的 GPxDAT 寄存器。
    一旦我将 GPIO 9设为1、它就会开始切换其他三个 GPIO 11、34和49。
    根据 您上次的回答、我假设 在使用 GPxDAT 寄存器时可以进行切换、但事实证明我已经错了。
    到目前为止、我仅使用4个 LED 进行了演示。 是否可以通过 将 GPxDAT = 1设置为 GPIO 09 来强制其他 GPIO 的输出切换?
    我是在某个地方犯了个错误吗?

    此致、
    Ankit

    PS:J8和 J9仍从电路板上移除

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

    Ankit、

    GPIO9不应对其他 GPIO 产生任何影响。  如果您看到这种情况、我认为这必须与 PREX 或控制卡上的硬件相关。

    在查看原理图以了解任何可能的解释时、您能否执行以下操作:

    使 GPIO 11、34、49的 GPADIR/GPBDIR 全部为0;这只是使它们成为输入。

    将 GPIO 9保留为输出(GPADIR =1)并使用 GPADAT 寄存器更改其状态;您是否仍观察 GPIO9之后的其他 IO?

    如果是、您是否看到与每个 IO 相关联的 GPxDAT 反映了引脚的状态?

    您是否还可以附加代码来遍历上述状态(如果它与之前发布的代码不同)。

    希望您也感觉更好。

    最棒的

    Matthew

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

    Matthew、您好!

    好的、现在一切都很好!! 再次感谢您的回复。

    我做了你告诉我的事情。 我将 GPIO 11、34和49锁定为输入、方法是使它们的 DIR 为0、同时将 GPIO 9保持为输出。 我在 GPIO 9、11、34和49的 GPxDAT 上尝试了所有16种可能的1和0组合、并切换了所有这些情况。 正如预期的那样、只有 GPIO 9表现出切换行为。 但是、从所有这16次迭代中、还有一个观察结果。 GPIO 34 (LED 3)保持永久关闭、GPIO 11、49 (LED 2、4)保持永久打开。

    所有这些引脚(11、34和49)都应一起高电平或低电平、因为它们充当输入、但为什么34对11和49都是互补的?

    我们在这里打开一个蠕虫的 CAN,是否过于深入地寻求澄清?

    此致、
    Ankit

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

    Ankit、

    不用担心、GPIO 逻辑应该以直接的方式运行、出于某种原因、它不是。  正如我之前提到的、器件 POV 没有任何可能导致这种情况的原因、因此我认为 PREX 电路板上存在一些问题、我们都没有发现这种问题。

    我认为 GPIO49可能是该引脚上的内部上拉结果。  GPIO34在复位时也应该具有这一点、同时 GPIO11被禁用。

    如果您可以检查 GPAPUD 和 GPBPUD 寄存器、如果将确认哪些已禁用(1已禁用)。  我们正在运行的代码可能将这些设置为不同于重置。

    在任何情况下、我都将尝试在 PREX 板上手动检查此情况。

    最棒的

    Matthew

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

    Matthew、您好!

    再次感谢您的输入、您在调试阶段的保证意义很大。

    所有 GPIO 上的 Pud 为1 (代码的第53行和第54行)。

    但愿这对您有所帮助。

    此致、
    Ankit

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

    Ankit、

    我需要另外一天来获取数据、感谢您在这里的耐心等待。

    最棒的

    Matthew

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

    您好、Matthew、

    完全不用担心。 请别着急,慢慢来。

    此致、
    Ankit

    PS:非常抱歉给 你带来这么大的脖子痛!!

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

    Matthew、您好!

    我会提前道歉、因为这会给您带来更多的麻烦。

    由于某种原因,我无法提出新的问题,因此我将尝试答复这一帖子并提出我的问题。

    问题1:为什么每次 尝试提出新问题时都要将其转至以下 URL (e2e.ti.com/.../ti_errorpage)?

    查询2:您能帮我进行 DBRED、TBCLK 和 TBPRD 计算吗?

    我有以下设置:
    FSYSCLKOUT=150MHz、这意味着 TSYSCLKOUT=6.66667ns = SYSCLKOUT
    CLKDIV = 0、即 CLKDIV = 1
    HSPCLKDIV = 1、即 HSPCLKDIV = 2

    我 µs 创建一个10 μ s 的上升沿延迟。 我需要1kHz 或 TPWM = 1ms 的 PWM。

    TBCLK 计算:

    TBCLK = SYSCLKOUT/(HSPCLKDIV*CLKDIV)
    TBCLK =(6.66667ns)/(2*1)
    TBCLK = 3.33335ns
    TBPRD 计算(对于上行-下行模式):

    TBPRD = 0.5*TPW/(TSYSCLKOUT*HSPCLKDIV*CLKDIV)
    TBPRD = 0.5*(1ms)/(6.6667n*2*1)
    TBPRD = 37500

    DBRED 计算:

    上升沿延迟= TBCLK*DBRED
    DBRED =上升沿延迟/ TBCLK
    DBRED =( µs μ s)/(3.33335ns)
    DBRED = 299.985 ~ 3000


     µs、根据以下代码、DBRED = 750、以生成相同的10 μ s 时间延迟(请参阅代码的第132行和第133行)。

    //
    //      Lab7_6: TMS320F28335
    //      (c) Frank Bormann
    //
    //###########################################################################
    //
    // FILE:	Lab7_6.c
    // 
    // TITLE:	DSP28335ControlCARD; ePWM1A 1KHz output
    //			variable pulse width
    //			complementary signal at ePWM1B
    //			plus dead band rising edge delay
    //			solution file for Lab7_6
    //###########################################################################
    //  Ver | dd mmm yyyy | Who  | Description of changes
    // =====|=============|======|===============================================
    //  3.0 | 15 Apr 2009 | F.B. | Lab7_6 for F28335; 
    //  3.1 | 10 Nov 2009 | F.B  | Lab7_6 for F28335 and PE revision 5
    //###########################################################################
    #include "DSP2833x_Device.h"
    
    // external function prototypes
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    extern void InitCpuTimers(void);
    extern void ConfigCpuTimer(struct CPUTIMER_VARS *, float, float);
    
    
    // Prototype statements for functions found within this file.
    void Gpio_select(void);
    void Setup_ePWM1(void);
    interrupt void cpu_timer0_isr(void);
    
    //###########################################################################
    //						main code									
    //###########################################################################
    void main(void)
    {
    	int counter=0;	// binary counter for digital output
    
    	InitSysCtrl();	// Basic Core Init from DSP2833x_SysCtrl.c
    
    	EALLOW;
       	SysCtrlRegs.WDCR= 0x00AF;	// Re-enable the watchdog 
       	EDIS;			// 0x00AF  to NOT disable the Watchdog, Prescaler = 64
    
    	DINT;				// Disable all interrupts
    	
    	Gpio_select();		// GPIO9, GPIO11, GPIO34 and GPIO49 as output
    					    // to 4 LEDs at Peripheral Explorer Board
    
    	Setup_ePWM1();		// init of ePWM1A
    
    	InitPieCtrl();		// basic setup of PIE table; from DSP2833x_PieCtrl.c
    	
    	InitPieVectTable();	// default ISR's in PIE
    
    	EALLOW;
    	PieVectTable.TINT0 = &cpu_timer0_isr;
    	EDIS;
    
    	InitCpuTimers();	// basic setup CPU Timer0, 1 and 2
    
    	ConfigCpuTimer(&CpuTimer0,150,100);
    
    	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
    	IER |=1;
    
    	EINT;
    	ERTM;
    
    	CpuTimer0Regs.TCR.bit.TSS = 0;	// start timer0
    
    	while(1)
    	{    
    	  		while(CpuTimer0.InterruptCount == 0);
    			CpuTimer0.InterruptCount = 0;
    			
    			EALLOW;
    			SysCtrlRegs.WDKEY = 0x55;	// service WD #1
    			EDIS;
    
    	  		counter++;
    			if(counter&1) GpioDataRegs.GPASET.bit.GPIO9 = 1;
    				else GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
    			if(counter&2) GpioDataRegs.GPASET.bit.GPIO11 = 1;
    				else GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;
    			if(counter&4) GpioDataRegs.GPBSET.bit.GPIO34 = 1;
    				else GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
    			if(counter&8) GpioDataRegs.GPBSET.bit.GPIO49 = 1;
    				else GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
    	}
    } 
    
    void Gpio_select(void)
    {
    	EALLOW;
    	GpioCtrlRegs.GPAMUX1.all = 0;		// GPIO15 ... GPIO0 = General Puropse I/O
    	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;	// ePWM1A active
    	GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 1;	// ePWM1B active
    
    	GpioCtrlRegs.GPAMUX2.all = 0;		// GPIO31 ... GPIO16 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX1.all = 0;		// GPIO47 ... GPIO32 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX2.all = 0;		// GPIO63 ... GPIO48 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX1.all = 0;		// GPIO79 ... GPIO64 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX2.all = 0;		// GPIO87 ... GPIO80 = General Purpose I/O
    	 
    	GpioCtrlRegs.GPADIR.all = 0;
    	GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;	// peripheral explorer: LED LD1 at GPIO9
    	GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;	// peripheral explorer: LED LD2 at GPIO11
    
    	GpioCtrlRegs.GPBDIR.all = 0;		// GPIO63-32 as inputs
    	GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;	// peripheral explorer: LED LD3 at GPIO34
    	GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    	GpioCtrlRegs.GPCDIR.all = 0;		// GPIO87-64 as inputs
    	EDIS;
    }  
    
    void Setup_ePWM1(void)
    {
    	EPwm1Regs.TBCTL.bit.CLKDIV =  0;	// CLKDIV = 1		
    	EPwm1Regs.TBCTL.bit.HSPCLKDIV = 1;	// HSPCLKDIV = 2
    	EPwm1Regs.TBCTL.bit.CTRMODE = 2;	// up - down mode
    
    	EPwm1Regs.AQCTLA.all = 0x0060;		// set ePWM1A on CMPA up
    										// clear ePWM1A on CMPA down
    	EPwm1Regs.TBPRD = 37500;			// 1KHz - PWM signal
    	EPwm1Regs.CMPA.half.CMPA  = 18750;	// 50% duty cycle first
    
    	EPwm1Regs.DBRED = 750;				// 10 microseconds delay
    	EPwm1Regs.DBFED = 750;				// for rising and falling edge
    	EPwm1Regs.DBCTL.bit.OUT_MODE = 3;	// ePWM1A = RED
    	EPwm1Regs.DBCTL.bit.POLSEL = 2;		// S3=1 inverted signal at ePWM1B
    	EPwm1Regs.DBCTL.bit.IN_MODE = 0;	// ePWM1A = source for RED & FED
    } 
    
    interrupt void cpu_timer0_isr(void)
    {
    	
    	CpuTimer0.InterruptCount++;
    	EALLOW;
    	SysCtrlRegs.WDKEY = 0xAA;	// service WD #2
    	EDIS;
    	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    //===========================================================================
    // End of SourceCode.
    //===========================================================================


    我的 TBCLK 计算不正确吗? 可以帮我处理我的问题吗?

    此致、
    Ankit

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

    您好、Ankit、

    [引用 userid="492029" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017080/tmdsprex28335-tmdsprex28335-gpio-toggle-erratic-behavior/3777394 #3777394"]查询2:您能帮助我进行 DBRED、TBCLK 和 TBPRD 计算吗?

    若要查找 TBCLK 的值、请执行以下操作:

    TBCLK = SYSCLKOUT /(HSPCLKDIV*CLKDIV)、这意味着、

    TBCLK = 150m/(2*1)= 75M

    要 计算上数-下数模式的 TBPRD:

    TPWM = 2 x TBPRD x TTBCLK

    对其进行重新排列后、

    TBPRD = TPWM /(2*TTBCLK)、这与 TBPRD =  TPWM /(2*(1/TBCLK))相同

    TBPRD =  TPW/(2*(1/TBCLK))=(1m)/(2*(1/75M))= 37500

    要计算上升沿延迟10uec 的死区值、请执行以下操作:

    红色= DBRED×TTBCLK

    DBRED =红色/与 DBRED 相同的 TTBCLK =红色/(1/TBCLK)

    DBRED =红色/(1/TBCLK)=(10U)/(1/75M)= 750

    此处的重要注意事项是 TTBCLK 和 TBCLK 之间的区别。

    希望这对您有所帮助!

    此致、

    Marlyn

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

    您好、Marlyn、

    非常感谢您的极其准确的解释。 这很有帮助。

    我通过假设 SYSCLKOUT 和 TBCLK 为时间值来做了一个错误、而实际上、这些是频率。 一旦我理解了这个概念,数学就会自动展开。

    不过、我对我的查询1有什么想法? 为什么会发生这种情况? 即使我彻底清除了缓存和浏览历史记录、但在重新登录后、我也无法发布新的查询、我也被转到了前面提到的 URL。 为什么会发生这种情况? 有什么想法吗?

    此致、
    Ankit

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

    大家好、

    我再次对延长线程表示歉意、因为我无法发布新问题。 这次我有一个有关中断初始化的查询。

    第1个代码(  其中一个 C2000技术讲座中的实验6)

    //
    //      Lab6: TMS320F28335
    //      (c) Frank Bormann
    //
    //###########################################################################
    //
    // FILE:	Lab6.c
    // 
    // TITLE:	DSP28335ControlCARD; Digital Output
    //			4 - bit - counter at 4 LEDs LD1(GPIO9), LD2(GPIO11), LD3(GPIO34)
    //			and LD4 (GPIO49) 
    //			CPU Timer 0 period and Interrupt Service
    //			solution file for Lab6
    //###########################################################################
    //  Ver | dd mmm yyyy | Who  | Description of changes
    // =====|=============|======|===============================================
    //  3.0 | 02 May 2008 | F.B. | Lab6 for F28335; 
    //  3.1 | 08 Nov 2009 | F.B  | Lab6 for F28335 and PE revision5
    //###########################################################################
    #include "DSP2833x_Device.h"
    
    // external function prototypes
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    extern void InitCpuTimers(void);
    extern void ConfigCpuTimer(struct CPUTIMER_VARS *, float, float);
    
    // Prototype statements for functions found within this file.
    void Gpio_select(void);
    interrupt void cpu_timer0_isr(void);
    
    //###########################################################################
    //						main code									
    //###########################################################################
    void main(void)
     {
    	int counter=0;	// binary counter for digital output
    
    	InitSysCtrl();	// Basic Core Init from DSP2833x_SysCtrl.c
    
    	EALLOW;
       	SysCtrlRegs.WDCR= 0x00AF;	// Re-enable the watchdog 
       	EDIS;			// 0x00AF  to NOT disable the Watchdog, Prescaler = 64
    
    	DINT;				// Disable all interrupts
    	
    	Gpio_select();		// GPIO9, GPIO11, GPIO34 and GPIO49 as output
    					    // to 4 LEDs at Peripheral Explorer)
    
    	InitPieCtrl();		// basic setup of PIE table; from DSP2833x_PieCtrl.c
    	
    	InitPieVectTable();	// default ISR's in PIE
    
    	EALLOW;
    	PieVectTable.TINT0 = &cpu_timer0_isr;
    	EDIS;
    
    	InitCpuTimers();	// basic setup CPU Timer0, 1 and 2
    
    	ConfigCpuTimer(&CpuTimer0,150,100000); // CPU - Timer0 at 100 milliseconds
    
    	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
    	IER |=1;
    
    	EINT;
    	ERTM;
    
    	CpuTimer0Regs.TCR.bit.TSS = 0;	// start timer0
    
    	while(1)
    	{    
    	  		while(CpuTimer0.InterruptCount == 0);
    			CpuTimer0.InterruptCount = 0;
    			
    			EALLOW;
    			SysCtrlRegs.WDKEY = 0x55;	// service WD #1
    			EDIS;
    
    	  		counter++;
    			if(counter&1) GpioDataRegs.GPASET.bit.GPIO9 = 1;
    				else GpioDataRegs.GPACLEAR.bit.GPIO9 = 1;
    			if(counter&2) GpioDataRegs.GPASET.bit.GPIO11 = 1;
    				else GpioDataRegs.GPACLEAR.bit.GPIO11 = 1;
    			if(counter&4) GpioDataRegs.GPBSET.bit.GPIO34 = 1;
    				else GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1;
    			if(counter&8) GpioDataRegs.GPBSET.bit.GPIO49 = 1;
    				else GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1;
    	}
    } 
    
    void Gpio_select(void)
    {
    	EALLOW;
    	GpioCtrlRegs.GPAMUX1.all = 0;		// GPIO15 ... GPIO0 = General Puropse I/O
    	GpioCtrlRegs.GPAMUX2.all = 0;		// GPIO31 ... GPIO16 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX1.all = 0;		// GPIO47 ... GPIO32 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX2.all = 0;		// GPIO63 ... GPIO48 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX1.all = 0;		// GPIO79 ... GPIO64 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX2.all = 0;		// GPIO87 ... GPIO80 = General Purpose I/O
    	 
    	GpioCtrlRegs.GPADIR.all = 0;
    	GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;	// peripheral explorer: LED LD1 at GPIO9
    	GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;	// peripheral explorer: LED LD2 at GPIO11
    
    	GpioCtrlRegs.GPBDIR.all = 0;		// GPIO63-32 as inputs
    	GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;	// peripheral explorer: LED LD3 at GPIO34
    	GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    	GpioCtrlRegs.GPCDIR.all = 0;		// GPIO87-64 as inputs
    	EDIS;
    }   
    
    interrupt void cpu_timer0_isr(void)
    {
    	CpuTimer0.InterruptCount++;
    	EALLOW;
    	SysCtrlRegs.WDKEY = 0xAA;	// service WD #2
    	EDIS;
    	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    //===========================================================================
    // End of SourceCode.
    //===========================================================================


    如您在第1个代码中所见、仅63行就足以进行 TINT0初始化。

    第2个代码(Example_2833xLEDBlink.c 取自 针对 F2833x 的 controlSUITE 中给出的示例代码)

    //###########################################################################
    // Description:
    //! \addtogroup f2833x_example_list
    //!  <h1>Timer based blinking LED (timed_led_blink)</h1>
    //!
    //! This example configures CPU Timer0 for a 500 msec period, and toggles the GPIO32
    //! LED on the 2833x eZdsp once per interrupt. For testing purposes, this example
    //! also increments a counter each time the timer asserts an interrupt.
    //!
    //!  \b Watch \b Variables \n
    //!  - CpuTimer0.InterruptCount
    //!
    //! \b External \b Connections \n
    //!  - Monitor the GPIO32 LED blink on (for 500 msec) and off (for 500 msec) on
    //!    the 2833x eZdsp.
    //
    //###########################################################################
    // $TI Release: F2833x/F2823x Header Files and Peripheral Examples V142 $
    // $Release Date: November  1, 2016 $
    // $Copyright: Copyright (C) 2007-2016 Texas Instruments Incorporated -
    //             http://www.ti.com/ ALL RIGHTS RESERVED $
    //###########################################################################
    
    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
    
    // Prototype statements for functions found within this file.
    __interrupt void cpu_timer0_isr(void);
    
    void main(void)
    {
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2833x_SysCtrl.c file.
       InitSysCtrl();
    
    // Step 2. Initialize GPIO:
    // This example function is found in the DSP2833x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    // InitGpio();  // Skipped for this example
    
    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;
    
    // Initialize the PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2833x_PieCtrl.c file.
       InitPieCtrl();
    
    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;
    
    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2833x_DefaultIsr.c.
    // This function is found in DSP2833x_PieVect.c.
       InitPieVectTable();
    
    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW;  // This is needed to write to EALLOW protected registers
       PieVectTable.TINT0 = &cpu_timer0_isr;
       EDIS;    // This is needed to disable write to EALLOW protected registers
    
    // Step 4. Initialize the Device Peripheral. This function can be
    //         found in DSP2833x_CpuTimers.c
       InitCpuTimers();   // For this example, only initialize the Cpu Timers
    #if (CPU_FRQ_150MHZ)
    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 150MHz CPU Freq, 50 millisecond Period (in uSeconds)
       ConfigCpuTimer(&CpuTimer0, 150, 500000);
    #endif
    #if (CPU_FRQ_100MHZ)
    // Configure CPU-Timer 0 to interrupt every 500 milliseconds:
    // 100MHz CPU Freq, 50 millisecond Period (in uSeconds)
       ConfigCpuTimer(&CpuTimer0, 100, 500000);
    #endif
    
    // To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any
    // of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in DSP2833x_CpuTimers.h), the
    // below settings must also be updated.
    
       CpuTimer0Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
    
    // Step 5. User specific code, enable interrupts:
    
    // Configure GPIO32 as a GPIO output pin
       EALLOW;
       GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
       GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
       EDIS;
    
    // Enable CPU INT1 which is connected to CPU-Timer 0:
       IER |= M_INT1;
    
    // Enable TINT0 in the PIE: Group 1 interrupt 7
       PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
    // Enable global Interrupts and higher priority real-time debug events:
       EINT;   // Enable Global interrupt INTM
       ERTM;   // Enable Global realtime interrupt DBGM
    
    // Step 6. IDLE loop. Just sit and loop forever (optional):
       for(;;);
    }
    
    
    __interrupt void cpu_timer0_isr(void)
    {
       CpuTimer0.InterruptCount++;
       GpioDataRegs.GPBTOGGLE.bit.GPIO32 = 1; // Toggle GPIO32 once per 500 milliseconds
       // Acknowledge this interrupt to receive more interrupts from group 1
       PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }
    
    
    //===========================================================================
    // No more.
    //===========================================================================


    在这里、TINT0已经被初始化两次(第87行和第101行)。 相反、我只能为 TSS 位修改第87行吗? 为什么 TINT0被初始化两次?

    第三个代码(再次从 C2000技术讲座之一进行实验7_9)

    //
    //      Lab7_9: TMS320F28335
    //      (c) Frank Bormann
    //
    //###########################################################################
    //
    // FILE:	Lab7_9.c
    // 
    // TITLE:	DSP28335ControlCARD; ePWM1A 500KHz PWM signal
    //			sine wave output via ePWM1A at low pass filter "DAC-1" (J11-1)
    //			solution file for Lab7_9
    //###########################################################################
    //  Ver | dd mmm yyyy | Who  | Description of changes
    // =====|=============|======|===============================================
    //  3.0 | 18 Apr 2009 | F.B. | Lab7_9 for F28335; 
    //  3.1 | 11 Nov 2009 | F.B  | Lab7_9 for F28335 and PE revision 5
    //###########################################################################
    #include "DSP2833x_Device.h"
    #include "IQmathLib.h"
    #pragma DATA_SECTION(sine_table,"IQmathTables");
    _iq30 sine_table[512];
    // external function prototypes
    extern void InitSysCtrl(void);
    extern void InitPieCtrl(void);
    extern void InitPieVectTable(void);
    
    // Prototype statements for functions found within this file.
    void Gpio_select(void);
    void Setup_ePWM1(void);
    interrupt void ePWM1A_compare_isr(void);
    
    //###########################################################################
    //						main code									
    //###########################################################################
    void main(void)
    {
    	InitSysCtrl();	// Basic Core Init from DSP2833x_SysCtrl.c
    
    	EALLOW;
       	SysCtrlRegs.WDCR= 0x00AF;	// Re-enable the watchdog 
       	EDIS;			// 0x00AF  to NOT disable the Watchdog, Prescaler = 64
    
    	DINT;				// Disable all interrupts
    	
    	Gpio_select();		// GPIO9, GPIO11, GPIO34 and GPIO49 as output
    					    // to 4 LEDs at Peripheral Explorer Board
    
    	Setup_ePWM1();		// init of ePWM1A
    
    	InitPieCtrl();		// basic setup of PIE table; from DSP2833x_PieCtrl.c
    	
    	InitPieVectTable();	// default ISR's in PIE
    
    	EALLOW;
    	PieVectTable.EPWM1_INT = &ePWM1A_compare_isr;
    	EDIS;
    
    	// Enable EPWM1A INT in the PIE: Group 3 interrupt 1
       	PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
    
    	IER |=4;			// enable INT3 for ePWM1
    
    	EINT;
    	ERTM;
    
    	while(1)
    	{    
    	  	EALLOW;
    		SysCtrlRegs.WDKEY = 0x55;	// service WD #1
    		EDIS;
    	}
    } 
    
    void Gpio_select(void)
    {
    	EALLOW;
    	GpioCtrlRegs.GPAMUX1.all = 0;		// GPIO15 ... GPIO0 = General Puropse I/O
    	GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1;	// ePWM1A active
    	
    	GpioCtrlRegs.GPAMUX2.all = 0;		// GPIO31 ... GPIO16 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX1.all = 0;		// GPIO47 ... GPIO32 = General Purpose I/O
    	GpioCtrlRegs.GPBMUX2.all = 0;		// GPIO63 ... GPIO48 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX1.all = 0;		// GPIO79 ... GPIO64 = General Purpose I/O
    	GpioCtrlRegs.GPCMUX2.all = 0;		// GPIO87 ... GPIO80 = General Purpose I/O
    	 
    	GpioCtrlRegs.GPADIR.all = 0;
    	GpioCtrlRegs.GPADIR.bit.GPIO9 = 1;	// peripheral explorer: LED LD1 at GPIO9
    	GpioCtrlRegs.GPADIR.bit.GPIO11 = 1;	// peripheral explorer: LED LD2 at GPIO11
    
    
    	GpioCtrlRegs.GPBDIR.all = 0;		// GPIO63-32 as inputs
    	GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;	// peripheral explorer: LED LD3 at GPIO34
    	GpioCtrlRegs.GPBDIR.bit.GPIO49 = 1; // peripheral explorer: LED LD4 at GPIO49
    	GpioCtrlRegs.GPCDIR.all = 0;		// GPIO87-64 as inputs
    	EDIS;
    }  
    
    void Setup_ePWM1(void)
    {
    	EPwm1Regs.TBCTL.bit.CLKDIV =  0;	// CLKDIV = 1		
    	EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0;	// HSPCLKDIV = 1
    	EPwm1Regs.TBCTL.bit.CTRMODE = 2;	// up - down mode
    
    	EPwm1Regs.AQCTLA.all = 0x0060;		// set ePWM1A on CMPA up
    										// clear ePWM1A on CMPA down
    	EPwm1Regs.TBPRD = 150;				// timer period for 500 KHz
    										// TBPRD = 1/2 ( 150 MHz / 500 kHz) 
    	EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD / 2;	// 50% duty cycle first
    	
    	EPwm1Regs.ETSEL.all = 0;
    	EPwm1Regs.ETSEL.bit.INTEN = 1;		// interrupt enable for ePWM1
    	EPwm1Regs.ETSEL.bit.INTSEL = 5;		// interrupt on CMPA down match
    	EPwm1Regs.ETPS.bit.INTPRD = 1;		// interrupt on first event
    	
    } 
    
    interrupt void ePWM1A_compare_isr(void)
    // ISR runs every 2000 ns (PWM-frequency = 500 KHz)
    // and is triggered by ePWM1 compare event
    // run - time of ISR is 630 ns
    {
    	static unsigned int index=0;  
       	// Service watchdog every interrupt
       	EALLOW;
    	SysCtrlRegs.WDKEY = 0xAA;		// Service watchdog #2
    	EDIS;
       
    	EPwm1Regs.CMPA.half.CMPA =  EPwm1Regs.TBPRD - _IQsat(_IQ30mpy((sine_table[index]+_IQ30(0.9999))/2,EPwm1Regs.TBPRD),EPwm1Regs.TBPRD,0);
     
        index +=1;          // use next element out of lookup table
        if (index >511) index = 0;
       
    	EPwm1Regs.ETCLR.bit.INT = 1;		// Clear ePWM1 Interrupt flag
        
       	// Acknowledge this interrupt to receive more interrupts from group 3
       	PieCtrlRegs.PIEACK.all = 4;
    }
    //===========================================================================
    // End of SourceCode.
    //===========================================================================


    此处 EPWM1_INT 已初始化两次(第59和111行)。 我是否可以随意删除第111行、仅处理第59行、就像第一个代码中仅使用第63行一样?

     代码1中给出的中断初始化是否与代码2和3中的中断初始化有任何不同?
    是否有人会对我的天真视而不见并帮助我理解?

    此致、
    Ankit

    PS:我再次非常抱歉、但我无法发布新问题、 在这里、我的回复将持续扩展此主题。 如果可以通过某种方式修复该错误。

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

    您好、Ankit、

    [引用 userid="492029" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017080/tmdsprex28335-tmdsprex28335-gpio-toggle-erratic-behavior/3779238 #3779238]\n 我只能发布新问题, 在这里回复将持续扩展此主题。 如果可以通过某种方式修复此错误。

    我们正在努力确定正在发生的情况。 我们将在获得有关此事的一些信息后通知您。


    以下两行代码中的任何一行可用于启动计时器。 在第一行中 、如果 ConfigCpuTimer 或 InitCpuTimers 中的某些内容发生更改、您只需小心。

     CpuTimer0Regs.TCR.all = 0x4000; // Use write-only instruction to set TSS bit = 0
     CpuTimer0Regs.TCR.bit.TSS = 0;	 // start timer0

    据说 TINT0只是定时器0的中断信号。 这不需要"初始化"、而是只需设置、只需通过以下行即可完成:

    EALLOW;
    PieVectTable.TINT0 = &cpu_timer0_isr;
    EDIS;
    
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    
    IER |=1;
    
    EINT;
    ERTM;

    上面的代码启用定时器0的中断并将定时器0的中断服务例程(ISR)映射到 CPU_timer0_ISR

    为了初始化定时器本身、使用了以下代码行:

    InitCpuTimers();	// basic setup CPU Timer0, 1 and 2
    
    ConfigCpuTimer(&CpuTimer0,150,100000); // CPU - Timer0 at 100 milliseconds


    对于 ePWM、有许多子模块、其中一个子模块是事件触发器子模块。 此子模块负责 启用 将触发中断的 EPWM 事件。 因此、在这种情况下、ePWM 中断需要两行代码。 一种是在 PIE 级别启用中断、另一种是在 IP 级别启用中断。

    // Enable EPWM1A INT in the PIE: Group 3 interrupt 1
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
       	
    EPwm1Regs.ETSEL.bit.INTEN = 1;		// interrupt enable for ePWM1

    此致、

    Marlyn

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

    您好、Marlyn、

    我对将近一个月后作出答复表示诚挚的歉意,我实际上感谢你的答复。

    在您的回复中、您提到我们可以使用以下两行之一:

    1) CpuTimer0Regs.TCR.ALL = 0x4000;//使用只写指令将 TSS 位设置为0
    2) 2) CpuTimer0Regs.tcr.bit.tss = 0;//启动 timer0

    4000 (在第1行中)使第14位(定时器中断使能)为1、换句话说、这意味着我们已经启用/激活了 TINT0中断。 但我们已经通过以下声明做到了这一点:

    EALLOW;
    PieVectTable.TINT0 =&CPU_timer0_ISR;
    EDIS;
    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    IER |=1;
    EINT;
    ERTM;

    我了解了您对 ePWM 中断激活的解释及其背后的方法、但为什么要启用/激活 TINT0两次? 因为我能够完美地运行 TSS = 0选项上的定时器中断程序。

    关于 我 无法打开新帖子、我今天看到以下错误消息:

    禁止
    您无权访问此服务器上的/idp/startSSO.ping。

    此错误消息意味着什么?

    但是、我再次对 Matthew 处理的 GPxDAT 寄存器意外切换行为提出了一个问题、对此我深表歉意。 是否知道在切换时为什么会获得意外输出?

    此致、
    Ankit

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

    您好、Ankit、

    不用担心!

    'ConfigCpuTimer()'函数,这两组代码调用实际上都将 Tie 位设置为1,以便生成计时器中断(这是通过计时器的配置实现的)。 如果该位未启用、那么您基本上是说您不希望定时器能够生成任何中断信号。 这与以下行不同、在这些行中、我们启用 CPU 来处理来自计时器0的中断(TINT0)。

    EALLOW;
    PieVectTable.TINT0 = &cpu_timer0_isr;
    EDIS;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    IER |=1;
    EINT;
    ERTM;

    [引用 userid="492029" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1017080/tmdsprex28335-tmdsprex28335-gpio-toggle-erratic-behavior/3807767 #3807767">为什么启用/激活 TINT0两次? 因为我能够完美地运行计时器中断程序、就像 TSS = 0选项一样。

    由于已在 ConfigCpuTimer()函数中设置了 TIe 位,因此您可以通过如上所述的 TSS 位启动计时器。 但是、如果您通过 TCR 寄存器而不是位本身更改 TSS、则必须确保不清除 TIe 位(因为该位是寄存器的一部分、并且您正在进行寄存器写入)、否则计时器将不会生成任何中断。  


    我将让 跟进您的其余问题。

    此致、

    Marlyn