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.

[参考译文] TMS320F2.8035万:Cputimer0

Guru**** 2553450 points
Other Parts Discussed in Thread: DRV8312

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/634731/tms320f28035-cputimer0

部件号:TMS320F2.8035万
主题中讨论的其他部件:DRV8312

现在,我使用CCS连接到DRV8312 EVM板。 我配置CPU timer2,并将PRD设置为299。

void InitDRVSysBCPUTimer2(void)

//初始化此函数中使用的内部变量


// DRV系统中使用的步骤3.5 中断被重新处理到
//每个模块中都有ISR功能
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.TINT2 =&CPU_timer2_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的

//步骤4. 初始化所有设备外围设备:
// DRVInitCpuTimers();//在此示例中,仅初始化CPU计时器
//将定时器周期初始化为最大值:
CpuTimer2Regs.PRD.All = 0xFFFFFFFF;
//初始化预刻度计数器以除以1 (SYSCLKOUT):
CpuTimer2Regs.TPR.All = 0;
CpuTimer2Regs.Thump.All = 0;
//确保计时器停止:
CpuTimer2Regs.tcr.bit.ts = 1;
//使用期间值重新加载所有计数器寄存器:
CpuTimer2Regs.tcr.bit.trb = 1;
//重置中断计数器:
CpuTimer2.InterruptCount = 0;
//将CPU定时器0配置为每5 us中断一次:
//60MHz CPU频率,5 us周期(以uSeconds为单位)
// DRVConfigCpuTimer (&CpuTimer0120,5);

CpuTimer2Regs.PRD.All = 100;//计数器每个周期递减PRD+1次

//将预刻度计数器设为除以1 (SYSCLKOUT):
CpuTimer2Regs.TPR.All = 0;
CpuTimer2Regs.Thump.All = 0;

//初始化定时器控制寄存器:
CpuTimer2Regs.tcr.bit.ts = 1;// 1 =停止计时器,0 =启动/重新启动计时器
CpuTimer2Regs.tcr.bit.trb = 1;// 1 =重新加载计时器
CpuTimer2Regs.tcr.bit.soft= 0;
CpuTimer2Regs.tcr.bit.free = 0;//启用计时器空闲运行
CpuTimer2Regs.tcr.bit.tie =1;// 0=禁用/1=启用计时器中断


//重置中断计数器:
CpuTimer2.InterruptCount = 0;


//步骤5. 初始化每个模块中的用户变量

//步骤6。 在每个模块中配置寄存器:

//步骤7。 为每个模块启用PIE中的中断:
//不需要为cputimer1配置PIE
IER || M_INT14;//启用CPU中断2
//步骤8。 等待每个模块中的每个中断;


}

我将PLL配置为

#define DSP28_PLLCR 12 // 60 MHz设备[60 MHz =(10MHz * 12)/2]
#define DSP28_DIVSEL 2 //为SYSCLKOUT启用/2

我创建了CPU计时器2中断,然后
__interrupt void CPU_timer2_ISR(void)

CpuTimer1.InterruptCount++;
TOGGLEGPIOFlag();
CpuTimer2Regs.tcr.bit.tif = 1;/*清除CPU timer2的中断标志(TIF)*/

}

在TOGGLEGPIOFlag()函数中,我切换GPIO22

void TOGGLEGPIOFlag (void)

EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//在GPIO22上启用内部上拉电阻器(默认为禁用)
GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出
gpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;//将GPIO22配置为常规输入和输出(默认)
gpioCtrlRegs.GPADIR.bit.GPIO22 = 1;//将GPIO22配置为输出
EDIS;
}

在这种情况下,我应该有5个Us期限,但我只有6.4 US.A

我尝试将PRD配置为100,句点也是6.4 Us。 我尝试将PRD配置为600,期间为10 Us。 这意味着,如果我想要的时间段超过6.4 Us,那就可以了。 但如果我想让周期短于6.4 Us,那就不行了。

然后,我尝试在控制套件中尝试一个示例。 Example_2803xCpuTimer。 当我将CPU timer2配置为大于4 us时,就可以了。 但是,如果我将CPU timer2配置为1,它只能输出4 us。

//###################################################################
//说明:
//! \addtogroup F2803x_example_list
//! <H1>CPU计时器(CPU_TIMER)</H1>
//!
//! 此示例配置CPU Timer0,1和2以及增量
//! 计时器每次发出中断时的计数器。
//!
//! \b监视变量\n
//! - CpuTimer0.InterruptCount
//! - CpuTimer1.InterruptCount
//! - CpuTimer2.InterruptCount
//
//###################################################################
//$TI发行版:F2803x C/C++头文件和外设示例V130 $
//$发布日期:2015年5月8日$
//$Copyright:版权所有(C) 2009-2015 Texas2015 Texas Instruments Incorporated -
// http://www.ti.com/ 保留所有权利$
//###################################################################

#include "DSP28x_Project.h"//设备头文件和示例包括文件

//本文件中找到的函数的prototype语句。
__interrupt void CPU_timer0_isr (void);
__interrupt void CPU_Timer1_ISR(void);
__interrupt void CPU_timer2_ISR(void);

Void主(void)

//步骤1. 初始化系统控制:
// PLL,看门狗,启用外设时钟
//此示例函数位于DSP2803x_sysctrl.c文件中。
InitSysCtrl();

//步骤2. 初始化GPIO:
//此示例函数可在DSP2803x_GPIO.c文件和中找到
//说明了如何将GPIO设置为其默认状态。
// InitGpio();//跳过此示例

//步骤3. 清除所有中断并初始化PIE矢量表:
//禁用CPU中断
色调;

//将PIE控件寄存器初始化为其默认状态。
//默认状态是禁用所有PIE中断和标志
//被清除。
//此函数位于DSP2803x_PIECTRL.c文件中。
InitPieCtrl();

//禁用CPU中断并清除所有CPU中断标志:
IER = 0x0000;
IFR = 0x0000;

//使用指向外壳中断的指针初始化PIE矢量表
//服务例程(ISR)。
//这将填充整个表,即使中断也是如此
//在本例中不使用。 这对于调试非常有用。
// shell ISR例程可在DSP2803x_DefaultIsr.C.中找到
//此函数位于DSP2803x_PieVect.C.中
InitPieVectorTable();

//本示例中使用的中断被重新映射到
//此文件中找到ISR函数。
EALLOW;//这是写入EALLOW保护寄存器所必需的
PieVectorTable.TINT0 =&CPU_timer0_ISR;
PieVectorTable.TINT1 =&CPU_Timer1_ISR;
PieVectorTable.TINT2 =&CPU_timer2_ISR;
EDIS;//这是禁用写入EALLOW保护寄存器所必需的

//步骤4. 初始化设备外围设备。 此功能可以是
//在DSP2803x_CpuTimers.c中找到
InitCpuTimers();//在此示例中,仅初始化CPU计时器

//将CPU定时器0,1和2配置为每秒中断一次:
// 60MHz CPU频率,1秒周期(以uSeconds为单位)

ConfigCpuTimer(&CpuTimer0,601000000);
ConfigCpuTimer(&CpuTimer1,601000000);
ConfigCpuTimer(&CpuTimer2,60,1);

//为确保精确的时间安排,请使用只写指令写入整个寄存器。 因此,如果有的话
//在ConfigCpuTimer和InitCpuTimers (在DSP2803x_CpuTimers.h中)中更改了配置位
//以下设置也必须更新。

CpuTimer0Regs.tcr.all = 0x4000;//使用只写指令设置TSS位=0
CpuTimer1Regs.tcr.all = 0x4000;//使用只写指令设置TSS位=0
CpuTimer2Regs.tcr.all = 0x4000;//使用只写指令设置TSS位=0

//步骤5. 用户特定代码,启用中断:

//启用连接到CPU定时器0,CPU INT13的CPU INT1
//连接到CPU定时器1和CPU int 14 (已连接)
//至CPU定时器2:
IER |= M_INT1;
IER || M_INT13;
IER || M_INT14;

//在PIE中启用TINT0:组1中断7
PieCtrlRegs.PIEIER1.bit.INTx7=1;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断INTM
ERTM;//启用全局实时中断DBGM

//步骤6。 空闲循环。 只需坐下来永远循环(可选):
for (;;);
}

__interrupt void CPU_timer0_isr (void)

CpuTimer0.InterruptCount++;

//确认此中断以接收来自组1的更多中断
PieCtrlRegs.PIEACG.ALL = PIEACK_GROUP1;
}

__interrupt void CPU_Timer1_ISR(void)

CpuTimer1.InterruptCount++;
// CPU确认中断。
EDIS;
}

__interrupt void CPU_timer2_ISR(void)

EALLOW;
CpuTimer2.InterruptCount++;
// CPU确认中断。

EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;//在GPIO22上启用内部上拉电阻器(默认为禁用)
GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出
gpioCtrlRegs.GPAMUX2.bit.GPIO22 = 0;//将GPIO22配置为常规输入和输出(默认)
gpioCtrlRegs.GPADIR.bit.GPIO22 = 1;//将GPIO22配置为输出
EDIS;
}

//===========================================================================================================================================
//没有更多。
//===========================================================================================================================================


1.我将GPIO18用作XCLKOUT并将XCLKOUTDIV配置为2 (系统时钟)。 我使用示波器测试GPIO18。 它是60MHz。 这意味着系统时钟没有问题。

2.在CPU计时器中断中,我只能切换GPIO和清除CPU计时器中断标志。 我们不能超过5人。

我想知道这是什么问题,以及CPU计时器可以输出的最小值是多少。

非常感谢

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

    尝试此操作时,是否禁用了其它CPU计时器中断?

    您能否看到在调试过程中使用分析重新输入CPU计时器ISR所需的时钟数? (有关如何使用性能分析的Wiki: processors.wiki.ti.com/.../Profiling_on_C28x_Targets) 您还可以检查ISR自身需要多少个时钟周期吗?

    我不确定CPU计时器可以从我头顶输出的最短时间,但如果我知道,我会在这里发布。

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



    1.是的。 我禁用了其它CPU计时器中断。

    2.我尝试做两个断点,如下所示。 首先,我跑至第一个断点。 然后,清除配置文件时钟。 然后,我将软件运行到下一个中断点。 当我执行以下操作时,它显示配置文件时间为0。 您知道原因吗?



    __interrupt void CPU_timer0_isr (void)



    /************************ 测试代码****************************************************************************************** /

    CpuTimer0.InterruptCount++;


    TOGGLEGPIO22Flag();//测试代码

    // GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出

    CpuTimer0Regs.tcr.bit.tif = 1;/*清除CPU timer0的中断标志(TIF)*/

    PieCtrlRegs.PIEACK/bit.ACK1 = 1;/*清除中断确认CPU timer0中断的PIEACK1组*/



    }



    如果我做下面的事情,需要16个周期。

    __interrupt void CPU_timer0_isr (void)



    /************************ 测试代码****************************************************************************************** /

    CpuTimer0.InterruptCount++;

    //TOGGLEGPIO22Flag();//测试代码

    GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出

    CpuTimer0Regs.tcr.bit.tif = 1;/*清除CPU timer0的中断标志(TIF)*/

    PieCtrlRegs.PIEACK/bit.ACK1 = 1;/*清除中断确认CPU timer0中断的PIEACK1组*/



    }



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

    我看不到您的断点在代码中的位置。 您是否正在测量ISR代码所需的周期数或重新进入ISR所需的周期数(从而测量ISR频率)?

    如果您尚未检查第二件事(ISR频率),请检查。 这将帮助我们了解ISR是否实际以您所需的频率运行,可能是因为切换GPIO才是问题所在。

    我不认为您应该看到这些情况中的0个周期,这有点令人惊讶。

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

    我对这幅糟糕的照片感到非常抱歉。 我的问题更新如下。  首先,我设置CPU定时器中断,每隔5次。

    如果我使用函数切换GPIO,则按如下所示设置断点。 它需要0个周期。 函数中只有一个句子

    你可以看到时间是6.48毫秒

    如果我使用GpioDataRegs.GPATOGLE.bit.GPIO22=1来切换GPIO。 它需要16个周期。  

    在这种情况下,您可以看到时间从4.8 ms到5.4 ms

    因此,如果我可以在CPU计时器中断中调用函数,则CPU计时器不能每隔5个单元中断一次。 您认为我可以在中断函数中调用函数吗?  

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

    是的,您可以在CPU计时器中断中调用函数。 您需要确保您的函数不会花费太长时间使CPU计时器中断频率发生混乱(即函数所花费的周期不能超过ISR周期)。

    我使用TMS320F2.8035万 controlCARD和CPU_TIMER示例程序复制了您的测试。 我没有看到您遇到的问题,CPU_TIMER在切换GPIO进行检查时可能会中断1us。 切换GPIO本身需要2个周期,您提到的GPIO切换功能需要13个周期(而不是您所说的0个周期)。

    您还必须记住,在ISR中切换GPIO并确定引脚范围将显示实际频率的一半。 输入ISR以打开GPIO,然后再次输入ISR以关闭GPIO整个周期。

    希望这能有所帮助,
    Kevin