您好! 想知道是否可以在代码运行时更改计时器的周期。
我使用了 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;
}
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//不再需要。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================