DSP28335学习笔记:定时器中断

这篇具有很好参考价值的文章主要介绍了DSP28335学习笔记:定时器中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

F28335学习笔记:定时器中断(定时器0、1、2 *注重使用)

F28335的CPU定时器有3个且均为32位,分别是Timer0、Timer1、Timer2, 其中 Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普 通的定时器。这三个定时器的中断信号分别为 TINT0,TINT1,TINT2,分别对应于中断向量 INT1,INT13,INT14。

一、F28335定时器介绍(CPU定时器)


TMS320F28335 的 CPU Time 有三个,分别为 Timer0Timer1Timer2,其中Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普通的定时器。这三个定时器的中断信号分别为 TINT0, TINT1, TINT2,分别对应于中断向量 INT1,INT13,INT14

Timer0:使用PIE中断

Timer1:直接连接到内核 INT13

Timer1:直接连接到内核 INT14

二、定时时间公式


28335定时器0配置,学习,笔记,单片机

三、定时器0配置步骤


定时器1、定时器2在中断服务函数略有不同

1.配置void TIM0_Init(float Freq, float Period)函数

(1) 中断控制配置函数(适用所有中断)

//==========1.中断控制配置函数(适用所有中断)==========//
        InitPieCtrl();        //初始化PIE控制寄存器
        IER = 0x0000;         //失能全部CPU中断
        IFR = 0x0000;         //清除CPU中断标志
        InitPieVectTable();  //初始化PIE中断向量表

(2)使能定时器时钟

//=================2.使能定时器时钟==================//
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
    EDIS;

(3) 设置定时器0的中断入口地址为中断向量表的INT0

//=================3.设置定时器0的中断入口地址为中断向量表的INT0==================//
    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQn;
    EDIS;

(4) 初始化定时器参数

//=================4.初始化定时器参数====================//
    //指向定时器0的寄存器地址
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    //设置定时器0的周期寄存器值
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;  //设置为最大
    //设置定时器预定标计数器值为0
    CpuTimer0Regs.TPR.all  = 0;     //低位
    CpuTimer0Regs.TPRH.all = 0;     //高位
    //确保定时器0为停止状态
    CpuTimer0Regs.TCR.bit.TSS = 1;   //1停止 0开始
    //重载使能
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer0.InterruptCount = 0;   //这个变量用来累计中断计数的次数,TI公司给的

(5) 定时器设置

//=================5.定时器设置====================//
    ConfigCpuTimer(&CpuTimer0, Freq, Period);

(6) 开启定时器中断功能,并使能定时器

//=================6.开启定时器中断功能,并使能定时器====================//
    //开始定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    //使能总中断
    EINT;
    ERTM;

(7)完整函数

void TIM0_Init(float Freq, float Period)
{
//=================2.使能定时器时钟==================//
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0
    EDIS;
​
//=================3.设置定时器0的中断入口地址为中断向量表的INT0==================//
    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQn;
    EDIS;
​
//=================4.初始化定时器参数====================//
    //指向定时器0的寄存器地址
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    //设置定时器0的周期寄存器值
    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;  //设置为最大
    //设置定时器预定标计数器值为0
    CpuTimer0Regs.TPR.all  = 0;     //低位
    CpuTimer0Regs.TPRH.all = 0;     //高位
    //确保定时器0为停止状态
    CpuTimer0Regs.TCR.bit.TSS = 1;   //1停止 0开始
    //重载使能
    CpuTimer0Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer0.InterruptCount = 0;   //这个变量用来累计中断计数的次数,TI公司给的
​
//=================5.定时器设置====================//
    ConfigCpuTimer(&CpuTimer0, Freq, Period);
​
//=================6.开启定时器中断功能,并使能定时器====================//
    //开始定时器功能
    CpuTimer0Regs.TCR.bit.TSS=0;
    //开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
    IER |= M_INT1;
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    //使能总中断
    EINT;
    ERTM;
​
}
2.配置interrupt void TIM0_IRQn(void)函数

因为定时器0是在PIE中断中,所以对 PIE 等寄存器操作需要关闭写保护,因此将该语句放在 EALLOW...EDIS 中。

然后再在中断函数结束前将 PIEACKx 相应的标志清零,即写 1 清零。

interrupt void TIM0_IRQn(void)
{
    EALLOW;
​
    ......定时器功能
​
    PieCtrlRegs.PIEACK.bit.ACK1=1;  //只有定时器0需要,因为是对应在PIE中断当中
    EDIS;
}

四、定时器1配置步骤


因为详细讲述了定时器0的配置,故直接上代码文章来源地址https://www.toymoban.com/news/detail-846600.html

1.配置void TIM1_Init(float Freq, float Period)函数
//定时器1初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
//公式:T = Freq*Period/150 000 000(s)
void TIM1_Init(float Freq, float Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK = 1; // CPU Timer 1
    EDIS;
​
    EALLOW;
    PieVectTable.XINT13 = &TIM1_IRQn;
    EDIS;
​
    // Initialize address pointers to respective timer registers:
    CpuTimer1.RegsAddr = &CpuTimer1Regs;
    // Initialize timer period to maximum:
    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
    // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
    CpuTimer1Regs.TPR.all  = 0;
    CpuTimer1Regs.TPRH.all = 0;
    // Make sure timers are stopped:
    CpuTimer1Regs.TCR.bit.TSS = 1;
    // Reload all counter register with period value:
    CpuTimer1Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer1.InterruptCount = 0;
​
    ConfigCpuTimer(&CpuTimer1, Freq, Period);
​
    CpuTimer1Regs.TCR.bit.TSS=0;
​
    IER |= M_INT13;
​
    EINT;
    ERTM;
​
}
2.配置interrupt void TIM1_IRQn(void)函数
interrupt void TIM1_IRQn(void)
{
    EALLOW;
    
    ......定时器1功能
    
    EDIS;
}
​

五、定时器2配置步骤


1.配置void TIM2_Init(float Freq, float Period)函数
//定时器2初始化函数
//Freq:CPU时钟频率(150MHz)
//Period:定时周期值,单位us
//公式:T = Freq*Period/150 000 000(s)
void TIM2_Init(float Freq, float Period)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER2ENCLK = 1; // CPU Timer 2
    EDIS;
​
    EALLOW;
    PieVectTable.TINT2 = &TIM2_IRQn;
    EDIS;
​
    // Initialize address pointers to respective timer registers:
    CpuTimer2.RegsAddr = &CpuTimer2Regs;
    // Initialize timer period to maximum:
    CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;
    // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
    CpuTimer2Regs.TPR.all  = 0;
    CpuTimer2Regs.TPRH.all = 0;
    // Make sure timers are stopped:
    CpuTimer2Regs.TCR.bit.TSS = 1;
    // Reload all counter register with period value:
    CpuTimer2Regs.TCR.bit.TRB = 1;
    // Reset interrupt counters:
    CpuTimer2.InterruptCount = 0;
​
    ConfigCpuTimer(&CpuTimer2, Freq, Period);
​
    CpuTimer2Regs.TCR.bit.TSS=0;
​
    IER |= M_INT14;
​
    EINT;
    ERTM;
​
}
2.配置interrupt void TIM2_IRQn(void)函数
interrupt void TIM2_IRQn(void)
{
    EALLOW;
    ......定时器功能
    EDIS;
​
}

六、timer.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_ */
​

七、main()函数


#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include <string.h>
#include "stdio.h"
#include "leds.h"
#include "time.h"
​
​
unsigned char i=66;
unsigned char T=0;
​
void main()
{
​
        InitSysCtrl();
//==========1.中断控制配置函数(适用所有中断)==========//
        InitPieCtrl();        //初始化PIE控制寄存器
        IER = 0x0000;         //失能全部CPU中断
        IFR = 0x0000;         //清除CPU中断标志
        InitPieVectTable();  //初始化PIE中断向量表
//==========下载Flash==========//
        MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
        InitFlash();
​
        //TIM0_Init(150,500000);   //0.5s
        //TIM1_Init(150,1000000); //1s
        TIM2_Init(150,1000000); //1s
​
        while(1)
        {
        
        }
​
}
​

到了这里,关于DSP28335学习笔记:定时器中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月13日
    浏览(62)
  • 【ESP32最全学习笔记(基础篇)——8.ESP32 中断定时器】

    关于本教程: 1.ESP32简介                                                                 2.ESP32 Arduino 集成开发环境 3.VS 代码和 PlatformIO 4.ESP32 引脚 5.ESP32 输入输出 6.ESP32 脉宽调制 7.ESP32 模拟输入 8.ESP32 中断定时器 ☑ 9 .ESP32 深度睡眠 ESP32 网络

    2024年02月06日
    浏览(52)
  • STM32 学习笔记(六)定时器中断:内部时钟模式,外部时钟模式

    定时器是功能最强大,内容最复杂的32结构。 之前51用过的功能,定时产生中断。 输出比较,常用于产生 PWM 波形,驱动电机等。 输入捕获,测量方波频率。 编码器,读取正交编码器的波形。 最大定时时间:72M/65536/65536=中断频率,中断频率取倒数是最大定时时间。 定时器可

    2024年02月08日
    浏览(57)
  • 学习笔记|定时器|STC中断|定时器时间计算|STC32G单片机视频开发教程(冲哥)|第十一集:定时器的作用和意义

    什么是定时器:定时器-与非网 上节课的一段代码: TimeCount++然后一个延时1毫秒,每运行1ms,变量就会加一。 系统已经运行了多少个毫秒。 实际使用时的代码如下, 判断按键有沿有按下的时候,我们等待按键松开,还有一个while循环。 如果没有松开,会一直死在这一行。所以,

    2024年02月09日
    浏览(64)
  • STM32 F103C8T6学习笔记4:时钟树、滴答计时器、定时器定时中断

    今日理解一下STM32F103 C8T6的时钟与时钟系统、滴答计时器、定时器计时中断的配置,文章提供原理,代码,测试工程下载。 目录 时钟树与时钟系统: 滴答计时器: 定时器计时中断: 测试结果: 测试工程下载: 该系统介绍在 STM32F10x-中文参考手册 P56页开始 微控制器的时钟系

    2024年02月13日
    浏览(46)
  • STM32 hal库使用笔记(二)中断—定时器中断

    目录 一、定时器简介 二、HAL库配置 1.时钟树的配置 2. CubeMX的配置 三、代码编写 四、拓展实验 五、实验效果 实验目的:利用定时器6控制LED灯的亮灭,间隔500ms 实验平台:正点原子精英板 一、定时器简介     定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发

    2024年01月19日
    浏览(59)
  • STM32学习--定时器中断

    目录  概述 一、STM32 通用定时器简介 1.1 STM32定时器定时原理  1.2 STM32 通用定时器相关寄存器简介 1.3 定时器功能描述 1.4计数器模式 二、定时器中断库函数 2.1 步骤总结 2.2 库函数讲解 总结:         这一章,我们将向大家介绍如何使用 STM32F1 系列 的通用定时器。 TIM

    2024年02月02日
    浏览(49)
  • C51学习———定时器中断

    C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器 或者计数器使用。 确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使 用时,每经过1个机器周期,计数存储器的值就加1。而当配置为

    2023年04月08日
    浏览(43)
  • 单片机学习 11-中断系统(定时器中断+外部中断)

    ​ 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一,是我们学习单片机必须要掌握的。很多初学者被困在中断中,学了很久仍然不知道中断究竟是

    2024年02月05日
    浏览(50)
  • 【STM32笔记】STM32的定时器开发基础(二)(基于STM32CubeMX实现定时器中断)

      传统STM32外部中断 的设计步骤:  (1)将GPIO初始化为输入端口。  (2)配置相关I/O引脚与中断线的映射关系。  (3)设置该I/O引脚对印的中断触发条件。  (4)配置NVIC,并使能中断。  (5)编写中断服务函数。   基于STM32CubeMX的外部中断 设计步骤  (1)在STM3

    2024年02月20日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包