DSP28335中3个定时器的中断函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、定时器工作原理

TMS320F28335 的 CPU Time 有三个,分别为 Timer0,Timer1,Timer2,其中Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为 TINT0, TINT1, TINT2,分别对应于中断向量 INT1,INT13,INT14。
在这里插入图片描述
定时器的功能如下图所示:
在这里插入图片描述
从上图可知,定时器有一个预分频模块和一个定时/计数模块,其中预分频模块包括一个 16 位的定时器分频寄存器(TDDRH:TDDR)和一个 16 位的预定标计数器(PSCH:PSC);定时/计数模块包括一个 32 位的周期寄存器(PRDH:PRD)和一个 32 位的计数寄存器(TIMH:TIM)。当系统时钟(SYSCLKOUT)来一个脉冲,PSCH:PSC 预定标计数器减 1,当 PSCH:PSC 预定标计数器减到 0 的时候,预定标计数器产生下溢后向定时器的 32 位计数器 TIMH:TIM 借位,即 TIMH:TIM 计数器减 1,同时 PSCH:PSC 可以重载定时器分频寄存器(TDDRH:TDDR)的值;当计数寄存器 TIMH:TIM 减到 0 产生下溢的时候,计数寄存器会重载周期寄存器(PRDH:PRD)的值,同时定时器会产生一个中断信号给 CPU。定时器的中断结构如下图所示:
在这里插入图片描述
定时器0中断属于 PIE 中断,中断信号经过 PIE 后,再进入处理器,定时器 0的中断属于 PIE 第一组中断中的第 7 个小中断。*定时器1与定时器2直接进入CPU中断,故在这两个定时器操作时无需使能定时器对应的PIE中断,以及在中断服务函数中无需对PIE中断标志进行配置。

二、定时器配置步骤

接下来我们介绍下如何使用库函数对通用定时器进行配置。这个也是在编写程序中必须要了解的。在这里插入图片描述

(1)使能定时器时钟


   SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
   SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2

(2)初始化定时器参数,包括制定定时器寄存器地址、周期寄存器值、预
定标计数器值等:

 //初始化定时器参数-> 可用InitCpuTimers();直接替代
    //指向Timer0的寄存器地址
    CpuTimer0.RegsAddr=&CpuTimer0Regs;
    //周期寄存器值得配置
    CpuTimer0Regs.PRD.all=0xFFFFFFFF;
    //设置Timer0的预标计数器值为0
    CpuTimer0Regs.TPR.all =0;
    CpuTimer0Regs.TPRH.all=0;
    //设置Timer0的状态为停止状态
    CpuTimer0Regs.TCR.bit.TSS =1;
    //重装载使能
    CpuTimer0Regs.TCR.bit.TRB =1;
    //重置中断计数器
    CpuTimer0.InterruptCount =0;

以上参数配置可直接调用"DSP2833x_CpuTimers.C"的 InitCpuTimers();函数。
(3)定时器的设置
要使用定时器还需要设置它的定时周期以及设置定时器的控制寄存器等。这些在 TI 提供的库函数“DSP2833x_CpuTimers.c”内的函数可实现:
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period);
(4)开启定时器中断功能,并使能定时器

 //开启定时器中断功能并使能定时器
    //设置Timer0的中断入口地址为中断向量表的INT0
    PieVectTable.TINT0=&TIM0_IRQn;
    //开启定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即为Timer0->INT1.7
    IER |=M_INT1;  //使能CPU中断1(INT1)
    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    //使能总中断
    EINT;
    ERTM;   //当使用仿真器调试时可开启 DEBUG 中断,即使用 ERTM 语句

    EDIS;   //开启写保护

(5)编写定时器中断服务函数
编写中断服务函数时需要在函数名前面加上一个关键字“interrupt”

interrupt void TIM0_IRQn(void)
{
    EALLOW;

    LED1_TOGGLE;
    PieCtrlRegs.PIEACK.bit.ACK1=1;  //清除中断标志位


    EDIS;

}

三、定时器TIMER0的函数配置

1.定时器TIMER0初始化函数的配置

代码如下(示例):

//Timer0 初始化函数
//Freq: CPU时钟频率
//Period:定时器周期值,单位us
//T=Freq*Period/150M (s)
void TIM0_Init(float Freq, float Period)
{
    EALLOW;  //关闭写保护

    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0

    //初始化定时器参数-> 可用InitCpuTimers();直接替代
    //指向Timer0的寄存器地址
    CpuTimer0.RegsAddr=&CpuTimer0Regs;
    //周期寄存器值得配置
    CpuTimer0Regs.PRD.all=0xFFFFFFFF;
    //设置Timer0的预标计数器值为0
    CpuTimer0Regs.TPR.all =0;
    CpuTimer0Regs.TPRH.all=0;
    //设置Timer0的状态为停止状态
    CpuTimer0Regs.TCR.bit.TSS =1;
    //重装载使能
    CpuTimer0Regs.TCR.bit.TRB =1;
    //重置中断计数器
    CpuTimer0.InterruptCount =0;


    //定时器配置
    ConfigCpuTimer(&CpuTimer0,Freq,Period);

    //开启定时器中断功能并使能定时器
    //设置Timer0的中断入口地址为中断向量表的INT0
    PieVectTable.TINT0=&TIM0_IRQn;
    //开启定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即为Timer0->INT1.7
    IER |=M_INT1;  //使能CPU中断1(INT1)
    PieCtrlRegs.PIEIER1.bit.INTx7=1;
    //使能总中断
    EINT;
    ERTM;   //当使用仿真器调试时可开启 DEBUG 中断,即使用 ERTM 语句

    EDIS;   //开启写保护

}

2.中断服务函数

代码如下(示例):注意:中断函数也需要在.h文件中声明。

interrupt void TIM0_IRQn(void)
{
    EALLOW;

    LED1_TOGGLE;
    PieCtrlRegs.PIEACK.bit.ACK1=1;  //清除中断标志位


    EDIS;

}

四、定时器TIMER1的函数配置

1.定时器TIMER1初始化函数的配置

void TIM1_Init(float Freq, float Period)
{
    EALLOW; //关闭写保护

    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1

    //初始化定时器参数
    InitCpuTimers();

    //定时器的配置
    ConfigCpuTimer(&CpuTimer1,Freq,Period);

    //设置定时器的中断入口地址
    PieVectTable.XINT13=&TIM1_IRQn;

    //开启定时器
    CpuTimer1Regs.TCR.bit.TSS =0;

    //使能CPU中断(INT13)
    IER |=M_INT13;

    //使能总中断
    EINT;
    ERTM;   //当使用仿真器调试时可开启 DEBUG 中断,即使用 ERTM 语句

    EDIS;  //开启写保护

}

2.中断服务函数

interrupt void TIM1_IRQn(void)
{
   EALLOW;

   LED2_TOGGLE;

   EDIS;

}

五、定时器TIMER2的函数配置

1.定时器TIMER2初始化函数的配置

void TIM2_Init(float Freq, float Period)
{
    EALLOW; //关闭写保护

    SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2

    //初始化定时器参数
    InitCpuTimers();

    //定时器的配置
    ConfigCpuTimer(&CpuTimer2,Freq,Period);

    //设置定时器的中断入口地址
    PieVectTable.TINT2=&TIM2_IRQn;

    //开启定时器
    CpuTimer2Regs.TCR.bit.TSS =0;

    //使能CPU中断(INT13)
    IER |=M_INT14;

    //使能总中断
    EINT;
    ERTM;   //当使用仿真器调试时可开启 DEBUG 中断,即使用 ERTM 语句

    EDIS;  //开启写保护

}

2.中断服务函数

interrupt void TIM2_IRQn(void)
{
   EALLOW;

   LED3_TOGGLE;

   EDIS;

}

六、主函数

#include "key.h"
#include "leds.h"
#include "beep.h"
#include "exti.h"
#include "timer.h"

void main(void)
{
    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
    InitFlash();

    InitSysCtrl();  //系统时钟初始化

    Uint32 i=0;

    //失能CPU级中断,并初始化 PIE 控制器寄存器和 PIE 中断向量表
    InitPieCtrl();
    IER =0x0000;
    IFR =0x0000;
    InitPieVectTable();

    LED_Init();
    BEEP_Init();
    KEY_Init();
    EXTI1_Init();
    TIM2_Init(150,700000);  //T=Freq*Period/150M (s)=0.7s
    TIM1_Init(150,500000);  //T=Freq*Period/150M (s)=0.5s
    TIM0_Init(150,800000);  //T=Freq*Period/150M (s)=0.8s


    while(1)
    {

    }

}

问题:按照上诉程序配置,当单独调用任意一个中断定时器时,程序都可以按照中断服务函数运行,可实现定时器中断,但当在主程序中同时调用3个定时器的初始化函数时,单片机只能正常运行1个或2个定时器中断,且会出现当3个定时器调用先后顺序不同时,其运行的定时器中断也不同,但也不能3个中断函数同时实现,这是为什么?

七、总结

DSP28335中的三个定时器Timer0、Timer1、Timer2的中断配置的区别主要体现在:
(1)开启定时器中欧那个端功能并使能定时器中开启CPU第一组中断并使能定时器对应的PIE中断配置中,对于Timer0,需要两者都需要使能,而对于Timer1、Timer2,由于直接到CPU,故只需使能CPU中断。
(2)中断服务函数的配置,Timer0,需要对PIE中断标志位清零。而对于Timer1、Timer2,由于直接到CPU,不需要做任何标志位清零。

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
DSP2812 PWM波例程 extern int i; Uint32 ratio[]={ 0x40EB,0x40EB,0x39EB,0x39EB,0x38EB,0x38EB,0x37EB,0x37EB,0x36EB,0x36EB,0x35EB,0x35EB,0x34EB,0x34EB,0x33EB,0x33EB,0x32EB,0x32EB,0x31EB,0x31EB,0x30EB,0x30EB,0x30EB,0x30EB,0x30EB,0x29EB,0x29EB,0x29EB,0x29EB,0x29EB,0x28EB,0x28EB,0x28EB,0x28EB,0x28EB,0x27EB,0x27EB,0x27EB,0x27EB,0x27EB,0x26EB,0x26EB,0x26EB,0x26EB,0x26EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x25EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x24EB,0x1500,0x1500,0x1500,0x1500,0x1500,0x1500,0x1500,0x1500,0x1500,0x1500,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x753,0x3000,0x3000,0x3000,0x3000,0x3000,0x38EB,0x38EB,0x38EB,0x38EB,0x38EB,0x39EB,0x39EB,0x38EB,0x38EB,0x40EB}; /**************************************************************************** * *名 称:main() * *功 能:初始化系统和各个外设 * *入口参数:无 * *出口参数:无 * ****************************************************************************/ void main(void) { InitSysCtrl(); //初始化系统函数 DINT; IER = 0x0000; //禁止CPU中断 IFR = 0x0000; //清除CPU中断标志 InitPieCtrl(); //初始化PIE控制寄存器 InitPieVectTable(); //初始化PIE中断向量表 InitGpio(); //初始化Gpio口 InitEv(); //初始化EV // i=0; PieCtrl.PIEIER2.bit.INTx4=1; //使能PIE中断,T1定时器中断位于INT2.4 IER|=M_INT2; EINT; //开全局中断 ERTM; //开实时中断 EvaRegs.T1CON.bit.TENABLE=1; //使能定时器T1计数操作 while(1) { } }
1 运行环境 1. 本书以TI公司的TMS320C6000系列DSP为介绍的对象。 2. DSP开发环境CCS可以运行在Windows 2000或Windows XP系统下。 2 光盘内容介绍 1. 随书所赠光盘每一个文件夹对应书的一章。 光盘的所有实例分别命名为“例M-N”的形式,其“M”代表章号,“N”代表实例序号,例如“例3-1”表示这是第3章实例3-1的文件,“PPT-03”则表示这是第3章PowerPoint教学文件。相关芯片资料文件夹内为本书本章所采用的芯片的Datasheet资料。 2. 读者可以通过邮件联系我们,我们会耐心解答您的问题。 3 PPT文件清单 “PPT”文件夹: PPT-01 第1章 DSP概述 PPT-02 第2章 硬件结构、指令和中断系统 PPT-03 第3章 TMS320DM642的存储器扩展 PPT-04 第4章 主机接口与多通道缓冲串口 PPT-05 第5章 通用输入输出接口与定时器 PPT-06 第6章 TMS320DM642多媒体片内外设 PPT-07 第7章 TMS320DM642最小系统设计 PPT-08 第8章 软件开发环境及程序优化 PPT-09 第9章 视频处理开发实例 PPT-10 第10章 语音处理开发实例 PPT-11 第11章 网络通信开发实例 4 实例、习题文件清单 “程序”文件夹: 03:第3章 例3-1 SDRAM 读写程序 例3-2 FLASH芯片擦除程序 例3-3 FLASH芯片读取程序 例3-4 EDMA整块数据传输程序 例3-5 子帧提取程序 题3-1 FLASH芯片写入程序 题3-2 矩阵转置程序 04:第4章 例4-3 主机写一个字到DSP 例4-4 主机写一串字到DSP 例4-5 缓冲串口初始化及接收发送程序 题4-1 主机从DSP读取数据 05:第5章 例5-1 GPIO驱动LED发光二极管闪烁 例5-2 GPIO驱动液晶显示模块 例5-3 定时器驱动LED发光二极管闪烁 例5-4 定时器输出PWM波驱动直流电机 题5-2 GPIO接口模拟SPI总线 06:第6章 例6-1 网络发送传输图像 例6-2 图像采集 例6-3 音频接收发送 例6-4 报警声发生 08:第8章 例8-13 分数像素插值函数优化 例8-14 SAD计算的线性优化 题8-1 求均值代码优化 题8-2 矢量和代码优化 09:第9章 9-1 视频输入采集程序 9-2 视频输出显示程序 9-3 Sobel算子边缘检测程序 9-4 值滤波程序 9-5 FFT子程序 9-6 H264编码子程序 题9-1 Prewitt 算子边缘检测 10:第10章 10-1 AIC23B 参数设置子程序 10-2 数字回声产生 10-3 语音信号FIR滤波 11:第11章 11-1 网络协议栈 11-2 TCP传输

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值