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(定时中断)的主要内容,如果未能解决你的问题,请参考以下文章