DSP28335学习记录(二)——外部中断和定时器中断_piectrlregs.pieack.bit.ack1-CSDN博客
对于定时器1和定时器2
定时器1和2没有经过PIE分组,直接连了CPU中断线INT13,INT14。配置时候不用设置PIE使能通道了,直接设置CPU中断使能就行,其他的和定时器0类似。
好理解,就是PSC按系统时钟递减,减到下溢时重置为TDDR,同时TIM减1;TIM减到下溢时重置为PRD,同时产生一个定时器中断。
上面俩个是赋值的,下面俩个左边就相当于个位数,右边相当于十位数
定时器配置步骤
(1)使能定时器时钟
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
EDIS;
(2)初始化定时器参数,包括制定定时器寄存器地址、周期寄存器值、预定标计数器值等。 要使用 F28335 的 CPU 定时器,还需要对其内部相关寄存器的设置,具体设置代码如下:
CpuTimer0.InterruptCount
//指向定时器 0 的寄存器地址
CpuTimer0.RegsAddr = &CpuTimer0Regs;
//设置定时器 0 的周期寄存器值
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
//设置定时器预定标计数器值为 0
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
//确保定时器 0 为停止状态
CpuTimer0Regs.TCR.bit.TSS = 1;
//重载使能
CpuTimer0Regs.TCR.bit.TRB = 1;
// Reset interrupt counters:
CpuTimer0.InterruptCount = 0;
(3)定时器的设置 要使用定时器还需要设置它的定时周期以及设置定时器的控制寄存器等。这 些在 TI 提供的库函数“DSP2833x_CpuTimers.c”内已经有函数实现,如下所示:
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
第 1 个表示哪个定时器,第 2 个表示定时器频率,第 3 个表示定时器周期值。
(4)开启定时器中断功能,并使能定时器
//设置定时器 0 的中断入口地址为中断向量表的 INT0
EALLOW;
PieVectTable.TINT0 = &TIM0_IRQn;
EDIS;
//开始定时器功能
CpuTimer0Regs.TCR.bit.TSS=0;
//开启 CPU 第一组中断并使能第一组中断的第 7 个小中断,即定时器 0
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
//使能总中断
EINT;
ERTM;
(5)编写定时器中断服务函数
interrupt void TIM0_IRQn(void)
{
}
案例
本章所要实现的功能是:通过Timer0中断控制 D2-指示灯闪烁,主函数控制 D1 指示灯闪烁提示系统运行状态。程序框架如下:
main.c
void main()
{
int i=0;
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
TIM0_Init(150,500000);
while(1)
{
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}
time.c
#include "time.h"
#include "leds.h"
//定时器0初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
void TIM0_Init(float Freq, float Period)
{
//(1)使能定时器时钟
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
EDIS;
//(2)初始化定时器参数,包括制定定时器寄存器地址、周期寄存器值、预定标计数器值等。
//设置定时器0的中断入口地址为中断向量表的INT0
EALLOW;
PieVectTable.TINT0 = &TIM0_IRQn;
EDIS;
//指向定时器0的寄存器地址
CpuTimer0.RegsAddr = &CpuTimer0Regs;
//设置定时器0的周期寄存器值
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
//设置定时器预定标计数器值为0
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
//确保定时器0为停止状态
CpuTimer0Regs.TCR.bit.TSS = 1;
//重载使能
CpuTimer0Regs.TCR.bit.TRB = 1;
// Reset interrupt counters:
CpuTimer0.InterruptCount = 0;
// (3)定时器的设置 要使用定时器还需要设置它的定时周期以及设置定时器的控制寄存器等。
ConfigCpuTimer(&CpuTimer0, Freq, Period);
//(4)开启定时器中断功能,并使能定时器
CpuTimer0Regs.TCR.bit.TSS=0;
//开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
//使能总中断
EINT;
ERTM;
}
//(5)编写定时器中断服务函数
interrupt void TIM0_IRQn(void)
{
EALLOW;
LED2_TOGGLE;
CpuTimer0Regs.TCR.bit.TIF = 1;//清除外设级中断标志位
PieCtrlRegs.PIEACK.bit.ACK1=1; /清除PIE级中断应答
EDIS;
}
time.h
/*
* time.h
*
* Created on: 2018-1-24
* Author: Administrator
*/
#ifndef TIME_H_
#define TIME_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
void TIM0_Init(float Freq, float Period);
interrupt void TIM0_IRQn(void);
void TIM1_Init(float Freq, float Period);
interrupt void TIM1_IRQn(void);
void TIM2_Init(float Freq, float Period);
interrupt void TIM2_IRQn(void);
#endif /* TIME_H_ */
DSP28335学习记录(二)——外部中断和定时器中断_piectrlregs.pieack.bit.ack1-CSDN博客