一、定时器原理

        F28335 城市的三座时钟塔(Timer0、Timer1、Timer2)是城市时间管理的核心设施,每座均为32位精度,依靠城市能源脉冲(系统时钟 SYSCLKOUT,典型频率为150 MHz)驱动。它们由两个核心模块组成:节奏调节站(预分频模块)计时核心站(定时/计数模块),协同工作以实现精确计时。

  • 节奏调节站(预分频模块)

    • 节奏分频器(16位定时器分频寄存器 TDDRH:TDDR):决定城市能源脉冲的“放慢”倍数。例如,若 TDDR=9,则每10个脉冲(从0到9)产生一次有效信号,相当于将脉冲频率除以10。
    • 节奏计数器(16位预定标计数器 PSCH:PSC):记录收到的脉冲数。每次脉冲到来,PSC 减1;当 PSC 减到0时,触发“下溢”,向计时核心站发送信号,并重新装载 TDDR 的值,开始下一轮计数。
  • 计时核心站(定时/计数模块)

    • 周期蓝图(32位周期寄存器 PRDH:PRD):定义一次完整计时周期的长度,决定时钟塔多久敲响一次“钟声”。
    • 计时器(32位计数寄存器 TIMH:TIM):记录当前计时进度。每次从节奏调节站收到信号,TIM 减1;当 TIM 减到0时,触发“下溢”,产生“钟声”(中断信号),并重新装载 PRD 的值。

工作流程如下:

  1. 城市能源脉冲(SYSCLKOUT)每跳动一次,节奏计数器(PSC)减1。
  2. 当 PSC 减到0,触发下溢,向计时器(TIM)发送信号,TIM 减1,同时 PSC 重新装载 TDDR 的值。
  3. 当 TIM 减到0,触发下溢,产生中断信号(TINT0、TINT1 或 TINT2),通知中央政府(CPU),并重新装载 PRD 的值,循环往复。

        时钟塔的“钟声”通过城市通信网络(PIE 中断系统)传递,Timer0 的中断(TINT0)属于第一组第七个小信号(PIEIER1.bit.INTx7)。中断信号经过 PIE 模块处理后到达中央政府,确保任务按时执行。

周期计算公式


定时周期 = (PRD + 1) × (TDDR + 1) × (1 / SYSCLKOUT)


例如,若 SYSCLKOUT=150 MHz(周期6.67 ns),PRD=14999999,TDDR=9,则定时周期为:
(14999999 + 1) × (9 + 1) × 6.67 ns = 15000000 × 10 × 6.67 ns = 1秒。

二、具体代码

2.1 ConfigCpuTimer 函数

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{Uint32 temp;// Initialize timer period:Timer->CPUFreqInMHz = Freq;Timer->PeriodInUSec = Period;temp = (long)(Freq * Period);Timer->RegsAddr->PRD.all = temp;// Set pre-scale counter to divide by 1 (SYSCLKOUT):Timer->RegsAddr->TPR.all = 0;Timer->RegsAddr->TPRH.all = 0;// Initialize timer control register:Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart TimerTimer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timerTimer->RegsAddr->TCR.bit.SOFT = 0;Timer->RegsAddr->TCR.bit.FREE = 0;     // Timer Free Run DisabledTimer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt// Reset interrupt counter:Timer->InterruptCount = 0;
}
功能概述

ConfigCpuTimer 是城市提供的一套标准管理工具(库函数),用于配置任意一座时钟塔(Timer0、Timer1 或 Timer2)的运行参数。根据城市需求调整时钟塔的节奏和计时周期,确保其“钟声”(中断信号)按预期时间响起。该函数接受三个参数:

  • Timer:指向时钟塔管理结构(CPUTIMER_VARS)的指针,包含时钟塔的寄存器地址、频率、周期等信息。
  • Freq:城市能源脉冲频率(单位:MHz,例如 150 MHz)。
  • Period:期望的计时周期(单位:微秒,例如 500000 表示 500ms)。
详细分析
  1. 参数存储

Timer->CPUFreqInMHz = Freq;
Timer->PeriodInUSec = Period;
    • 将输入的频率和周期存储到 Timer 结构中,便于后续管理和调试。
    • 例如,若 Freq=150,Period=500000,则记录 CPU 频率为 150 MHz,周期为 500ms。
  1. 计算周期蓝图(PRD 值)

temp = (long)(Freq * Period);
Timer->RegsAddr->PRD.all = temp;
  • 计算周期寄存器(PRD)的值,决定时钟塔敲响“钟声”的时间间隔。
  • 公式:PRD = Freq * Period,其中 Freq(MHz)× Period(微秒)= 周期脉冲数。
  • 示例:若 Freq=150 MHz,Period=500000 微秒(500ms),则:
PRD = 150 * 500000 = 75000000
    • 表示时钟塔需要计数 75000000 个脉冲(每个脉冲 6.67 ns,150 MHz 的倒数),对应 500ms。
    • 注意:实际硬件实现中,PRD 寄存器从 0 计数到 PRD 值(含 0,共 PRD+1 次),但此处代码直接使用 Freq * Period,未减 1,可能导致周期略偏,实际周期为 (PRD+1) × (1/SYSCLKOUT)。开发者需根据硬件手册验证是否需要调整。
  1. 设置节奏调节站(TPR/TPRH)

Timer->RegsAddr->TPR.all = 0;
Timer->RegsAddr->TPRH.all = 0;
  • 将预定标寄存器(TPR/TPRH)清零,表示不使用分频(TDDR=0,PSC=0)。
  • 此时,SYSCLKOUT 的每个脉冲直接驱动 TIM 计数器减 1,分频系数为 1。
  • 公式:定时周期 = (PRD+1) × (TDDR+1) × (1/SYSCLKOUT),由于 TDDR=0,周期简化为:

定时周期 = (PRD+1) × (1/SYSCLKOUT)
示例:PRD=75000000,SYSCLKOUT=150 MHz(周期 6.67 ns),则:

定时周期 = (75000000+1) × 6.67 ns ≈ 500000006.67 ns ≈ 500ms
4.配置时钟塔控制面板(TCR)

Timer->RegsAddr->TCR.bit.TSS = 1;      // 停止时钟塔
Timer->RegsAddr->TCR.bit.TRB = 1;      // 启用重载
Timer->RegsAddr->TCR.bit.SOFT = 0;     // 非软启动
Timer->RegsAddr->TCR.bit.FREE = 0;     // 非自由运行
Timer->RegsAddr->TCR.bit.TIE = 1;      // 启用中断
  • TSS=1:停止时钟塔(Timer Stop Status),确保在配置期间不运行。
  • TRB=1:启用重载(Timer Reload Bit),当 TIM 计数器归零时,自动从 PRD 重新装载值。
  • SOFT=0, FREE=0:禁用软启动和自由运行模式,确保时钟塔在调试时暂停,适合精确控制。
  • TIE=1:启用中断(Timer Interrupt Enable),允许时钟塔在 TIM 归零时产生“钟声”(中断信号)。

5.重置中断计数

Timer->InterruptCount = 0;
  • 清零中断计数器,记录时钟塔触发的中断次数(用于调试或统计)。

2.2 TIM0_Init 函数

void TIM0_Init(float Freq, float Period)
{EALLOW;SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // CPU Timer 0EDIS;EALLOW;PieVectTable.TINT0 = &TIM0_IRQn;EDIS;CpuTimer0.RegsAddr = &CpuTimer0Regs;CpuTimer0Regs.PRD.all = 0xFFFFFFFF;CpuTimer0Regs.TPR.all = 0;CpuTimer0Regs.TPRH.all = 0;CpuTimer0Regs.TCR.bit.TSS = 1;CpuTimer0Regs.TCR.bit.TRB = 1;CpuTimer0.InterruptCount = 0;ConfigCpuTimer(&CpuTimer0, Freq, Period);CpuTimer0Regs.TCR.bit.TSS = 0;IER |= M_INT1;PieCtrlRegs.PIEIER1.bit.INTx7 = 1;EINT;ERTM;
}
详细分析
  1. 启动能源供应

    EALLOW; SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; EDIS;
    • 打开 Timer0 的能源开关(PCLKCR3.bit.CPUTIMER0ENCLK=1),连接城市电力网络(SYSCLKOUT)。
    • EALLOW 和 EDIS 用于解除和恢复寄存器写保护,确保安全操作。
  2. 设置中断通信地址

    EALLOW; PieVectTable.TINT0 = &TIM0_IRQn; EDIS;
    • 将 Timer0 的“钟声”(TINT0 中断)映射到中断服务函数 TIM0_IRQn 的地址(中断向量表 INT1)。
    • 确保中央政府(CPU)在收到 TINT0 信号时调用正确的响应程序。
  3. 初始化 Timer0 寄存器

    CpuTimer0.RegsAddr = &CpuTimer0Regs; CpuTimer0Regs.PRD.all = 0xFFFFFFFF; CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 1; CpuTimer0Regs.TCR.bit.TRB = 1; CpuTimer0.InterruptCount = 0;
    • CpuTimer0.RegsAddr:指定 Timer0 的寄存器地址,绑定管理结构。
    • PRD.all = 0xFFFFFFFF:初始化周期蓝图为最大值(32位全1),为后续配置留空间。
    • TPR.all = 0, TPRH.all = 0:清零节奏调节站(TDDR 和 PSC),默认不分频。
    • TCR.bit.TSS = 1:停止时钟塔,确保配置期间不运行。
    • TCR.bit.TRB = 1:启用重载功能。
    • InterruptCount = 0:清零中断计数。
  4. 调用 ConfigCpuTimer

    ConfigCpuTimer(&CpuTimer0, Freq, Period);
    • 调用 ConfigCpuTimer 设置 Timer0 的周期(PRD = Freq × Period)和运行参数(TCR、TPR/TPRH)。
    • 示例:Freq=150 MHz,Period=500000 微秒,PRD=75000000,对应 500ms。
  5. 启动时钟塔并启用中断

    CpuTimer0Regs.TCR.bit.TSS = 0; IER |= M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7 = 1; EINT; ERTM;
    • TCR.bit.TSS = 0:启动 Timer0 时钟塔,开始计数。
    • IER |= M_INT1:启用 CPU 第一组中断(INT1,包含 TINT0)。
    • PieCtrlRegs.PIEIER1.bit.INTx7 = 1:启用 PIE 第一组第七小中断(TINT0)。
    • EINT:启用全局中断。
    • ERTM:启用实时中断模式,确保中断处理不被调试暂停。

3. TIM0_IRQn 中断

interrupt void TIM0_IRQn(void)
{EALLOW;LED2_TOGGLE;PieCtrlRegs.PIEACK.bit.ACK1 = 1;EDIS;
}

TIM0_IRQn 是 Timer0 的中断服务函数(ISR),相当于时钟塔敲响“钟声”时中央政府的响应程序。它在 Timer0 计数器(TIM)归零时触发,负责翻转 D2 信号灯状态并清除中断标志,确保下次“钟声”正常触发。

详细分析
  1. 解除写保护

    EALLOW;
    • 解除寄存器写保护,允许操作 PIE 寄存器。
  2. 翻转 D2 信号灯

    LED2_TOGGLE;
    • 调用宏 LED2_TOGGLE,翻转 D2 信号灯的电平(高变低,低变高)。
    • 实现效果:每次中断触发,D2 信号灯状态切换,周期为 500ms(由 ConfigCpuTimer 设置),即每 500ms 点亮或熄灭。
  3. 清除中断标志

    PieCtrlRegs.PIEACK.bit.ACK1 = 1;
    • 清除 PIE 第一组中断的确认标志(ACK1),通知通信网络(PIE)已处理本次中断。
    • 若不清除,PIE 将阻止下一次 TINT0 中断触发,导致时钟塔“钟声”失效。
  4. 恢复写保护

    EDIS;
    • 恢复寄存器写保护,确保系统安全。

TIM0_IRQn 是 Timer0 中断的响应核心,简洁高效地处理 D2 信号灯的闪烁任务,并通过清除标志位保证中断系统的正常运行。其执行时间需尽量短,以避免影响其他任务。


综合流程:

  1. 初始化(TIM0_Init)

    • 打开 Timer0 能源(PCLKCR3),设置中断地址(TINT0 → TIM0_IRQn)。
    • 初始化寄存器(PRD=0xFFFFFFFF,TPR/TPRH=0,TSS=1,TRB=1)。
    • 调用 ConfigCpuTimer 设置 PRD=75000000(500ms),启用中断(TIE=1)。
    • 启动 Timer0(TSS=0),启用 PIE 中断(INT1、INTx7)和全局中断。
  2. 运行

    • Timer0 接收 SYSCLKOUT 脉冲(150 MHz),TIM 计数器从 75000000 减到 0。
    • 每 500ms(75000001 × 6.67 ns),TIM 归零,触发 TINT0 中断。
  3. 中断处理(TIM0_IRQn)

    • 翻转 D2 信号灯状态。
    • 清除 PIEACK 标志,准备下次中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96199.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96199.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/96199.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用倒计时软件为考研备考精准导航 复习 模拟考试 日期倒计时都可以用

考研,是一场与时间的博弈。从决定报名的那一刻起,日历上的每一个数字都被赋予了特殊意义 —— 报名截止日、现场确认期、初试倒计时、成绩查询点…… 这些节点如同航标,指引着备考者的方向。而在这场漫长的征途里,一款精准、易用的…

React学习(七)

目录:1.react-进阶-antd-搜索2.react-进阶-antd-依赖项说明 3.react-进阶-antd-删除1.react-进阶-antd-搜索我们jsx代码里只能返回一个最顶层的根元素下拉框简化写法:把这个对象结构赋值一下:清空定义个参数类型做修改事件需要定义三个…

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)进程间通信(IPC)的比较

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1 或 localhost)都是进程间通信(IPC)的方式,但它们在实现、性能和适用场景上有显著区别。以下是两者的对比:1. 通信机制Unix Domain…

SQL中对时间操作的函数

以下是SQL中常用时间操作函数的汇总,按功能分类整理,结合多个权威来源内容综合而成: 一、获取当前时间 函数名称功能说明示例适用数据库CURDATE()获取当前日期(不含时间)SELECT CURDATE(); → 2024-08-21MySQL, Mari…

NUS PC5215 Lecture分析 Week1 Python基础

NUS PC5215 Lecture分析 Week1 Python基础前言Python基础数据类型保留字表达式Import 相关库IEEE浮点数前言 课程网站 作为一名计算机本科毕业的学生,该课程有点类似于本科期间学的数值分析的进化版,大抵是教会你如何实现各种方法,诸如蒙特卡…

模型私有化部署(Ollama vLLM LMDeploy)

一、魔塔社区平台介绍 1.1 什么是魔塔社区? 魔塔(ModelScope)是由阿里巴巴达摩院推出的开源模型即服务(MaaS)共享平台,汇聚了计算机视觉、自然语言处理、语音等多领域的数千个预训练AI模型。其核心理念是…

C++编程实践--资源管理、标准库、并发与并行

文章目录 资源管理 资源访问 指向资源句柄或描述符的变量,在资源释放后立即赋予新值 lambda函数 当lambda会逃逸出函数外面时,禁止按引用捕获局部变量 避免lambda表达式使用默认捕获模式 资源分配与回收 避免出现delete this操作 使用恰当的方式处理new操作符的内存分配错误 …

“R语言+遥感”的水环境综合评价方法实践技术应用

专题一、R语言概述1.1 R语言特点(R语言)1.2 安装R(R语言)1.3 安装RStudio(R语言)(1)下载地址(2)安装步骤(3)软件配置1.4 第一个程序He…

【项目复盘】【四轴飞行器设计】驱动开发部分

由于在参加面试时总需要花时间一点一点的回忆自己的项目内容,故我打算直接写一系列的项目复盘博客,方便每次面试前的回忆。内容仅作分享交流,如有谬误欢迎指正。 本项目系列的文章目录如下: 【项目复盘】【四轴飞行器设计】驱动…

wpf之ComboBox

前言 wpf中ComboBox的应用非常广泛&#xff0c;本文就来介绍ComboBox在wpf中的应用。 1、非MVVM模式下 1.1 xaml添加元素<ComboBox x:Name"cbx_test1" SelectedIndex" 0" ><ComboBoxItem >小明</ComboBoxItem ><ComboBoxItem &g…

从零开始学AI——13

前言 夏天快要过去&#xff0c;本书也快接近尾声了。 第十三章 13.1 半监督学习 在此之前&#xff0c;我们讨论的所有学习范式都具有非常明确的边界条件&#xff1a; 监督学习&#xff1a;我们拥有大量带标签的数据样本(xi,yi)(x_i, y_i)(xi​,yi​)&#xff0c;目标是学习从输…

k8sday12数据存储(1/2)

目录 一、简单基本存储 1、EmptyDir 1.1概念 1.2作用 1.3配置文件 1.4测试 2、HostPath 2.1概念 2.2作用 2.3配置文件 2.4测试 ①、数据共享 ②、持久化存储 3、NFS 3.1概念 3.2作用 3.3NFS服务安装 ①、设置主节点为NFS服务器 ②、给副节点安装NFS客户端工…

Spring Framework 常用注解详解(按所属包分类整理)

在使用 Spring Framework 进行开发时&#xff0c;注解&#xff08;Annotation&#xff09;是实现 依赖注入&#xff08;DI&#xff09;、组件扫描、AOP 切面、事务管理 和 Web 请求映射 的核心手段。Spring 提供了丰富且结构清晰的注解体系&#xff0c;这些注解按照功能被组织在…

ROADS落地的架构蓝图

2 ROADS落地的架构蓝图 将ROADS体验从理念转化为现实&#xff0c;需要一套完整且自顶向下的架构蓝图作为支撑。华为的实践表明&#xff0c;数字化转型的成功依赖于多个架构层次的协同推进&#xff0c;而非单点技术的应用。该蓝图通常包含以下五个关键层次&#xff0c;每一层都承…

如何构建一个神经网络?从零开始搭建你的第一个深度学习模型

在深度学习的海洋中&#xff0c;神经网络就像一艘船&#xff0c;承载着数据的流动与特征的提取。而构建一个神经网络&#xff0c;就像是在设计这艘船的结构。本文将带你一步步了解如何使用 PyTorch 构建一个完整的神经网络模型&#xff0c;涵盖网络层的组织、前向传播与反向传播…

自学嵌入式第二十三天:数据结构(3)-双链表

一、strtokchar * strtok(char *s1,char *s2);截断字符串&#xff0c;在s1字符串中找到s2截取前一段返回&#xff0c;如需要再次截取剩余段&#xff0c;再使用此函数s1输入NULL即可&#xff1b;二、bzerobzero(char *p,size_t size);清零,从p地址开始&#xff0c;清零size个bit…

河南萌新联赛2025第六场 - 郑州大学

暑期集训已经接近尾声&#xff0c;一年六场的暑期萌新联赛也已经结束了&#xff0c;进步是比较明显的&#xff0c;从一开始的七八百名到三四百名&#xff0c;虽然拿不出手&#xff0c;但是这也算对两个月的集训的算法初学者的我一个交代。 比赛传送门&#xff1a;河南萌新联赛…

2-1.Python 编码基础 - 基础运算符(算术运算符、赋值运算符、比较运算符、逻辑运算符)

一、算术运算符 1、基本介绍编号运算符说明示例输出结果1两数相加10 20302-两数相减10 - 20-103*两数相乘&#xff0c;或者返回一个被重复若干次的字符串10 * 202004/两数相除10 / 200.55//两数相除并返回商的整数部分9 // 246%两数相除并返回余数10 % 507**幂运算10 ** 21002…

CMOS知识点 MOS管不同工作区域电容特性

知识点14&#xff1a;MOSFET的电容主要来源于其物理结构&#xff1a;栅氧层电容&#xff1a;栅极&#xff08;G&#xff09;与衬底&#xff08;B&#xff09;、沟道、源&#xff08;S&#xff09;、漏&#xff08;D&#xff09;之间隔着二氧化硅绝缘层&#xff0c;自然形成电容…

预测性维护+智能优化:RK3568+FPGA方案在储能行业的应用

在储能行业&#xff0c;RK3568FPGA方案通过预测性维护和智能优化技术&#xff0c;显著提升系统可靠性和经济性。该方案采用异构架构&#xff08;FPGA处理高速信号采集&#xff0c;RK3568负责策略计算与通信管理&#xff09;&#xff0c;实现微秒级响应和精准控制。‌26一、预测…