TMS320F280049学习5:CPU timer中断
文章目录
- TMS320F280049学习5:CPU timer中断
- 前言
- 一、工程代码
- 二、CPU timer时钟
- 总结
前言
DSP的内部有3个CPU timer,分别是CUP timer0 / 1 / 2,传说CPU timer2一般在跑系统时用,类似单片机跑系统时使用滴答定时器一样,不过CPU timer2一样也可以像其他定时器一样使用。
以下例程代码基于之工程编写的,具体看文章《TMS320F280049学习1:新建工程》。
一、工程代码
#include "driverlib.h"
#include "device.h"
#include "f28004x_pievect.h"
#define DRV_LED2_PIN 23
#define DRV_BUTTON_PIN 24
#define DELAY_MS(MS) DEVICE_DELAY_US((long double)MS * 1000)
__interrupt void timer0_interrupt(void);
/*******************************************************************************
* 函 数 名 : led_init
* 输 入 : 空
* 输 出 : 空
* 函数功能 : LED初始化
* 详细描述 : 空
*******************************************************************************/
void led_init(void)
{
//设置GPIO模式
GPIO_setPadConfig(DRV_LED2_PIN, GPIO_PIN_TYPE_STD);
//设置GPIO方向
GPIO_setDirectionMode(DRV_LED2_PIN, GPIO_DIR_MODE_OUT);
}
/*******************************************************************************
* 函 数 名 : timer_init
* 输 入 : 空
* 输 出 : 空
* 函数功能 : 定时器按钮初始化
* 详细描述 : 空
*******************************************************************************/
void timer_init(void)
{
//设置计数周期
CPUTimer_setPeriod(CPUTIMER0_BASE, 1000000);
//设置分频系数
CPUTimer_setPreScaler(CPUTIMER0_BASE, 50 - 1);
//停止计数
CPUTimer_stopTimer(CPUTIMER0_BASE);
//复位计数器
CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
//设置定时器模式
CPUTimer_setEmulationMode(CPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
//绑定中断函数
Interrupt_register(INT_TIMER0, &timer0_interrupt);
//使能定时器中断
CPUTimer_enableInterrupt(CPUTIMER0_BASE);
//使能定时器中断
Interrupt_enable(INT_TIMER0);
//启动计数
CPUTimer_startTimer(CPUTIMER0_BASE);
}
/*******************************************************************************
* 函 数 名 : main
* 输 入 : 空
* 输 出 : 空
* 函数功能 : 主函数
* 详细描述 : 空
*******************************************************************************/
void main(void)
{
//初始化时钟和外设
Device_init();
//解锁GPIO配置
Device_initGPIO();
//初始化PIE并清空PIE寄存器,关闭CPU中断
Interrupt_initModule();
//初始化PIE向量表
Interrupt_initVectorTable();
//LED初始化
led_init();
//定时器初始化
timer_init();
//使能中断
EINT;
//使能调试事件
ERTM;
while(1)
{
DELAY_MS(100);
}
}
__interrupt void timer0_interrupt(void)
{
GPIO_togglePin(DRV_LED2_PIN);
//清中断
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
二、CPU timer时钟
1、代码中定时器分频值50-1,将计数频率分频成1M,+1操作原因看下图CPUTimer_setPreScaler函数。
2、分频值50,是原因是CPU timer时钟源是PERx.SYSCLK,PERx.SYSCLK时钟来自SYSCLK,SYSCLK是50M(按我现在的理解也许要达到100M系统时钟,需要上20M的晶振)。
CPU timer0时钟源:
CPU timer时钟来自SYSCLK:
SYSCLK时钟配置:
总结
下一步,GPIO输入中断。