主题中讨论的其他部件: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计时器可以输出的最小值是多少。
非常感谢






