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万:CPU计时器2中断不能达到小于6 us的时间

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/632752/tms320f28035-cpu-timer-2-interrupt-can-not-reach-the-time-less-than-6-us

部件号: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;
}

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

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

非常感谢  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还使用GPIO18来查看SYSCLKOUT/4,它正好是15MHz。

    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; //在GPIO18上启用内部上拉电阻器(默认为禁用)
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 3;//XCLKOUT (O)-外部时钟输出
    SysCtrlRegs.CLKCTL.bit.TMR2CLKSRCSEL=0;// CPU timer2时钟源选择系统时钟
    SysCtrlRegs.CLKCTL.bit.TMR2CLKPRESCALE = 0;// CPU timer2 prescale = 1
    SysCtrlRegs.XCLK.bit.XCLKOUTDIV = 0;// XCLKOUT=SYSCLKOUT/4
    EDIS;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Qi,

    感谢您的帖子。 您的线程已分配给C2000专家,应很快得到解答。

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

    对我来说,这是相当紧迫的,也许我可以简单地问,当cputimer 2的时间不能少于我们5时,问题是什么?

    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CPU计时器可以随时使用,甚至少于1us。 如何测量CPU计时器的周期? 请注意,“输入/退出”中断将占用一些CPU周期(超过32个CPU周期)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Yanming:

    非常感谢您的反馈。 我使用切换GPIO22来测试CPU计时器的周期。
    __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;
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的项目中是否只有一个中断,即CPU timer2? 期间是否包括高/低级别的GPIO?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亲爱的Yanming,您好

    是的,只有一个中断。
    __interrupt void CPU_timer2_ISR(void)


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

    }
    在CPU计时器2中断中,我仅切换GPIO。

    我又做了一个测试,我将PLL从60MHz更改为120MHz。 我可以输出5个。 对于F2.8035万,它不能以120MHz的频率工作。 我只是想获得更多信息来解决这个问题。 然后,在cputimer中断中强制触发ADC。
    AdcRegs.ADCSOCFRC1.bit.SOC5 =1;/* Start SOC5 */和cputimer中断更改为3.68us。 ADC中断为10 us。 当您触发ADC时,CPU计时器中断将发生变化,这真的很奇怪。 我只是给你们这些信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    将来,请尝试解释您所面临的问题,而不是发布代码。 很难逐行浏览代码片段并提供解决方案。 要获得更快的回答,请询问有指的问题。

    您是否认为TOGGLEGPIOFlag()函数需要5us / 6US?

    另外,在ISR例程中配置GPIO22也很奇怪。 以下代码可以从ISR例程移至InitGpio例程:-

    1)启用GPIO22上的上拉(GpioCtrlRegs.GPAPUD.bit.GPIO22 = 0;)
    2)将GPIO22配置为GPIO引脚(GpioCtrlRegs.GPAMUX2.bit.GPIO22=0;//将GPIO22配置为常规输入和输出(默认))
    3)将GPIO22配置为输出引脚GpioCtrlRegs.GPADIR.bit.GPIO22 = 1;//将GPIO22配置为输出

    默认情况下,GPIO是输入引脚。 您正在尝试在将GPIO22配置为输出引脚之前进行切换。因此,ISR例程中的第一次GPIO22将不会切换。

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

    或者我改变我的问题,可能更容易澄清。 我从控制套件运行示例。 PLL为60 MHz。 我将CPUTIME2配置为2 us。 但我只能实现4.48。 如您所解释,它需要32*16.67ns (60MHz时的系统时钟),即0.5 Us。 所以我应该有2.5个,而不是4.5个。 请问您能帮我解决这个问题吗?


    //本文件中找到的函数的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,2);

    //为确保精确的时间安排,请使用只写指令写入整个寄存器。 因此,如果有的话
    //在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确认中断。

    }

    __interrupt void CPU_timer2_ISR(void)


    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;

    CpuTimer2Regs.tcr.bit.tif = 1;/*清除CPU timer2的中断标志(TIF)*/
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,先生:

    我很抱歉在您发布我的代码时遇到麻烦。
    1.不。我不说TOGGLEGPIOFlag()函数需要5或6个。 我只需在cputimer ISR中切换GPIO。 我使用振荡器来测试此GPIO,以便我知道cputimer中断需要多长时间。 目的是测试cputimer中断。
    2.我已删除ISR中配置GPIO的代码。 现在,我在初始化过程中将GPIO配置为输出。 我只在ISR中切换GPIO。 但没有变化。

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

    我仍然不清楚您的问题。

    我相信您希望CPU Timer2中断每2.5秒触发一次,而您看到的却是5-6US。 我对吗?

    此致,

    Manoj

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

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

    我做了另一件事。
    之前:我将cputimer2设置为2.5us并创建一个切换函数,我在CPU中断ISR中使用此函数,我看到5-6 us
    __interrupt void CPU_timer2_ISR(void)

    CpuTimer2.InterruptCount++;

    void TOGGLEGPIO22Flag (void)//切换输出

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

    }

    void TOGGLEGPIO22Flag (void)(无效)


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

    }

    现在:
    我删除切换功能并直接使用此代码,GpioDataRegs.GPATOGLE.bit.GPIO22=1。 我看到了3.2 我们
    __interrupt void CPU_timer2_ISR(void)

    CpuTimer2.InterruptCount++;

    GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出
    CpuTimer2Regs.tcr.bit.tif = 1;/*清除CPU timer2的中断标志(TIF)*/

    }

    我的问题是
    1.您认为( GPIO - 2.5 = 0.7 )与3.2 和中断的区别吗? 这意味着CPU timer2是否正常工作?
    2.您能否帮助解释从6 Us到3.2 Us的变化? 如果无法在cputimer2中断中调用函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    无论您在ISR内使用函数(或)有GPIO切换,CPU2Timer的调用速率都应相同。 但是,使用函数 切换GPIO会增加开销,因为它必须执行上下文切换并将内容推送到堆栈。

    此致,

    Manoj

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

    非常感谢您的解释。 非常感谢。
    我还有一些问题:

    1.我将CPUTIME2设置为“2.5 Us”,并执行如下操作。 我测试GPIO22并拥有3.2 Us的CPUTIME2。 您认为CPUTIMER2作为2.5 Us工作良好吗?
    __interrupt void CPU_timer2_ISR(void)

    CpuTimer2.InterruptCount++;

    GpioDataRegs.GPATOGLE.bit.GPIO22 = 1;//切换输出
    CpuTimer2Regs.tcr.bit.tif = 1;/*清除CPU timer2的中断标志(TIF)*/
    }

    2.如果可以在CPU计时器中断中调用某些函数。 在我的项目中,我需要调用一些函数来更改CPU计时器中断内的GPIO配置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    1)开始执行中断服务例程(ISR)的第一个操作码需要9个CPU周期。 在60 MHz时,它增加了150ns。 因此,如果已将CPU计时器配置为在2.5us时中断,则需要2.5us + 150ns =2.65us才能开始执行ISR例程中的第一个操作代码。

    检查切换GPIO22所需的CPU周期数。 这将要求您在反汇编模式下单步执行,然后计算每个指令的CPU周期数。 对于3.2us切换时间,在ISR中切换GPIO22需要33个CPU周期。 检查是否是这种情况。

    2) ISR中的功能的使用没有限制。 我之前的评论只是为了解释在使用函数时引入的额外开销。

    此致,
    Manoj