DSPF28335学习笔记3——定时器中断

       F28335的的定时器中断很简单,其定时器只有三个,而且只能向下计数,同时定时器的初始化函数已经封装好了。

1.定时器介绍

       TMS320F28335 的CPU Time 有三个,分别为Timer0,Timer1,Timer2,其中Timer2 是为操作系统DSP/BIOS 保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为TINT0, TINT1, TINT2,分别对应于中断向量INT1,INT13,INT14。

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

 1.1定时器工作原理

        当系统时钟(SYSCLKOUT)来一个脉冲,PSCH:PSC 预定标计数器减1,当PSCH:PSC 预定标计数器减到0 的时候,预定标计数器产生下溢后向定时器的32 位计数器TIMH:TIM 借位,即TIMH:TIM 计数器减1,同时PSCH:PSC 可以重载定时器分频寄存器(TDDRH:TDDR)的值;当计数寄存器TIMH:TIM 减到0 产生下溢的时候,计数寄存器会重载周期寄存器(PRDH:PRD)的值,同时定时器会产生一个中断信号给CPU。

简单概括就是:PSC按系统时钟递减,减到下溢时重置为TDDR,同时TIM1TIM减到下溢时重置为PRD,同时产生一个定时器中断。

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

 由图可以看出,TCR为0时定时器才可以开始工作;
TDDR(低位)和TDDRH(高位)组成16位寄存器,对系统时钟进行分频;
PRD(低位)和PRDH(高位)组成32位寄存器,储存每次重装载的值,相当于定时周期;
TIM(低位)和TIMH(高位)组成32位寄存器,用作定时器的当前计时的记录值。

2.定时器实验代码

/*
 * time.h
 */

#ifndef TIME_H_
#define TIME_H_

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件

void TIM0_Init(float Freq,float Period);
interrupt void TIM0_IRQn(void);


#endif /* TIME_H_ */
/*
  time.c
 */

#include "led.h"
#include "time.h"

//定时器0初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM0_Init(float Freq, float Period)
{
	//第1步 打开TIM0时钟//
	    EALLOW;
	    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
	    EDIS;
	//第2步 设置中断入口地址//
	    EALLOW;
	    PieVectTable.TINT0 = &TIM0_IRQn;
	    EDIS;
	//第3步 配置定时器基本//
	    InitCpuTimers();
	    // Initialize timer period:
	    ConfigCpuTimer(&CpuTimer0,Freq,Period);
	//第4步 打开定时器//
	    EALLOW;
	    CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
	//第5步 打开PIE组对应于定时器0的中断//
	    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
	    EDIS;
	//第6步 打开CPU中断及//
	    IER |= M_INT1;
	    EINT;

	    ERTM;

}

interrupt void TIM0_IRQn(void)
{
	EALLOW;
	LED2_TOGGLE;
	PieCtrlRegs.PIEACK.bit.ACK1=1;
	EDIS;
}


/*
 * main.c
 */

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "led.h"
#include "time.h"

extern  void TIM0_Init(float Freq,float Period);
void main()
{
	InitSysCtrl();

	//需要初始化PIE 相应的寄存器和中断向量,关闭cpu级中断,同时清除其中断标志位
	InitPieCtrl();
	IER = 0x0000;
	IFR = 0x0000;
	InitPieVectTable();

	LED_Init();

	TIM0_Init(150,100000);//TIM0配置  150MHz时钟频率   周期500ms


    while(1)
 {
    	LED1_TOGGLE;
    	DELAY_US(200000);
 }
}

PS:如果有疑问可以在评论区交流哦!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值