DSP28335笔记 —— 定时器

DSP28335笔记 —— 定时器DSP28335 笔记 定时器相比于 STM32 DSP28335 的定时器好像真的简单了好多 从定时器个数来讲只有 3 个 时钟源只能是系统时钟 而且计数方向也只有向下计数 单纯且善良的定时器 好不让人心生喜爱 目录 DSP28335 笔记 定时器定时器介绍相关寄存器定时器代码实验定时器介绍 TMS320F28335 的 CPUTime 有三个 分别为 Timer0 Timer1 Timer2 其中 Timer1 和 Timer2 是为操作系统 DSP BIOS 保留的 当未移植操作系统时 可用来做普

DSP28335笔记 —— 定时器

定时器介绍

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

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

相关寄存器

大部分寄存器都是写入一个数值,只需要注意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, );//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,所以我这里填

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176834.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午8:56
下一篇 2026年3月26日 下午8:56


相关推荐

  • 又一家中国AI大模型公司创记录

    又一家中国AI大模型公司创记录

    2026年3月16日
    3
  • 相关性和显著性分析

    相关性和显著性分析相关分析用于研究定量数据之间的关系情况 包括是否有关系 以及关系紧密程度等 1 如果呈现出显著性 结果右上角有 号 此时说明有关系 反之则没有关系 有了关系之后 关系的紧密程度直接看相关系数大小即可 一般 0 7 以上说明关系非常紧密 0 4 0 7 之间说明关系紧密 0 2 0 4 说明关系一般 2 如果说相关系数值小于 0 2 但是依然呈现出显著性 右上角有 号 1 个 号叫 0 05 水平显

    2026年3月26日
    1
  • sass与scss的区别

    sass与scss的区别用了很久 css 预编译器 但是一直不太清楚到底用的 sass 还是 scss 直到有天被问住了有点尴尬 找了个教程撸了遍 异同 简言之可以理解 scss 是 sass 的一个升级版本 完全兼容 sass 之前的功能 又有了些新增能力 语法形式上有些许不同 最主要的就是 sass 是靠缩进表示嵌套关系 scss 是花括号 sass 太费眼了 fatherwidth 100px son

    2026年3月20日
    1
  • centos7防火墙配置详细

    centos7防火墙配置详细一 条件防火墙是开启的 systemctlsta 查看防火墙的配置 firewall cmdstate2 开放 80 端口 firewall cmdpermanent port 80 tcpfirewall cmdreload 重新加载防火墙配置才会起作用 3 移除以上规则 firewall cmdpermanen

    2026年3月26日
    2
  • 超简单!手把手教你玩转ClaudeCode,无魔法不会员!

    超简单!手把手教你玩转ClaudeCode,无魔法不会员!

    2026年3月15日
    2
  • angularjs技术

    angularjs技术angularjs第一天五大事件1、绑定事件,ng-model;2、绑定对应的控制器,ng-controller;3、绑定对应的APP,ng-app;4、单击事件,ng-click;5、初始化事件,ng-init;引入angularjs,使用angularjs语法<scriptsrc="…/plugins/angularjs/angular.min.js"type=…

    2022年7月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号