DSP28335:定时器

1.定时器介绍

     1.1 定时器工作原理

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

       1.2 定时器相关寄存器 

 

1.3.定时器配置步骤 

          定时器相关库函数在DSP2833x_CpuTimers.c文件中

(1)使能定时器时钟

EALLOW;

SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0

EDIS;

(2)初始化定时器参数,包括制定定时器寄存器地址、周期寄存器值、预定标计数器值等

//指向定时器0的寄存器地址

CpuTimer0.RegsAddr = &CpuTimer0Regs;

//设置定时器0的周期寄存器值

CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;

//设置定时器预定标计数器值为0

CpuTimer0Regs.TPR.all  = 0; CpuTimer0Regs.TPRH.all = 0;

//确保定时器0为停止状态

CpuTimer0Regs.TCR.bit.TSS = 1;

//重载使能

CpuTimer0Regs.TCR.bit.TRB = 1;

// Reset interrupt counters:

CpuTimer0.InterruptCount = 0;

(3)定时器的设置 TI提供的库函数“DSP2833x_CpuTimers.c”内已经有函数实现

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)

(4)开启定时器中断功能,并使能定时器

//设置定时器0的中断入口地址为中断向量表的INT0

EALLOW;

PieVectTable.TINT0 = &TIM0_IRQn;

EDIS;

//开始定时器功能

CpuTimer0Regs.TCR.bit.TSS=0;

//开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0

IER |= M_INT1;

PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

//使能总中断 EINT;

ERTM;

(5)编写定时器中断服务函数

interrupt void TIM0_IRQn(void)

{     ......功能程序 }

实验

  本章所要实现的功能是:通过Timer0中断控制 D2 指示灯闪烁,主函数控制 D1 指示灯闪烁提示系统运行状态。程序框架如下:

(1)初始化定时器0,并使能相应中断

(2)编写定时器0中断函数

(3)编写主函数

LED程序参考前面的博客,写过了

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);

void TIM1_Init(float Freq, float Period);
interrupt void TIM1_IRQn(void);

void TIM2_Init(float Freq, float Period);
interrupt void TIM2_IRQn(void);


#endif /* TIME_H_ */

Time.c

#include "Time.h"
#include "leds.h"


//定时器0初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM0_Init(float Freq, float Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
    EDIS;

    //设置定时器0的中断入口地址为中断向量表的INT0
    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQn;
    EDIS;

    //指向定时器0的寄存器地址
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    //设置定时器0的周期寄存器值
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
    //设置定时器预定标计数器值为0
    CpuTimer0Regs.TPR.all  = 0;
    CpuTimer0Regs.TPRH.all = 0;
    //确保定时器0为停止状态
    CpuTimer0Regs.TCR.bit.TSS = 1;
    //重载使能
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer0.InterruptCount = 0;

    ConfigCpuTimer(&CpuTimer0, Freq, Period);

    //开始定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    //使能总中断
    EINT;
    ERTM;

}

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




main.c

void main()
{
    int i=0;

    InitSysCtrl();

    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    LED_Init();
    TIM0_Init(150,500000);

    while(1)
    {
        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }
}

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DSP28335上配置定时器1中断的步骤如下: 1. 首先,需要配置定时器1的寄存器。定时器1的寄存器包括 TCR、TPR、TPRH、TIM、PRD 等。具体配置可参考 TCR(定时器控制寄存器)和 PRD(周期寄存器)的设置。 例如,可以通过以下代码配置定时器1的周期为 1ms: ```c // 设置周期 EPwm1Regs.TBPRD = 15000; // 定时器周期为 15000 个时钟周期 (15000 = 1ms * 150MHz / 1) // 启用定时器 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 设置计数模式为向上向下计数 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁用相位补偿 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟分频因子设置为1 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时钟分频因子设置为1 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁用同步输出 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 使用影子寄存器加载周期寄存器 // 启用中断 EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO; // 中断触发条件为计数器归零 EPwm1Regs.ETSEL.bit.INTEN = 1; // 使能中断 EPwm1Regs.ETPS.bit.INTPRD = ET_1ST; // 中断发生后立即响应 ``` 2. 在中断向量表中设置定时器1的中断服务程序。DSP28335的中断向量表位于 Flash 的 0x3FDC00 处。可以通过修改对应的中断向量表地址来设置定时器1的中断向量。 ```c // 设置定时器1的中断向量 PieVectTable.EPWM1_INT = &epwm1_isr; ``` 3. 编写定时器1的中断服务程序。在定时器1中断触发时,该中断服务程序会被执行。 ```c interrupt void epwm1_isr(void) { // 在此处编写定时器1中断服务程序的代码 // ... // 清除中断标志位 EPwm1Regs.ETCLR.bit.INT = 1; // 重新使能中断 PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // 清除中断标志位并使能中断 } ``` 以上是配置DSP28335定时器1中断的基本步骤,你可以根据具体的需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值