08.TMS570LC43入门指南——RTI模块

news/2024/9/20 3:52:03/ 标签: 单片机, mcu

08.TMS570LC43入门指南——RTI模块

文章目录

  • 08.TMS570LC43入门指南——RTI模块
    • 一、简介
    • 二、认识 RTI
      • 2.1 特性
      • 2.2 总体模块介绍
      • 2.3 计数操作介绍
      • 2.4 中断/DMA 请求
    • 三、项目实现
      • 3.1 硬件部分
      • 3.2 软件部分
        • 3.2.1 HALCoGen 配置
        • 3.2.2 CCS 配置
        • 3.2.3 运行结果
    • 五、写在最后

一、简介

在本章中,我们将学习使用 RTI。了解过 STM32 系列芯片的朋友应该都知道,其拥有一个滴答定时器(Systick),而在 TMS570LC43 上,也拥有类似的模块,其就是 —— RTI

通过本文,你将学习到以下内容:

  1. 认识 RTI 模块
  2. 使用 RTI 模块完成定时中断的相关操作

首先需要了解一下我所使用的开发环境:

  • Windows 10 x64
  • TMS570LC43开发板

二、认识 RTI

RTI 全称叫 Real-Time Interrupt Module,即 实时中断模块。其也可以用于为 RTOS 系统提供时基。

2.1 特性

RTI 模块具有以下特点:

  • 拥有两个 64 位计数器
  • 拥有四个可配置的比较器用于生成操作系统的时基或 DMA 请求。每个事件可以由计数器 0 或 计数器 1 驱动
  • 拥有一个可用于应用程序同步到 FlexRay 网络的计数器,其也能实现时钟校验功能
  • 拥有快速使能/去使能事件
  • 拥有两个时间戳(捕获)函数,用于系统或外设中断,每个计数器一个
  • 拥有数字带窗看门狗

2.2 总体模块介绍

如下图所示为 RTI 框架示意图:

在这里插入图片描述

从图中我们可以知道,RTI 模块拥有两个 64 bit 的计数块。其中计数块 0 拥有额外的 FlexRay Macrotick(NTU0)FlexRay Start of Cycle(NTU1) 功能模块。

比较单元将计数器与可编程值进行比较,当匹配时会产生四个独立的中断或 DMA 请求。每个比较寄存器都可以通过编程实现与计数器 0 或计数器 1 进行比较。

2.3 计数操作介绍

如下图所示为计数块框图:

在这里插入图片描述

如图中所示,每个计数器控制块都包含一个向上计数器(RTIUC0 或 RTIUC1) 和一个自由运行计数器 (RTIFRC0 或 RTIFRC1)

RTIUC0/1RTICLK 时钟驱动,一直向上计数,直到到达向上比较计数器寄存器 (RTICPUC0/1) 中的比较值。当比较值匹配的时候后,RTIFRC0/1 递增,RTIUC0/1 重置为 0。如果 RTIFRC0/1 溢出,则向 VIM 生成中断。而自由运行计数器 (RTIFRC0/1) 频率计算公式为:
f R T I F R C x = { f R T I C L K R T I C P U C x + 1 当 R T I C P U C x ≠ 0 f R T I C L K 2 32 + 1 当 R T I C P U x = 0 f_{RTIFRCx} = \left\{\begin{matrix} \frac{f_{RTICLK}}{RTICPUCx + 1} & 当 RTICPUCx \ne 0 \\ \frac{f_{RTICLK}}{2^{32} + 1} & 当 RTICPUx = 0 \end{matrix}\right. fRTIFRCx={RTICPUCx+1fRTICLK232+1fRTICLKRTICPUCx=0RTICPUx=0

注意:不建议将 RTICPUCx 设置为 0,否则将会使得向上计数器在溢出后的两个 RTICLK 时钟周期内数值为 0。


2.4 中断/DMA 请求

该芯片使用四个比较寄存器(RTICOMPy)用于实现对 VIM 的中断请求或对 DMA 控制器的 DMA 请求。可以使用中断为操作系统提供不同时间的时基。每一个比较寄存器都可以配置为与 DTIFRC0RTIFRC1 进行比较。当计数值与设置的比较值相等后将会产生中断。为了允许周期性中断,可以自动添加某个数值到 RTICOMPy 的比较值中。该值存储在更新比较寄存器(RTIUDCPy)中,并将在匹配比较后添加到 RTICOMPy 中。生成的中断/DMA请求的周期可以用下面的公式计算:
t C O M P x = t R T I C L K × ( R T I C P U C y + 1 ) × R T I U D C P y t_{COMPx}=t_{RTICLK} \times \left (RTICPUCy + 1 \right) \times RTIUDCPy tCOMPx=tRTICLK×(RTICPUCy+1)×RTIUDCPy
R T I C P U C y ≠ 0 RTICPUCy \ne 0 RTICPUCy=0 时:
t C O M P x = t R T I C L K × ( 2 32 + 1 ) × R T I U D C P y t_{COMPx}= t_{RTICLK} \times \left(2^{32} + 1 \right) \times RTIUDCPy tCOMPx=tRTICLK×(232+1)×RTIUDCPy
R T I C P U C y = 0 RTICPUCy = 0 RTICPUCy=0 时:
t C O M P x = t R T I C L K × ( R T I C P U C y + 1 ) × 2 32 t_{COMPx} = t_{RTICLK} \times \left (RTICPUCy + 1 \right) \times 2^{32} tCOMPx=tRTICLK×(RTICPUCy+1)×232

下图展示了一个比较单元的框图。类似的结构在 RTI 中拥有四个。

在这里插入图片描述

RTIFRCx 寄存器溢出的情况下,可以生成溢出中断(OVLINTx)

另外,中断/DMA请求可以在 RTISETINTENA 寄存器中启用,在 RTICLEARINTENA 寄存器中禁用。挂起的中断将在RTIINTFLAG 寄存器中显示。


三、项目实现

通过前面的介绍,想必大家对 RTI 有了一定的了解,那么接下来,将带领大家使用 RTI。希望这篇文章提供的方法教程能给各位大佬一点帮助。

首先需要明确的是,在本文中,项目将使用 RTI 产生 500ms 的定时中断,用于控制 LED2 的闪烁

其实 RTI 很像 STM32 中的滴答定时器(Tick Time),其都能够使用硬件产生固定时间间隔的信号,因此也常用于操作系统(RTOS)中。

3.1 硬件部分

在本文中,有关硬件只使用到了 LED2,其原理图如下所示:

在这里插入图片描述

因此,我们等会初始软件的时候,同时也需要初始化 GIOB_6

其在开发板上的位置如下图中黄色方框所示:

在这里插入图片描述

3.2 软件部分

3.2.1 HALCoGen 配置

有了硬件部分的了解,我们只需要初始化 GIOB_6 以及 RTI 即可,那么具体实现方式如下所示:

  1. TMS570LC4357ZWT -> Driver Enable 中使能 GIORTI 驱动

    在这里插入图片描述

  2. GIO -> Port B 中对 Bit 6 进行以下设置:

    在这里插入图片描述

  3. 因为我们要产生一个 500ms 的中断,因此在 RTI -> RTI1 Compare 中进行如下设置:

在这里插入图片描述

  1. TMS570LC4357ZWT -> VIM Channel 0-31 中使能 RTI Compare 0 中断,如下所示:

    在这里插入图片描述

  2. 配置完上述功能后,即可生成程序。依旧使用快捷键 F5 或依次点击 File -> Generate Code

3.2.2 CCS 配置

生成文件后,依旧在 CCS 中进行编写逻辑代码操作。还是先找到我们的 HL_sys_main.c 文件。这里我给出我写的示例代码:

/* USER CODE BEGIN (0) */
/* USER CODE END *//* Include Files */#include "HL_sys_common.h"/* USER CODE BEGIN (1) */
#include "HL_system.h"
#include "HL_gio.h"
#include "HL_rti.h"
/* USER CODE END *//** @fn void main(void)
*   @brief Application main function
*   @note This function is empty by default.
*
*   This function is called after startup.
*   The user can use this function to implement the application.
*//* USER CODE BEGIN (2) */
#define LED2_BIT            6U
/* USER CODE END */int main(void)
{
/* USER CODE BEGIN (3) *//* 使能总中断 */_enable_IRQ_interrupt_();gioInit();                                                  // GPIO 初始化rtiInit();                                                  // RTI 初始化rtiEnableNotification(rtiREG1, rtiNOTIFICATION_COMPARE0);   // 使能通知函数gioSetBit(gioPORTB, LED2_BIT, 0);                           // 关闭 LED2rtiStartCounter(rtiREG1, rtiCOUNTER_BLOCK0);                // rti Block0 开始计数for (;;) {/* 循环,确保程序一直在运行 */}
/* USER CODE END */return 0;
}/* USER CODE BEGIN (4) *//** @brief       : RTI通知函数* @param       : [rtiREG]: rti端口寄存器*                [notification]: 中断类型* @return      : void* @author      : Liu Jiahao* @date        : 2024-08-20* @version     : v1.0* @copyright   : Copyright By Liu Jiahao, All Rights Reserved*/
void rtiNotification(rtiBASE_t *rtiREG, uint32 notification)
{if (rtiREG == rtiREG1) {switch (notification){case rtiNOTIFICATION_COMPARE0:gioToggleBit(gioPORTB, LED2_BIT);               // 切换 LEDbreak;case rtiNOTIFICATION_COMPARE1:/* user code */break;case rtiNOTIFICATION_COMPARE2:/* user code */break;case rtiNOTIFICATION_COMPARE3:/* user code */break;case rtiNOTIFICATION_COUNTER0:/* user code */break;case rtiNOTIFICATION_COUNTER1:/* user code */break;case rtiNOTIFICATION_TIMEBASE:/* user code */break;default:    break;}}
}
/* USER CODE END */

值得注意的是,需要使能 IRQ 中断 RTI 才能正常运行,即使用 _enable_IRQ_interrupt_() 使能中断。

另外,我在 rtiNotification 函数中罗列了所有 RTI 中断通知类型,当然,在此之前也需要我们使用 rtiEnableNotification 函数使能相应的中断类型。这些类型在 HL_rti.h 中均有说明。

3.2.3 运行结果

如下图所示为运行结果示意图:

在这里插入图片描述

如图所示,LED2 间隔闪烁,证明 RTI 间隔进行中断。

五、写在最后

本文介绍了 TMS570LC43上的 RTI 模块以及其使用方法。希望能够对大家的学习提供一点帮助。

在后续的文章中,将继续对 TMS570LC43x 进行详细的入门指导,欢迎读者关注!!!

目前暂时没有考虑整合的打算,所以各位读者如果需要看别的教程,可以点进 专栏 进行查找。在后续的更新中,将会逐步加入各个文章的链接,以便大家快速翻阅。另外源码会逐步开源。

欢迎广大读者提出问题以及修改意见,本人看到后会给予回应,欢迎留言,后续会逐步进行开源!!!
另外,由于文章是作者手打的文字,有些地方可能文字会出错,望谅解,也可私信联系我,我对其进行更改。

  • 个人CSDN账号:刘梓谦_-CSDN博客

  • Gitee:刘佳豪 (liu-jiahaohappy) - Gitee.com

  • GitHub:Jiahao-Liu29 (github.com)


http://www.ppmy.cn/news/1514366.html

相关文章

老品新生机,新品快速上位:测评在维护亚马逊产品排名中的作用

亚马逊平台高度重视用户体验,用户评论在平台算法中占据重要权重,直接影响产品的排名和销量。因此,产品测评对于亚马逊卖家来说至关重要,不仅有助于新品上架时提升排名和转化率,还能维护老产品的Listing排名。为了安全有…

【C++二分查找 贪心】2576. 求出最多标记下标

本文涉及的基础知识点 C二分查找 贪心:决策包容性 LeetCode2576. 求出最多标记下标 给你一个下标从 0 开始的整数数组 nums 。 一开始,所有下标都没有被标记。你可以执行以下操作任意次: 选择两个 互不相同且未标记 的下标 i 和 j &#x…

2025计算机毕设50条小众好做的Java题目【计算机毕设选题推荐】

随着2025年的到来,计算机专业的学生们又迎来了毕业设计的关键时刻。对于大多数学生来说,选择一个合适的毕业设计题目往往是一项艰巨的任务。本文旨在为那些正在为毕业设计题目烦恼的同学们提供一些灵感和建议,特别是针对使用Java技术栈的同学…

centos 部署 scrapy 爬虫详细教程

部署流程 参考环境安装 pyenv安装依赖安装 pyenv配置环境变量root 用户~/.bashrc~/.profile~/.bash_profileZsh 用户重启 shell 使用 pyenv 安装 Python 3.9.1安装Scrapyd-Client安装Scrapysystemd添加服务文件 参考 【华为仓库】 【pyenv 多版本的Python管理工具】 【pyenv-v…

.NET系列 定时器

net一共4种定时器 System.Windows.Forms.Timer 类型 》》WinForm专用System.Windows.Threading.DispatcherTime类型》》WPF专用System.Threading.Timer类型》》》它使用 ThreadPool 线程来执行定时操作System.Timers.Timer类型 》》这种很老了。 它使用基于底层计时…

每天一个数据分析题(四百九十七)- 序列模式挖掘

序列模式挖掘 (sequence pattern mining )是指挖掘相对时间或其他模式出现频率高的模式,典型的应用还是限于离散型的序列。下列哪个选项不属于序列模式的时限约束? A. 最大跨度约束 B. 主键约束 C. 最小间隔和最大间隔约束 D. 窗口大小约…

vue3 img标签动态加载图片

<img :src"getImgUrl(item.name)" alt"">//组合式下 methods里方法 getImgUrl(name){let url new URL(../../../assets/images/bigscreen/${name}.png, import.meta.url).hrefreturn url},

【微信小程序】自定义组件 - 数据、方法和属性

1. data 数据 2. methods 方法 在小程序组件中&#xff0c;事件处理函数和自定义方法需要定义到 methods 节点中&#xff0c;示例代码如下&#xff1a; 3. properties 属性 在小程序组件中&#xff0c;properties 是组件的对外属性&#xff0c;用来接收外界传递到组件中的数…

IDEA工具设置默认使用maven的settings.xml文件

第一步&#xff1a;打开idea工具&#xff0c;选中 File ——> New Projects Setup ——> Settings for New Projects 第二步&#xff1a;先设置下自动构建项目这个选项 第三步&#xff1a;选中 Build Tools ——> Maven&#xff0c;让后就可以设置自己安转的maven和se…

Modbus初学者教程,第六章:Modbus 答疑

第六章&#xff1a;Modbus 答疑 平时调试Modbus设备&#xff0c;或者学习Modbus协议&#xff0c;推荐一款Modbus主从站模拟器&#xff1a; 主站下载地址&#xff1a;Modbus从站模拟器 从站下载地址&#xff1a;Modbus主站模拟器 我从哪里开始与我的 Modbus 设备通信&#xff1f…

无人机:航拍书籍推荐

写在前面 学习航拍&#xff0c;整理一些书籍分享理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好好做事&#xff0c;所以唯一的解决办法就是行动起来&#xff0c;认真做完事情&#xff0c;战胜焦虑&#xff0c;战胜那些心里空荡荡的时刻&…

克服编程挫折:从Bug的迷宫中寻找出口与面对算法保持冷静的策略

在编程学习的道路上&#xff0c;挫折感无疑是每个学习者都必须面对的挑战之一。它们仿佛是一座座高墙&#xff0c;阻挡我们前进的步伐。然而&#xff0c;正如许多有经验的编程高手所证明的那样&#xff0c;挫折并不是终点&#xff0c;而是成长和进步的催化剂。本文将分享一些有…

【实战场景】如何优雅实现分页

【实战场景】如何优雅实现分页 开篇词&#xff1a;干货篇&#xff1a;1.添加PageHelper依赖2.添加PageHelper配置3.使用 PageHelper4.自定义Pageable注解 总结&#xff1a;1.执行查询2.处理分页结果3.注意事项 我是杰叔叔&#xff0c;一名沪漂的码农&#xff0c;下期再会&#…

数据仓库ETL开发

在企业数字化转型的过程中&#xff0c;数据仓库已经成为了企业管理和决策的重要工具。数据仓库ETL开发是构建数据仓库的关键步骤之一&#xff0c;它可以帮助企业从源系统中抽取、清洗、转换和整合数据&#xff0c;方便企业进行管理和分析。本文将介绍如何高效实现数据仓库ETL开…

Notepad--文本编辑工具 for Mac教程【苹果电脑-简单轻松上手-免费Mac软件推荐】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其拖入应用程序中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试解决“软件已损坏&#xff0c;无法打开”问题&#xff0c;若没有该问题&#xff0c;可…

Vue3 指令 6

Vue3 指令&#xff08;Directive&#xff09;是 Vue3 中的一种特殊的语法&#xff0c;用于在模板中添加自定义的行为。指令可以用来修改 DOM、监听事件、绑定数据等。下面是 Vue3 指令的主要类型&#xff1a; 1. v-binding v-binding 指令用于绑定数据到 HTML 属性上。例如&a…

深入理解SQL中的INNER JOIN操作

本文介绍了INNER JOIN的定义、使用场景、计算方法及与其他JOIN的比较。INNER JOIN是关系数据库中常用的操作&#xff0c;用于返回两个表中匹配的行&#xff0c;只有在连接条件满足时才返回数据。本文详细解释了INNER JOIN的语法及其在一对多、多对多关系中的应用&#xff0c;通…

【论文阅读】Enhance Model Stealing Attack via Label Refining(2022)

摘要 With machine learning models(机器学习模型) being increasingly(越来越多) deployed(部署), model stealing attacks(模型窃取攻击) have raised an increasing interest. Extracting decision-based models(基于决策的模型窃取) is a more challenging task…

【工具类】Java优雅的将XML转为JSON格式、XML转JSON

Java优雅的将XML转为JSON格式、XML转JSON 1. 导入依赖1.1 Maven使用1.2 Gradle使用 2. 代码编写3.运行示例 1. 导入依赖 1.1 Maven使用 <dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</vers…

《计算机操作系统》(第4版)第4章 存储器管理 复习笔记

第4章 存储器管理 一、存储器的层次结构 1. 多层结构的存储器系统 如图4-1所示&#xff0c;在存储层次中越往上&#xff0c;存储介质的访问速度越快&#xff0c;价格也越高&#xff0c;相对存储容量也越小。 图4-1 计算机系统存储层次示意 2.三级存储系统 (1)Cache- 主存存储体…