DSP28335基础教程——系统定时器CPUTimer(定时中断)

Posted Sk Electronics

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP28335基础教程——系统定时器CPUTimer(定时中断)相关的知识,希望对你有一定的参考价值。

0 前言

本期的实验目的为:使用核心板上的CPU系统定时器,实现3个LED分别以0.1s,0.5s和1s的间隔闪烁。


1 DSP代码

注意:查看代码时双击点进去看,否则会内容不全)。

main.c

/**
 *  ********************************************************************************************
 *  @file                 main.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               系统定时器
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#include "DSP28x_Project.h"
#include "bsp_led.h"
#include "bsp_cpu.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
interrupt void cpu_timer0_isr(void);//定时器0中断服务子程序
interrupt void cpu_timer1_isr(void);//定时器1中断服务子程序
interrupt void cpu_timer2_isr(void);//定时器2中断服务子程序
void delay_1ms(Uint16 t);
/**
 *  @brief                           主函数
 *  @parameter                  无
 *  @return_value               无
 */
void main(void)

/*第一步:初始化系统控制:*/
    InitSysCtrl();

/*第二步:初始化GPIO口*/
    InitGpio();

/* 第三步:清除所有中断 和初始化 PIE 向量表:*/
    DINT;// 禁用CPU中断
    InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除
    IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
    IFR = 0x0000;
    InitPieVectTable();// 初始化 PIE 中断向量表
    // 中断重映射,注册中断程序入口(用户按需求添加)
    EALLOW;
    PieVectTable.TINT0=&cpu_timer0_isr;//将定时器中断服务子程序的地址存放到相应的向量地址中
    PieVectTable.XINT13=&cpu_timer1_isr;
    PieVectTable.TINT2=&cpu_timer2_isr;
    EDIS;
    //

/*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUN
    MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
    InitFlash();
#endif

/* 第四步: 初始化所有外设*/
    // InitPeripherals();  //初始化所有外设(本例程不需要)
    CPU_Timer_Config();//初始化和配置CPU


/* 第五步:添加用户具体代码*/
    LED_GPIO_Config();//LED端口初始化

    EINT;//使能全局中断
    ERTM;//使能全局实时中断
/*第六步:进入主循环*/
    for(;;)
    

    


/**
 *  @brief                           1ms延迟函数
 *  @parameter                  t
 *  @return_value               无
 */
void delay_1ms(Uint16 t)

    while(t--)
    
        DELAY_US(1000);
    


/***************中断服务子函数**********************************/
interrupt void cpu_timer0_isr(void)

    LED0_TOGGLE;//1s反转一次LED0
    CpuTimer0.InterruptCount++;
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//中断已应答,可以从组1接收更多中断


interrupt void cpu_timer1_isr(void)

    LED1_TOGGLE;//0.5s反转一次LED1
    CpuTimer1.InterruptCount++;
    EDIS;//直接确认,无需PIE


interrupt void cpu_timer2_isr(void)

    LED2_TOGGLE;//0.1s反转一次LED2
    CpuTimer2.InterruptCount++;
    EDIS;//直接确认,无需PIE

bsp_cpu.h

/**
 *  ********************************************************************************************
 *  @file                 bsp_cpu.h
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               系统时钟应用函数接口头文件
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#ifndef _BSP_CPU_H_
#define _BSP_CPU_H_
#include "DSP28x_Project.h"

void CPU_Timer_Config(void);
#endif /*_BSP_CPU_H_ */

bsp_cpu.c

/**
 *  ********************************************************************************************
 *  @file                 bsp.cpu.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               系统时钟应用函数接口
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */
#include "bsp_cpu.h"
void CPU_Timer_Config(void)

    InitCpuTimers();//CPU初始化

    /*配置CPU参数*/
    #if(CPU_FRQ_150MHZ)
    ConfigCpuTimer(&CpuTimer0,150,1000000);//<定时器x,系统时钟频率MHZ,时间us>,1s中断一次
    ConfigCpuTimer(&CpuTimer1,150,500000);//<定时器x,系统时钟频率MHZ,时间us>,0.5s中断一次
    ConfigCpuTimer(&CpuTimer2,150,100000);//<定时器x,系统时钟频率MHZ,时间us>,0.1s中断一次
    #endif

    #if(CPU_FRQ_100MHZ)
    ConfigCpuTimer(&CpuTimer0,100,1000000);//<定时器x,系统时钟频率MHZ,时间us>,1s中断一次
    ConfigCpuTimer(&CpuTimer1,100,500000);//<定时器x,系统时钟频率MHZ,时间us>,0.5s中断一次
    ConfigCpuTimer(&CpuTimer2,100,100000);//<定时器x,系统时钟频率MHZ,时间us>,0.1s中断一次
    #endif

    /*系统定时器开始运行*/
    CpuTimer0Regs.TCR.all=0x4001;
    CpuTimer1Regs.TCR.all=0x4001;
    CpuTimer2Regs.TCR.all=0x4001;

    /*使能CPU级中断*/
    IER|=M_INT1;//使能CPU的INT1中断
    IER|=M_INT13;//使能CPU的INT13中断
    IER|=M_INT14;//使能CPU的INT14中断

    /*使能PIE级中断,只需Timer0的,其他不需要*/
    PieCtrlRegs.PIEIER1.bit.INTx7=1;

bsp_led.h

/**
 *  ********************************************************************************************
 *  @file                 bsp_led.h
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               LED应用函数接口头文件
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */

#ifndef _BSP_LED_H_
#define _BSP_LED_H_
#include "DSP28x_Project.h"

/* 宏带参,可以像内联函数一样使用,低电平亮灯*/
#define LED0(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO0=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO0=1

#define LED1(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO1=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO1=1

#define LED2(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO2=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO2=1

#define LED3(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO3=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO3=1

#define LED4(a) if (a)  \\
                    GpioDataRegs. GPACLEAR.bit.GPIO4=1;\\
                    else        \\
                    GpioDataRegs. GPASET.bit.GPIO4=1

/*定义IO口的宏*/
#define LED0_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO0=1
#define LED0_OFF        GpioDataRegs. GPASET.bit.GPIO0=1
#define LED0_ON         GpioDataRegs. GPACLEAR.bit.GPIO0=1

#define LED1_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO1=1
#define LED1_OFF        GpioDataRegs. GPASET.bit.GPIO1=1
#define LED1_ON         GpioDataRegs. GPACLEAR.bit.GPIO1=1

#define LED2_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO2=1
#define LED2_OFF        GpioDataRegs. GPASET.bit.GPIO2=1
#define LED2_ON         GpioDataRegs. GPACLEAR.bit.GPIO2=1

#define LED3_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO3=1
#define LED3_OFF        GpioDataRegs. GPASET.bit.GPIO3=1
#define LED3_ON         GpioDataRegs. GPACLEAR.bit.GPIO3=1

#define LED4_TOGGLE     GpioDataRegs. GPATOGGLE.bit.GPIO4=1
#define LED4_OFF        GpioDataRegs. GPASET.bit.GPIO4=1
#define LED4_ON         GpioDataRegs. GPACLEAR.bit.GPIO4=1

void LED_GPIO_Config(void);
#endif /*_BSP_LED_H_ */

bsp_led.c

/**
 *  ********************************************************************************************
 *  @file                 bsp.led.c
 *  @file                 SK Electronics
 *  @version           V1.0
 *  @date               2020-xx-xx
 *  @brief               LED应用函数接口
 *  *******************************************************************************************
 *  @attention
 *  实验平台:SK-F28335Mini   核心板
 *  CSDN博客:https://blog.csdn.net/weixin_46556696
 *  淘宝:https://shop409670932.taobao.com
 */
#include "bsp_led.h"
void LED_GPIO_Config(void)

    EALLOW;
    GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出

    GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式
    GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉
    GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出

    GpioDataRegs. GPASET.bit.GPIO0=1;
    GpioDataRegs. GPASET.bit.GPIO1=1;
    GpioDataRegs. GPASET.bit.GPIO2=1;
    GpioDataRegs. GPASET.bit.GPIO3=1;
    GpioDataRegs. GPASET.bit.GPIO4=1;
    EDIS;

2 结论

通过此例程,初始化CPUTimer0为1s中断一次,Timer1为0.5s中断一次,Timer2为0.1s中断一次,每中断一次对应的LED电平状态反转。最终核心板可以观察到LED以不同的频率闪烁,大家可以尝试看看,不清楚欢迎留言讨论。

更详细的讲解请关注公众号:电力电子学社

QQ群:945257491 一起讨论!

以上是关于DSP28335基础教程——系统定时器CPUTimer(定时中断)的主要内容,如果未能解决你的问题,请参考以下文章

DSP28335基础教程——GPIO输出(流水灯实验)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——ECAP实验(超声波测距)

DSP28335基础教程——EPWM实验(呼吸灯控制)