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输入中断。