DSP28335定时器中断控制LED亮灭

通过配置定时器中断,分别使得LED2/3/4每隔一段时间切换亮灭

1、按前述教程快速新建一个新工程,在工程文件中app文件夹下新建CpuTimers子文件夹用于存放CpuTimers.c/CpuTimers.h文件(记得添加进头文件路径),在user/main.c编写主函数

 

2、CpuTimers.c代码

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "leds.h"

//============================================================================
interrupt void TIM0_IRQn(void)//定时器0中断服务函数:LED2每隔ΔT翻转电平
{
    EALLOW;
    LED2_TOGGLE;
    PieCtrlRegs.PIEACK.bit.ACK1=1;
    EDIS;
}

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

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

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

    ConfigCpuTimer(&CpuTimer0, Freq, Period);//(Timer0/1/2、定时器频率、定时器周期)
    //计算公式:ΔT=Freq*Period/150 000 000(s)[Freq=150,通过设置Period改变定时时间,如Preiod=500 000,则ΔT=0.5s]

    CpuTimer0Regs.TCR.bit.TSS=0;//开始定时器功能

    IER |= M_INT1;//开启CPU 第一组中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能第一组中断的第7个小中断,即定时器0

    EINT;//使能总中断
    ERTM;//使能DEBUG中断
}

//=================================================================================

interrupt void TIM1_IRQn(void)//定时器1中断服务函数:LED3每隔ΔT翻转电平
{
   EALLOW;
   LED3_TOGGLE;
   PieCtrlRegs.PIEACK.bit.ACK1=1;
   EDIS;
}

//定时器1初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM1_Init(float Freq, float Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1;//使能定时器时钟【Timer1】
    EDIS;

    EALLOW;
    PieVectTable.XINT13 = &TIM1_IRQn;//设置定时器1的中断入口地址为中断向量表的INT1(详情参考开发攻略P245)
    EDIS;

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

    ConfigCpuTimer(&CpuTimer1, Freq, Period);//(Timer0/1/2、定时器频率、定时器周期)
    //计算公式:ΔT=Freq*Period/150 000 000(s)[Freq=150,通过设置Period改变定时时间,如Preiod=500 000,则ΔT=0.5s]

    CpuTimer1Regs.TCR.bit.TSS=0;//开始定时器功能

    IER |= M_INT13;//开启CPU中断13

    EINT;//使能总中断
    ERTM;//使能DEBUG中断
}

//===========================================================================================

interrupt void TIM2_IRQn(void)//定时器2中断服务函数:LED4每隔ΔT翻转电平
{
   EALLOW;
   LED4_TOGGLE;
   PieCtrlRegs.PIEACK.bit.ACK1=1;
   EDIS;
}

//定时器2初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM2_Init(float Freq, float Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1;//使能定时器时钟【Timer2】
    EDIS;

    EALLOW;
    PieVectTable.TINT2 = &TIM2_IRQn;//设置定时器2的中断入口地址为中断向量表的INT2(详情参考开发攻略P245)
    EDIS;

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

    ConfigCpuTimer(&CpuTimer2, Freq, Period);//(Timer0/1/2、定时器频率、定时器周期)
    //计算公式:ΔT=Freq*Period/150 000 000(s)[Freq=150,通过设置Period改变定时时间,如Preiod=500 000,则ΔT=0.5s]

    CpuTimer2Regs.TCR.bit.TSS=0;//开始定时器功能

    IER |= M_INT14;//开启CPU中断14

    EINT;//使能总中断
    ERTM;//使能DEBUG中断
}

3、CpuTimers.h代码

void TIM0_Init(float Freq, float Period);
void TIM1_Init(float Freq, float Period);
void TIM2_Init(float Freq, float Period);

4、main.c代码

#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "key.h"
#include "leds.h"
#include "beep.h"
#include "relay.h"
#include "dcmotor.h"
#include "stepmotor.h"
#include "ext_int.h"
#include "CpuTimers.h"

void main()
{
    int i;

    InitSysCtrl();//系统时钟配置和使能各外设时钟,包括GPIO 时钟
    InitPieCtrl();//初始化PIE相应的寄存器
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();//初始化PIE中断向量表

    LED_Init();
    TIM0_Init(150,500000);//KED2每隔0.5s切换一次亮灭
    TIM1_Init(150,100000);//KED2每隔0.1s切换一次亮灭
    TIM2_Init(150,1000000);//KED2每隔1s切换一次亮灭

    while(1)//LED1闪烁用作指示灯
    {
        i++;
        if(i%2000==0)
        {
            LED1_TOGGLE;
        }
        DELAY_US(100);
    }

}

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狸花.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值