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.

[参考译文] LAUNCHXL-F28069M:计时器在我更改其周期后停止中断

Guru**** 2607985 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/684933/launchxl-f28069m-timers-stop-interrupting-after-i-change-their-period

器件型号:LAUNCHXL-F28069M

您好! 想知道是否可以在代码运行时更改计时器的周期。

我使用了 CPU_Timers 示例、该示例每秒切换一个引脚的输出。 这很好。 然后、我尝试在10次切换后更改频率。 我找到的是、在我更改下面显示的块中的周期后:

if (CpuTimer0.InterruptCount = 10)//  在10次切换后

如果(!timerChange){// 在前10次切换后
CpuTimer0Regs.tcr.bit.tie = 0; //停止中断
ConfigCpuTimer (&CpuTimer0、80、10000); //将周期更改为0.01秒
timerChange = 1; //设置此变量,因此在接下来的10次切换后,我们将周期更改为1秒
CpuTimer0.InterruptCount = 0; //重置中断计数
CpuTimer0Regs.tcr.bit.tie = 1; //启用中断

如果(timerChange){  
CpuTimer0Regs.tcr.bit.tie = 0;
ConfigCpuTimer (&CpuTimer0、80、1000000); // 1秒
timerChange = 0;
CpuTimer0.InterruptCount = 0;
CpuTimer0Regs.tcr.bit.tie = 1;


在我输入  if(!timerChange) 并更改周期后,我将停止中断。 即使我删除了"CpuTimer0Regs.tcr.bit.tie = x" 行。 是否有方法可以像这样更改计时器的周期?

以下是所有代码:

//######################################################################################################################
//描述:
//! addtogroup f2806x_example_list
//!

CPU 定时器(CPU_TIMER)


//!
//! 此示例配置 CPU Timer0、1和2并递增
//! 每次定时器发出中断时计数器。
//!
//! b 监视\b 变量\n
//! - CpuTimer0.InterruptCount
//! - CpuTimer1.InterruptCount
//! - CpuTimer2.InterruptCount
//
//######################################################################################################################
//$TI 版本:F2806x C/C++头文件和外设示例 V151 $
//$Release Date:2016年2月2日$
//版权所有:版权所有(C) 2011-2016德州仪器(TI)公司-
// http://www.ti.com/ 保留所有权利$
//######################################################################################################################

#include "DSP28x_Project.h"//器件头文件和示例 include 文件

// GPIOTOGGLE 定义
//选择要编译的示例。 只应将一个示例设置为1
//其余应设置为0。
#define EXAMPLE3 1 //使用切换寄存器切换 I/O

/***原型**** /
// CPU 计时器原型
_interrupt void CPU_timer0_ISR (void);
_interrupt void CPU_Timer1_ISR (void);
_interrupt void CPU_timer2_ISR (void);
// GPIO 切换 PROTOYPES
void delay_loop (void);
void GPIO_select (void);
void GPIO_examplple1 (void);
void GPIO_example2 (void);
void GPIO_examplple3 (void);


//全局变量
volatile unsigned int TimerInterrupt = 0;

void main (void)

//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟
//此示例函数位于 F2806x_SYSCTRL.c 文件中。
InitSysCtrl();

//步骤2. 初始化 GPIO:
//此示例函数位于 F2806x_GPIO.c 文件和中
//说明了如何将 GPIO 设置为其默认状态。
// InitGpio();//针对此示例跳过
GPIO_SELECT();


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

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

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

//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2806x_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2806x_PieVect.c 中找到
InitPieVectTable();

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

//******** CPUTIMES //

//步骤4. 初始化器件外设。 该函数可以是
//可在 F2806x_CpuTimers.c 中找到
InitCpuTimer();//对于此示例,只初始化 CPU 计时器

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

ConfigCpuTimer (&CpuTimer0、80、1000000);
//*ConfigCpuTimer (&CpuTimer1、80、1000000);
//*ConfigCpuTimer(&CpuTimer2, 80, 1000000);

//为了确保精确的时序,使用只写指令写入整个寄存器。 因此、如果有的话
配置位的//在 ConfigCpuTimer 和 InitCpuTimers (在 F2806x_CpuTimer.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 (;;);
//********* GPIOTOGGLE ********* //
volatile unsigned char timerChange = 0;
while (1)


#if EXAMPLE3

//此示例使用切换寄存器切换 I/O
IF (TimerInterrupt & BIT0){
GPIO_example3();
IF (CpuTimer0.InterruptCount =10)

如果(!timerChange){
IER &=~M_INT1;
ConfigCpuTimer (&CpuTimer0、80、10000);// 0.01秒
timerChange = 1;
CpuTimer0.InterruptCount = 0;
IER |= M_INT1;

如果(timerChange){
IER &=~M_INT1;
ConfigCpuTimer (&CpuTimer0、80、1000000);// 1秒
timerChange = 0;
CpuTimer0.InterruptCount = 0;
IER |= M_INT1;


TimerInterrupt &=~BIT0;


#endif

/***** CPU_TIMER 定义****
_interrupt void CPU_timer0_ISR (void)//TINT0_ISR

TimerInterrupt |= BIT0;
CpuTimer0.InterruptCount++;

//确认此中断以从组1接收更多中断
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//********* GPIO_toggle 定义*********
void delay_loop ()

短接 I;
对于(i = 0;i < 1000;i++){}

void GPIO_示 例3 (void)

volatile unsigned int i=0;
//示例2:
//使用切换寄存器切换 I/O


//使用切换寄存器翻转的状态
//引脚。
//任何设置为1的位都将触发状态(切换)
//设置为0的任何位都不会切换。

//*GpioDataRegs.GPATOGGLE.all =0xCFFFFFFF;
//*GpioDataRegs.GPBTOGGLE.all =0x0000000F;

void GPIO_select (void)


EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0x00000000;//所有 GPIO
GpioCtrlRegs.GPAMUX2.ALL = 0x00000000;//所有 GPIO
GpioCtrlRegs.GPAMUX1.ALL = 0x00000000;//所有 GPIO
GpioCtrlRegs.GPADIR.ALL = 0xCFFFFFFF;//所有输出
GpioCtrlRegs.GPBDIR.ALL = 0x0000000F;//所有输出
EDIS;


//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

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

    Andrew、

    感谢您访问 C2000 E2E 论坛。

    问题是 ConfigCpuTimer()函数会在函数末尾附近停止计时器,以便计时器现在永久关闭。

    Timer->RegsAddr->TCR.bit.TSS = 1; 

    我将对您的示例3代码进行以下更改

    如果(CpuTimer0.InterruptCount = 10)
    {
    CpuTimer1Regs.TCR.bit.TSS = 1;//在更改计时器设置时停止计时
    器(!timerChange){
    IER &=~M_INT1;
    ConfigCpuTimer0 (&CpuTimer0、80、10000);// InterruptTimerChange
    = 1
    
    
    
    ;= 1
    ~
    Cpu0 (IEPUT1);IeTimer0 = 1 = Cpu0;Ir = 1 = Cpu0;Ir = 1 (IEPUT1) // 1秒
    timerChange = 0;
    CpuTimer0.InterruptCount = 0;
    IER |= M_INT1;
    }
    CpuTimer1Regs.TCR.bit.TSS = 0;//完成后重新启动计时器。
    }