DSP28335笔记 —— 定时器

2023-05-16

DSP28335笔记 —— 定时器

相比于STM32,DSP28335的定时器好像真的简单了好多,从定时器个数来讲只有3个,时钟源只能是系统时钟,而且计数方向也只有向下计数。
单纯且善良的定时器,好不让人心生喜爱。

目录

  • DSP28335笔记 —— 定时器
    • 定时器介绍
    • 相关寄存器
    • 定时器代码实验

定时器介绍

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

定时器的功能如下图所示:
在这里插入图片描述
由图可以看出,TCR为0时定时器才可以开始工作;
TDDR(低位)和TDDRH(高位)组成16位寄存器,对系统时钟进行分频;
PRD(低位)和PRDH(高位)组成32位寄存器,储存每次重装载的值,相当于定时周期;
TIM(低位)和TIMH(高位)组成32位寄存器,用作定时器的当前计时的记录值。

对比STM32的时钟,DSP28335的定时器真的更单纯,DSP28335的定时器只能向下计数,而且不和PWM和CAP功能混在一起让人心烦。

中断方面,定时器0的中断信号通过PIE模块进入内核,定时器1、定时器2的中断信号则直接进入内核。
在这里插入图片描述

相关寄存器

三个定时器的基本设定是相同,具体了解其中一组即可
在这里插入图片描述

大部分寄存器都是写入一个数值,只需要注意TCR寄存器各个位的功能:

TCR寄存器功能介绍

TCR寄存器功能介绍

定时器代码实验

  • 实验内容: 利用定时器0中断,每秒钟改变一次数码管的显示值。为了验证程序是在中断中完成,主函数中设置一个LED的亮灭翻转。

首先完成主函数框架:

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

    InitPieCtrl();//初始化PIE模块
    InitPieVectTable();//初始化PIE中断矢量表
    IER = 0x0000;//清空CPU级中断使能
    IFR = 0x0000;//清空CPU级中断标志

    SEG_Init();//数码管初始化
    LED_Init();//LED初始化
    Seg_SetNum(0);//设置数码管初始显示0

    TIM0_Init(150, 1000000);//TIM0配置  150MHz时钟频率   周期1s

    while(1)
    {//如果程序执行正常,LED闪烁
        GpioDataRegs.GPBTOGGLE.bit.GPIO60 = 1;
        delay();
    }
}

今天主要内容是定时器的使用,下面只贴出TIM0_Init()功能函数的实现代码

void TIM0_Init(float Freq, float Period)
{
    long temp;
    DINT;//全局中断关闭
//第1步 打开TIM0时钟
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
    EDIS;
//第2步 设置中断入口地址
    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQ;
    EDIS;
//第3步 配置定时器基本
    EALLOW;
    // Initialize address pointers to respective timer registers:
    CpuTimer0.RegsAddr = &CpuTimer0Regs;
    // Initialize timer period:
    CpuTimer0.CPUFreqInMHz = Freq;
    CpuTimer0.PeriodInUSec = Period;
    temp = (long) (Freq * Period);
    CpuTimer0.RegsAddr->PRD.all = temp;
    // Set pre-scale counter to divide by 1 (SYSCLKOUT):
    CpuTimer0.RegsAddr->TPR.all  = 0;
    CpuTimer0.RegsAddr->TPRH.all  = 0;
    // Initialize timer control register:
    CpuTimer0.RegsAddr->TCR.bit.TSS = 1;   // 1 = Stop timer, 0 = Start/Restart Timer
    CpuTimer0.RegsAddr->TCR.bit.TRB = 1;   // 1 = reload timer 使能定时器重载功能
    CpuTimer0.RegsAddr->TCR.bit.SOFT = 0;
    CpuTimer0.RegsAddr->TCR.bit.FREE = 0;  // Timer Free Run Disabled
    CpuTimer0.RegsAddr->TCR.bit.TIE = 1;   // 0 = Disable/  1 = Enable Timer Interrupt
    // Reset interrupt counter:
    CpuTimer0.InterruptCount = 0;
//第4步 打开定时器
    CpuTimer0.RegsAddr->TCR.bit.TSS = 0;   // 1 = Stop timer, 0 = Start/Restart Timer
//第5步 打开PIE组对应中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    EDIS;
//第6步 打开CPU中断
    IER |= M_INT1;
    EINT;//全局中断打开

    ERTM;

}

interrupt void TIM0_IRQ(void)
{
    static unsigned char i = 0;
    i++;
    if(i > 9) i = 0;
    Seg_SetNum(i);//更换显示数字
    
    EALLOW;
    CpuTimer0Regs.TCR.bit.TIF = 1;//清除外设级中断标志位
    PieCtrlRegs.PIEACK.bit.ACK1 = 1;//清除PIE级中断应答
    EDIS;
}

在TIM0_Init(float Freq, float Period) 中,第三步的代码是复制TI公司的代码(FILE: DSP2833x_CpuTimers.c)也可以简化成下面的样子。

void TIM0_Init(float Freq, float Period)
{
    long temp;
    DINT;
//第1步 打开TIM0时钟
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1;
    EDIS;
//第2步 设置中断入口地址
    EALLOW;
    PieVectTable.TINT0 = &TIM0_IRQ;
    EDIS;
//第3步 配置定时器基本
    // Initialize address pointers to respective timer registers:
    InitCpuTimers();
    // Initialize timer period:
    ConfigCpuTimer(&CpuTimer0,Freq,Period);
//第4步 打开定时器
    EALLOW;
    CpuTimer0.RegsAddr->TCR.bit.TSS = 0;
//第5步 打开PIE组对应中断
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
    EDIS;
//第6步 打开CPU中断
    IER |= M_INT1;
    EINT;

    ERTM;
}

PS: 可能有些朋友不太清楚 ConfigCpuTimer(&CpuTimer0,Freq,Period);的三个参数。这里简单注释一下,函数原型为

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)

	其中Timer的可选参数有三个,就是分别对应的三个定时器
	&CpuTimer0 、 &CpuTimer1 、 &CpuTimer2 ;

	Freq 为系统时钟单位MHZ,我用的系统时钟为150MHz,所以我在这里填 150;

	Period 为期望的定时周期,单位为us 。我的目标是1s,所以我这里填1000000

可能有朋友会像我一样疑惑为什么没有涉及到预分频的设置。通过阅读源文件,我发现TI公司直接是对系统时钟不分频CpuTimer0.RegsAddr->TPR.all = 0; CpuTimer0.RegsAddr->TPRH.all = 0; 凭借着自己是个32位的计数器,通过肆意改变定时周期的自动装载值来实现不同时间的定时,超霸气,超简便,超赞。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DSP28335笔记 —— 定时器 的相关文章

  • OpenCV基本介绍和安装

    OpenCV是一个通用 开源 功能强大的图像处理和计算机视觉库 官方网站 xff1a Home OpenCV 1999年 加里 布拉德斯基在Intel公司创建了计算机视觉库 xff08 Computer Vision Library xff
  • java jni ubuntu 环境搭建时遇到的坑

    1 xff1a 版本不一致遇到的坑 javah的版本需要同javac的版本一致 如果版本的问题搞不定 xff0c 直接用andorid source build之后的环境即可 2 xff1a javah使用遇到的坑 jni中字段描述符可以使
  • jni中native通过adb输出

    本文主要实践了如何在jni中打印log xff0c 贴源码 xff1a Android mk主要是巴拉的android源码中的app LOCAL PATH 61 call my dir include CLEAR VARS TARGET P
  • 关于服务器端用C语言实现TCP的数据接收

    关于这个 xff0c 真的是踩过很多坑 xff0c 罗列了一下要注意的点 xff1a 代码前面一定要添加库 xff0c 不然会出很多错 pragma comment lib 34 Ws2 32 lib 34 这段代码在vs2017中怎么也编
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • Java进阶day03继承

    先贴代码后分析 xff1a class Person span class hljs keyword private span span class hljs keyword int span age span class hljs key
  • JAVA进阶day05包和权限

    我这种外行人也听说过jar包 xff0c jar到底是个啥 xff1f 为啥c语言里没有呢 xff1f 下面我们拨开这一层面纱 贴代码做分析 xff1a 一 jar包 import a span class hljs preprocesso
  • Nandflash希尔特编程器烧录带来的一些点知识信息

    1 xff0e NAND FLASH 的特殊性 1 存在坏块 NAND FLASH 由于其生产工艺的原因 xff0c 出厂芯片中会随机包含坏块 坏块在出厂时已经被初始化 xff0c 并在特定区域中存在标记 xff0c 如果在使用过程中出现坏
  • 浅谈关于SRAM与DRAM的区别

    从名字上看 xff0c SRAM与DRAM的区别只在于一个是静态一个是动态 由于SRAM不需要刷新电路就能够保存数据 xff0c 所以具有静止存取数据的作用 而DRAM则需要不停地刷新电路 xff0c 否则内部的数据将会消失 而且不停刷新电
  • 在中断程序里修改全局变量的童鞋注意啦~(C中的volatile作用 转载~)

    一个定义为volatile的变量是说这变量可能会被意想不到地改变 xff0c 这样 xff0c 编译器就不会去假设这个变量的值了 精确地说就是 xff0c 优化器在用到这个变量时必须每次都小心地重新读取这个变量的值 xff0c 而不是使用保
  • arm MMU详解

    一 MMU的产生 许多年以前 xff0c 当人们还在使用DOS或是更古老的操作系统的时候 xff0c 计算机的内存还非常小 xff0c 一般都是以K为单位进行计算 xff0c 相应的 xff0c 当时的程序规模也不大 xff0c 所以内存容
  • 如何使用repo sync

    我們知道 repo 是 Google 為 Android source tree 的管理而寫的一個 script xff0c 以方便處理 Android 源碼包含的上百個 git repositories 要取得 upstream 最新的
  • 网络编程之Socket通信原理,TCP 、UDP、IPv4 IPv6地址,网络原理基础

    相关博客网址 xff1a https www cnblogs com wangcq p 3520400 html 本帖内容来源于网络 xff0c 如有侵权请联系删除 加粗样式 什么是TCP IP UDP xff1f TCP IP xff08
  • C++ 生成dll时没有顺带生成lib的原因

    C 43 43 dll库只生成dll文件 xff0c 而未生成lib文件 xff0c 问题在于没有在接口函数前面加上前缀 declspec dllexport 在VS的工程中 xff0c 此前缀常常被宏定义为 xff1a 工程名 API s
  • burp suite安装时,注册机点击run不起作用解决

    1 在cmd打开burpsuite pro v2 0beta jar所在目录 2 运行 java Xbootclasspath p burp loader keygen jar jar burpsuite pro v2 0beta jar
  • win10系统日语输入法只能打出英文字母无法切换&&微软输入法无法使用

    显示如下 xff1a 法1 xff1a 如果添加了日文 也安装了基本输入 xff0c 但是调出日文输入时屏幕右下角并不显示英文和假名的切换字母A xff0c 只能输入英文 xff0c 这样的win10一般安装的是ghost版 xff0c 一
  • 电脑虚拟摄像头 -obs及obs虚拟摄像头插件(免费)

    插件 xff1a 链接 xff1a https pan baidu com s 1AdAyc41LOHoSNesefcNOcA 提取码 xff1a pjne obs安装包 xff1a 链接 xff1a https pan baidu com
  • Mac电脑使用自然码双拼

    首先在键盘里选择双拼 然后打开 终端 执行 启动台 gt 其他当中 defaults span class token function write span com apple inputmethod CoreChineseEngineF
  • Mac.Android studio环境的搭建

    一 连接安卓手机 1 在 终端输入 xff1a system profiler SPUSBDataType 可以查看连接的usb设备的信息 2 创建 修改adb usb ini文件 输入 xff1a vi android adb usb i

随机推荐

  • rgb 与 #开头16进制 HEX颜色值关系转换,颜色值透明度的百分数对应十六进制表

    1 0x开头与 开头 从计算机的数值表示上讲 xff0c 0x开头的其实并不是所谓颜色代码的表示方法 xff0c 而是16进制数的标准写法 xff0c 譬如0xA就是十进制的10 而 开头 的六 xff08 或三 xff09 位十六进制数是
  • 74ls160 24进制异步计数器

    说明 xff1a 1 使用multisim 12仿真正常进位 xff0c 实际中可能到9进位 此时需要在U1和U2 xff0c RCO与Clk之间加个反相器 2 计数为23时清零 xff0c
  • SSH 出现 The authenticity of host xxx can't be established.

    已采纳 这个原因可能是本地主机的key发生了变化 xff0c 因此每次SSH链接都会有提示 xff0c 只需要在交互下输入yes即可 当然如果长久的想解决问题 xff0c 可以采用以下方法 xff1a 1 使用ssh连接远程主机时加上 o
  • Idea修改字符编码。解决文本乱码,以及控制台打印乱码问题,cmd乱码

    一 Idea修改字符编码 File gt Settings 二 文本乱码 修改编码为文本为文本本来的编码 xff0c 这里以GBK为例 点击apply xff0c 然后选择Reload 同样操作将编码改为utf 8 然后选择convert
  • Vrpn源码浅析(一)-添加自定义设备概述

    好记性不如烂笔头 最近需要用VRPN获取设备数据 xff0c 有些设备不在VRPN现有支持设备列表里 xff0c 就想着自己改一下源码添加一下 在网上找了一段时间发现包括官网上的教程基本都是教你怎么用的 xff0c 没找到告诉你怎么改的 x
  • (3)odroid xu4/3 SD卡的ubuntu系统烧入

    1 下载镜像 xff1a http odroid com dokuwiki doku php id 61 en xu3 release linux ubuntu 选择一个版本下载 xff08 镜像服务器 xff09 2 下载烧写工具 xff
  • Vrpn源码浅析(三)-添加optitrack追踪设备

    好记性不如烂笔头 xff0c 之前进行了源码的简单分析并尝试添加了joystick这类包含analog以及button类型数据的设备 这次我们更近一步 xff0c 尝试添加最为复杂的追踪设备 本次添加的设备为optitrack xff0c
  • [Index]博文索引

    为了方便查看需要的博文 xff0c 在此给出所有博文的索引链接地址 UAV Software Version xff1a ArduCopter xff08 Ver 3 3 xff09 Hardware Version xff1a pixha
  • NVIDIA JETSON XAVIER NX (四)安装Pytorch和torchvision

    可选择在NX上创建新python环境进行安装 xff0c 避免和其他工程环境发生冲突 xff0c 具体虚拟环境操作步骤可见Python创建虚拟环境 下面就开始安装pytorch的愉快之旅吧 xff01 1 安装相关依赖环境 span cla
  • 使用nuttx写自启任务

    首先从px4学习怎么进行系统任务 px4是通过nsh main里面调用nsh consolemain然后调用rcS文件 xff0c 运用rcS脚本命令启动相应模块 然而经过了一个礼拜的实践 xff08 浪费时间 xff09 xff0c 我发
  • QT常用库、类、函数等

    文章目录 常用基类QObject类内存管理机制 xff1a 父子对象的内存管理机制 QApplication类 xff1a 应用程序类 xff08 一般不直接操纵 xff09 QWidget类 xff1a 窗体类容器控件QStackedWi
  • 单片机中堆栈那些事儿

    堆栈是内存中一段连续的存储区域 xff0c 用来保存一些临时的数据 xff0c 比如 xff0c 可以保存中断指令INT中的标志寄存器值 代码段寄存器CS值 指令指针寄存器IP值 xff1b 还可以用以RET指令从中可以得到返回的地址 xf
  • udp 通信

    1 char strtok char str const char delim 功能 xff1a 对字符串进行切割 参数 xff1a str 要切割的字符串的首地址 delim 切割的规则 返回值 xff1a 切割后字符串的首地址 2 ud
  • Unix网络编程 Ubuntu20.04.2 Visual Studio Code

    Visual Studio Code 说明 1 本文中 表示下一步 下一级菜单和修改为 xff0c 需根据上下文理解 一 环境配置 1 安装gcc g 43 43 和gdb span class token function sudo sp
  • 基于Jetson NX的模型部署

    系统安装 系统安装过程分为3步 xff1a 下载必要的软件及镜像 Jetson Nano Developer Kit SD卡映像 https developer nvidia com jetson nano sd card image Wi
  • C51单片机学习笔记——秒表

    前言 不知不觉我又被自己的惰性拖住了小一个月 xff0c 今天在宿舍窗边吸烟时候 xff0c 看着楼下人来人往的道路不由自主的感到一丝惭愧 xff0c 手里的小视频也被我刷出来一条鸡汤 xff0c 在这儿我要写下来记录给将来又在颓废的我 x
  • arduino学习——UART串口通信

    Serial begin 初始化串口 用作串口的启动 xff0c 常放置在setup xff08 xff09 中 原型 xff1a Serial begin speed Serial begin speed config 参数 xff1a
  • arduino学习——servo类 控制舵机

    硬件 WeMos D1平台 43 SG90舵机 SG90舵机相关介绍 xff1a 角度 xff1a 90度 180度通用 红色为5V电源线 xff0c 棕色为地线 xff0c 橙色为信号线 无负载转速 xff1a 0 12秒 60度 xff
  • DSP28335笔记 ———— 中断系统 之 外部中断

    DSP28335笔记 中断系统 之 外部中断 我用的开发板是 硬汉DSP28335开发板 xff0c 文中对于硬件的描述可以说是没有 xff0c 而且我还没有附上电路图希望在看的朋友不要喷我 然后 xff0c 我个人感觉普中的DSP2833
  • DSP28335笔记 —— 定时器

    DSP28335笔记 定时器 相比于STM32 xff0c DSP28335的定时器好像真的简单了好多 xff0c 从定时器个数来讲只有3个 xff0c 时钟源只能是系统时钟 xff0c 而且计数方向也只有向下计数 单纯且善良的定时器 xf