基于F28335定时器0的定时中断

TMS320F28335在实际的应用比较广泛。在具体应用过程中,往往有优先级比较高的定时需求。实现次功能的方式有数种,例如使用PWM中断,定时器中断等。这里介绍使用定时器0作为触发源进行中断,实现定时中断的功能。

1 定时中断的意义

在F28335的使用过程中,使用定时器进行定时中断,可以执行定时任务。该任务的执行的时间误差相比特别小。

2 原理介绍

2.1 中断介绍

CPU在执行任务时,遇到优先级更高的任务,CPU将会先去执行优先级更高的任务,执行完毕后继续执行当前任务,这就是中断。
F28335的具有诸多资源,许多资源均可以触发中断。将可以触发中断的资源称为中断源。下图位F28335的中断源及连接关系。
在这里插入图片描述

由于F28335的 中断源很多,因此F28335采用三级中断机制,分为外设级、PIE级和CPU级。原理图如下所示:
在这里插入图片描述

而定时器0就是采用这种三级中断机制。

为了便于管理诸多中断源,TI按照优先级进行了诸多中断源的分组。其中,定时器0在PIE的第一组第七个,在CPU级的第一组。

2.2 定时器介绍

F28335具有三个定时器,分别为Timer0、Timer1和Timer2。

定时器的具体功能框图如下所示:

在这里插入图片描述

定时器有一个预分频模块和一个定时/计数模块,其中预分频模块有一个16位的定时器分频寄存器(TDDRH:TDDR)和。一个16位的预定标计数器(PSCH:PSC);定时/计数模块包括一个32位的周期寄存器(PRDH:PRD)和一个32位的计数寄存器(TIMH:TIM)。

由下图F28335系统时钟图可知,定时器是由系统时钟来提供时钟的

在这里插入图片描述

当系统时钟(SYSCLKOUT)来一个脉冲,PSCH:PSC预定标计数器减1,当PSCH:PSC预定标计数器减到0的时候,预定标计数器产生下溢后向计数寄存器TIMH:TIM借位,也即计数寄存器TIMH:TIM减1,同时PSCH:PSC在一个系统时钟脉冲之后重载定时器分频寄存器TDDRH:TDDR的值,当计数寄存器TIMH:TIM减到0产生下溢的时候,计数寄存器TIMH:TIM会重载周期寄存器TIMH:TIM的值。此时,如果TIMERxTCR.TIF位使能了,那么同时定时器会产生一个中断信号给CPU。

2.3 定时器0触发中断过程

定时器0触发中断的结构图如下所示:

在这里插入图片描述

当TIMER0TCR.TIF位使能了,那么在定时器重载计数寄存器TIMH:TIM时会产生一个中断信号。该中断信号就是TINT0(定时器0在中断向量表的位置和命名)。定时器0中断信号在PIE第一组中的第七个中断,因此PIE的第一组会产生中断信号(需要使能PIE第一组中断)到CPU级,然后到CPU内核,CPU如果判定此时响应该中断,那么就会找到中断向量表中的TINT0所指向的中断服务子函数,并执行。

根据上述定时器原理,可得定时时间T公式为:
T = ( P R D H : P R D ) ∗ ( T D D R H : T D D R + 1 ) S Y S C L K O U T T = \frac{(PRDH:PRD)*(TDDRH:TDDR+1)}{SYSCLKOUT} T=SYSCLKOUT(PRDH:PRD)(TDDRH:TDDR+1)
其中: P R D H : P R D PRDH:PRD PRDH:PRD 为周器寄存器的值; T D D R H : T D D TDDRH:TDD TDDRH:TDD为定时器预分频寄存器的值; S Y S C L K O U T SYSCLKOUT SYSCLKOUT为系统时钟频率。

3 实现过程

DSP的运行过程如下:

  1. 关所有中断,禁止CPU中断,清除所有CPU中断标志;
  2. 初始化系统时钟;
  3. 中断设置始化;
  4. 定时器初始化;
  5. 使能中断,开中断;
  6. 进入主循环;
  7. 等待中断;
  8. 中断到时,执行中断任务;
  9. 结束中断任务后,执行中断应答,清除定时器标志;
  10. 重复7~9

具体代码如下:

3.1 关所有中断,禁止CPU中断,清除所有CPU中断标志

	//Clear all interrupts and initialize PIE vector table: Disable CPU interrupts
    DINT;

    //Disable CPU interrupts and clear all CPU interrupt flags;
    IER = 0x0000;
    IFR = 0x0000;

3.2 初始化系统时钟

	// Disable the watchdog	
	EALLOW;
    SysCtrlRegs.WDCR= 0x0068;
    EDIS;

	// Initialize the PLL control: PLLCR and DIVSEL
    // DSP28_PLLCR and DSP28_DIVSEL are defined in DSP2833x_Examples.h
    InitPll(DSP28_PLLCR,DSP28_DIVSEL);

	// Initialize the peripheral clocks
    InitPeripheralClocks();

3.3 中断设置始化

	//Initialize PIE control registers;detail info in the DSP2802x_PieCtrl.c file.
    InitPieCtrl();

	//Initialize PIE vector table with pointers to the shell ISR
    InitPieVectTable();

	//Add adress of ISRTask to PIEVectTable
	EALLOW;
	PieVectTable.TINT0 = &ISRTimer0;
	EDIS;

	//Enable INT1 & INT1.7
	IER |= M_INT1;
	PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;	

3.4 定时器初始化

	// CPU Timer 0
	//初始化计数值

	//Counter = 1500*(1/150MHz)=10us
	CpuTimer0Regs.PRD.all = 1500;		

	// Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
	CpuTimer0Regs.TPR.all  = 0;
	CpuTimer0Regs.TPRH.all = 0;
	CpuTimer0Regs.TIM.all = 0;
	
	//自动重新装载计数值
	CpuTimer0Regs.TCR.bit.TRB = 1;
	//启动定时器0
	CpuTimer0Regs.TCR.bit.TSS = 0;
	
	//定时器0中断使能
	CpuTimer0Regs.TCR.bit.TIE = 1;

3.5 使能中断,开中断

    //Enable global Interrupts and higher priarity real-tme debug events;
    EINT;
    ERTM;

3.6 进入主循环

	for(;;)
    {

    }

3.7 等待中断

3.8 中断到时,执行中断任务

    interrupt void ISRTimer0(void)
    {
        //Task
        
        //Interrupt ACK & Clear Timer0
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
        TIMER0_OUT_CLEAR();
        CpuTimer0Regs.TCR.bit.TRB = 1;  
    }

3.9 执行中断应答,清除定时器标志

    //Interrupt ACK & Clear Timer0
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    TIMER0_OUT_CLEAR();
    CpuTimer0Regs.TCR.bit.TRB = 1; 

4 实验验证

为了验证基于定时器是否能够实现定时任务,设计GPIO输出电平1s定时翻转任务。

代码的具体实现方式是在上述中断函数中加入翻转逻辑,代码如下:

interrupt void ISRTimer0(void)
{
    static int s_iGPIOCnt = 0;
    
    //Task
    if(++s_iGPIOCnt >= 100000 )      //10us * 100000 = 1s
    {
        GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        s_iGPIOCnt = 0;
    }
    
    //Interrupt ACK & Clear Timer0
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    TIMER0_OUT_CLEAR();
    CpuTimer0Regs.TCR.bit.TRB = 1;  
}

通过观测,发现GPIO口对应的LED进行1s的亮灭闪烁。

5 结论

通过观测到LED的闪烁,证明了中断函数因为定时器而响应,时间上大概为10us。

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值