06.TMS570LC43入门指南——中断操作

news2024/9/24 11:22:16

06.TMS570LC43入门指南——中断操作

文章目录

  • 06.TMS570LC43入门指南——中断操作
    • 一、简介
    • 二、中断(VIM)介绍
      • 2.1 VIM架构
      • 2.2 CPU 中断处理
      • 2.3 VIM中断通道映射
      • 2.4 中断请求默认分配
    • 三、项目实现
      • 3.1 硬件部分
      • 3.2 软件部分
        • 3.2.1 HALCoGen 配置
        • 3.2.2 CCS 配置
        • 3.2.3 运行结果
    • 四、一些小问题
      • 4.1 中断服务函数生成相关
      • 4.2 中断映射相关的问题
    • 五、写在最后

一、简介

在之前的文章中,想必我们对中断有了初步的了解。那么在本文章中我们将对 TMS570LC43 的中断进行详细认知。

通过这篇文章,你将学到以下内容:

  1. 中断的认识
  2. 如何使用中断

使用平台:

  • Windows x64
  • TMS570LC43开发板

二、中断(VIM)介绍

通过上一篇文章的认知,我们知道:TMS570LC43 具有两个中断管理模块(VIM),但两个 VIM 模块被内存映射到相同的地址空间,因此,从编程的角度上来看,其实际上只有一个 VIM 模块存在。而我们对 VIM 的操作只对 VIM1 起作用,而 VIM2 不会被影响。其这样设计,官方称之为 Dual VIM for safety(双VIM安全架构)。

2.1 VIM架构

首先,我们需要了解的是 VIM 框架,正如我上述提到的,其具有两个 VIM 模块,那么是如何做到这一点的呢?接下来就是它的框图:

在这里插入图片描述

前面说到,VIM1VIM2 具有相同的地址空间,而在同一时间访问同一块地址空间是不被允许的。因此,其为VIM2 提供了两个时钟周期的延时操作(2 cyc delay),使得其不会在同一时间访问同一块地址空间。

这里需要注意的是,VIM2 用户是无法进行访问的,我们之所以说“不会在同一时间访问同一块地址空间”,是为了便于我们理解。VIM2 的访问是由 CPU 完成的!!!

当发生中断请求(Interrupt Requests)的时候,其会立即给 VIM1,而延迟两个时钟周期后给 VIM2

VIM1 对中断请求的处理输出会延迟两个时钟周期和 VIM2 一起进入 CCM-R5F 模块进行不断对比,如果发生错误将错误信息传递到 ESM 模块进行错误处理。

如果没有错误则将中断信号传递给 CPU 进行进一步处理。

这里有以下几个问题需要注意

  1. 在上图所示中,Cortex-R5 Processor Group 中包含着两个 R5F 核,这是因为该芯片出于安全架构考虑,在核心上也采用了双核对比的形式。

    • 在技术手册的498页 13.1.2 Block Diagram 小节中写到以下内容:

    Figure 13-1 shows the interconnect diagram of the CCM-R5F with the two Cortex-R5F CPUs and the two VIMs. The core bus outputs of the CPUs are compared in the CCM-R5F. To avoid common mode impacts, the signals of the CPUs to be compared are temporally diverse. The output signals of the master CPU are delayed 2 cycles while the input signals of checker CPU are delayed 2 cycles. The two cycle delay strategy is also deployed between the two VIM modules.

    [简单翻译]:CCM-R5F与2个Cortex-R5F cpu和2个VIM的互连图如图13-1所示。在CCM-R5F中比较了cpu的核心总线输出。为了避免共模影响,需要比较的cpu的信号在时间上是不同的。主CPU的输出信号延时2个周期,检查CPU的输入信号延时2个周期。在两个VIM模块之间也部署了两周期延迟策略。

    这里我放出图13-1供大家参考:

    在这里插入图片描述

    图片及原文来源:ti.com/lit/ug/spnu563a/spnu563a.pdf

    那么大家可以了解到,其 CPU 也进行了类似于 VIM 的架构形式,这一切据官方所说都是为了安全考虑。

  2. 另一个问题就是 PCR 是什么,这里在技术手册中也能找到相应的答案,这里我也贴出对应原文:

    The PCR manages the accesses to the peripheral registers and peripheral memories. It provides a global reset for all the peripherals. It also supports the capability to selectively enable or disable the clock for each peripheral individually. The PCR also manages the accesses to the system module registers required to configure the device’s clocks, interrupts, and so on. The system module registers also include status flags for indicating exception conditions – resets, aborts, errors, interrupts. This device has three PCR modules with each capable to access different peripherals as shown in the block diagram. The three PCRs are slaves to the Peripheral Interconnect Subsystem.

    [简单翻译]:PCR管理对外围寄存器和外围存储器的访问。它为所有外设提供全局重置。它还支持选择性地为每个外设单独启用或禁用时钟的功能。PCR还管理对配置设备时钟、中断等所需的系统模块寄存器的访问。系统模块寄存器还包括状态标志,用于指示异常条件——重置、中止、错误、中断。该设备有三个PCR模块,每个模块都能够访问不同的外设。

    同样的,这里也贴出其结构框图,如下所示:

    在这里插入图片描述

    图片及原文来源:ti.com/lit/ug/spnu563a/spnu563a.pdf

    由此我们可以知道,PCR 对外设进行了统一的管理。

2.2 CPU 中断处理

解决了以上两个问题,言归正传,该 CPU 为中断请求提供了两个向量——快速中断请求(FIQ)和正常中断请求(IRQ)。FIQ 的优先级高于 IRQ, FIQ 中断可能会中断 IRQ 中断。那么如下所示是 VIM 内部中断处理框图:

在这里插入图片描述

当中断请求到来以后,首先需要根据通道映射表找到对应的中断通道,然后判断该中断是否使能,如果该中断已经被使能则判断中断类型,即是 FIQ 中断还是 IRQ 中断,判断完成后进入对应的优先级编码器(我这里是这样理解,大家可以理解为一个优先级控制器),获取到对应的 INDEX 寄存器,然后使用它的向量值访问中断向量表以获取对应的 ISR 地址。

通俗来讲,如果一个中断请求是 FIQ 类中断,经过上述一系列步骤后,在中断向量表中得到其对应的 ISR 地址,该地址将被写入 FIQVECREG 寄存器,后续 CPU 将会通过该寄存器对 ISR 函数进行跳转。而如果是 IRQ 类中断,则地址将会被写入 IRQVECREG 寄存器中,同时写入 CPUVIC 端口上。

2.3 VIM中断通道映射

接下来我们将介绍 VIM 的中断通道映射。

VIM 支持 128个中断通道(包括虚中断)。从外设模块到中断通道的 VIM 中断请求安排的框图如下图所示。每个中断通道(CHANx)都有一个对应的映射寄存器位域(CHANMAPx[6:0])。这个映射寄存器决定它映射每个 VIM 中断请求的中断通道。使用此方案,可以将相同的请求映射到多个通道。每个 FIQIRQ 中编号较低的通道具有较高的优先级,VIM 的可编程性允许软件对其进行控制。

在这里插入图片描述

如图所示,CHANMAPx[6:0] 寄存器位域是 CHANCTRL 寄存器的一部分,对于该寄存器,后续文中会进行解释。

根据上图我们需要知道以下两点:

  1. 128个中断通道 中,CHAN0CHAN1 是硬件连接的, 不支持重新映射
  2. CHAN127 没有专用的中断向量表项。因此,CHAN127不支持重新映射

那么接下来将对 CHANCTRL 寄存器进行解释,如下图所示是其寄存器的相关描述:

在这里插入图片描述

其拥有32个中断控制寄存器(CHANCTRL)控制着 VIM 的 128 个中断通道。每个寄存器控制着四个中断通道,每个通道的索引是从 0 到 127。表 19-23 展示了所有寄存器的构成部分和每个寄存器的复位值。

这里我们只需简单进行了解即可,结合图片大家就可以明白 CHANMAPx[6:0] 寄存器位域是怎么来的了。

2.4 中断请求默认分配

通过上述对 VIM 的相关叙述,相必大家对中断有了一定的了解。

在该开发板上,对 VIM 有默认的中断请求分配,我这里截取一部分用作示例:

在这里插入图片描述

完整表格信息见官方数据手册 P118 6.15.3 Interrupt Request Assignments

网页链接: ti.com/lit/ds/spns195c/spns195c.pdf

如图所示,例如我们需要使用 GIO 中断,可以看到表中有两个 GIO 中断相关的通道,一个是通道 9 的 GIO high level interrupt 中断,另一个是通道 23 的 GIO low level Interrupt 中断。相必从字面意思大家都能猜出来一个是 GIO 高优先级中断,另一个是 GIO低优先级中断

在此表格中,中断通道越靠前,优先级越高。当然了,有很多中断是我们一般用不到的,具体内容大家可自行阅读数据手册。


三、项目实现

相信在上一篇文章中,大家对 VIM 有了一定的认识(这里就不再附链接了,感兴趣的朋友可以点进 专栏 进行查看),这篇文章将带领大家熟练使用其他中断。

首先,还是需要大家自行建立工程文件,这里不再赘述。

在本项目中,我们将 使用开发板上的两个按键进行中断实验。主要实验内容是,两个按键分别控制着 LED 闪烁速度的加快和减慢,通过这样的方式,使得我们能够更方便观察实验结果。

这里说句题外话,有些类似于 STM32 的外部中断,但又有不同点。在 STM32 中可以对每一组 GPIOx 进行不同中断通道的映射。但在该芯片中,GPIOAGPIOB 不再进行分组映射,其交给统一的 GIO 中断进行分配。

这里不用过多纠结,在后文中会提到相关这方面的问题。

3.1 硬件部分

在本章中,将会用到两个按键进行中断实验,其原理图如下所示:

在这里插入图片描述

如上图所示为两个按键的硬件电路图,可以对其进行简单分析,当按键没有按下的时候,单片机 IO 口将会检测到高电平信号,当按键被按下以后,IO 口将会变为低。后续我们会根据这样的特性进行相关设置。

此外为了能够明显观察到中断产生的影响,这里将使用一个 LED 闪烁对按键按下进行反馈。其中,将会使用到 LED2,其原理图如下所示:

在这里插入图片描述

那么这两个按键以及 LED2 在开发板上的示意图如下所示:

在这里插入图片描述

如图中绿色框所示为使用到的两个按键,橙色框所示为使用到的 LED2

综上所述,我们需要使用到的 IO 口有 GIOB_4、GIOB_5、GIOB_6,后续我们将会依次对其进行配置。

3.2 软件部分

3.2.1 HALCoGen 配置

在硬件部分中,明确了我们所需的管脚,接下来将会对其进行一系列的相关配置。

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

    在这里插入图片描述

  2. GIO->Port B 中对 Bit 4Bit 5 分别进行以下设置:

    在这里插入图片描述

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

    在这里插入图片描述

  4. 再回到 TMS570LC4357ZWT -> VIM Channel 0-31 中使能 GIO HighGIO Low,如下所示:

    在这里插入图片描述

    在这里插入图片描述

  5. 配置完上述功能后,即可生成程序。依旧使用快捷键 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_gio.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 CNT_MAX     10000000    // 计数值最大值
#define CNT_MIN     1000000     // 计数值最小值

#define LED2_PORT   gioPORTB    // LED2 GIO接口
#define LED2_BIT    6U          // LED2 bit

uint32_t CNT = 5000000;         // 计数值,通过更改此数值更改闪烁频率
/* USER CODE END */

int main(void)
{
/* USER CODE BEGIN (3) */
    int  i;

    _enable_interrupt_();       // 使能中断

    gioInit();                  // GPIO 初始化

    while (1) {
        for (i = 0; i < CNT; i++);
        gioToggleBit(LED2_PORT, LED2_BIT);
    }
/* USER CODE END */

    return 0;
}


/* USER CODE BEGIN (4) */
/*
 * @brief       : GIO通知函数
 * @param       : [port]: gio端口寄存器
 *                [bit]:  gio bit位
 * @return      : void
 * @author      : Liu Jiahao
 * @date        : 2024-07-09
 * @version     : v1.1
 * @copyright   : Copyright By Liu Jiahao, All Rights Reserved
 */
void gioNotification(gioPORT_t *port, uint32 bit)
{
    if (port == gioPORTB) {
        switch (bit) {
        // S3
        case 4U:
            CNT = ((CNT + 1000000) >= CNT_MAX)  ? CNT_MAX : CNT + 1000000;
            break;
        // S4
        case 5U:
            CNT = ((CNT - 1000000) <= CNT_MIN)  ? CNT_MIN : CNT - 1000000;
            break;
        default:    break;
        }
    }
}
/* USER CODE END */

在上述代码中,其中 gioNotification 函数不是我们自己命名的,是在 HL_notification.c 文件中,有如下代码:

/* USER CODE BEGIN (11) */
/* USER CODE END */
#pragma WEAK(gioNotification)
void gioNotification(gioPORT_t *port, uint32 bit)
{
/*  enter user code between the USER CODE BEGIN and USER CODE END. */
/* USER CODE BEGIN (22) */
/* USER CODE END */
}

这里我是将其复制过去重新进行编写,推荐使用这种方式

而这个通知函数是经由 gioHighLevelInterruptgioLowLevelInterrupt 调用的,这两个函数位于 HL_gio.c 文件中,在下一小节将详细阐述这两个函数是怎么来的,这里只做简单介绍。

3.2.3 运行结果

烧录下载后,当我们按下 S3 按键后,可以观察到 LED2 闪烁变慢,当我们按下 S4 按键后,LED2 闪烁将变快。由于我们在代码中对其快慢设置了阈值,一旦达到这个阈值,就无法再次加快或减慢。


四、一些小问题

4.1 中断服务函数生成相关

HALCoGen 软件中的 TMS570LC4357ZWT -> VIM RAM 中存在着中断服务函数的相关内容:

在这里插入图片描述

这个中断服务函数我们可以自己进行更改,在我们生成代码后,会自动帮我们写好中断服务函数,我们需要做的是在 通知函数 中进行逻辑代码的书写。

而在 CCS 代码中的 HL_sys_vim.c 中有以下内容:

在这里插入图片描述

可以看到所有的 ISR (即中断服务函数) 函数都会在这里进行注册,但前提是需要我们先使能中断

4.2 中断映射相关的问题

想必对 STM32 中断熟悉的朋友,都知道其每个中断线上对应了最多 9 个 IO 口(以 STM32F1 为例),如下所示:

在这里插入图片描述

而我们现在使用的芯片处理逻辑与 STM32 并不相同,其是针对相应外设单独设立的中断线。

而对于中断优先级的设置,文档中提到可以通过 CHANMAPx 进行配置。


五、写在最后

本文介绍了 如何在TMS570LC43上使用中断以及一些问题的阐述。希望能够对大家的学习提供一点帮助。

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

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

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

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

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

  • GitHub:Jiahao-Liu29 (github.com)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产麒麟、uos在线编辑word文件并控制编辑区域(局部编辑)

windows系统也适用&#xff0c;该插件可同时支持windows和国产系统 在实际项目开发中&#xff0c;以下场景可能会用到Word局部编辑功能&#xff1a; 合同审批公文流转策划设计报告汇签单招投标&#xff08;标书文件&#xff09;其他&#xff0c;有模板且需要不同人员协作编辑…

Ubuntu22.04安装NIVIDIA显卡驱动总结

1.首先在安装驱动时需要判断系统有无GPU以及GPU的型号 可以参考这篇文章&#xff1a; https://blog.51cto.com/u_13171517/8814753#:~:textubuntu%20%E7%B3%BB%E7%BB%9F%20%E6%80%8E%E4%B9%88%E5%88%A4%E6%96%AD%E7%B3%BB%E7%BB%9F%E6%9C%89%E6%B2%A1%E6%9C%89GPU%201%20%E6%…

2024骨传导耳机哪款值得买?健身人士说这五款骨传导耳机好~

在追求健康生活与高品质音频体验的今天&#xff0c;骨传导蓝牙耳机以其独特的魅力&#xff0c;引领了一场听觉革命。它巧妙利用骨骼传递声音&#xff0c;既保护了脆弱的耳膜&#xff0c;又带来了前所未有的佩戴自由。然而&#xff0c;在众多选择面前&#xff0c;如何慧眼识珠&a…

Python 使用proto 发送socket数据

import socket import binascii import struct from SensingMonitoring_pb2 import Command, CommandNamesif __name__ "__main__":client socket.socket(socket.AF_INET, socket.SOCK_STREAM)client.connect(("192.168.1.100", 22295))# 发送数据comman…

超实用调试技巧!还有用例讲解哦

文章目录 什么是bug&#xff1f;调试是什么&#xff1f;重要吗&#xff1f;2.1 调试是什么2.2 调试的基本步骤2.3 Debug和Release的介绍 3.Windows环境调试介绍3.1 调试环境的准备3.2 vs2022的快捷键3.3 调试时查看程序当前信息3.3.1 查看临时变量的值3.3.2 查看内存信息3.3.3 …

智能物联网鱼缸

硬件部分及接线图 工具 继电器、开发板、物联网os、云平台 微信小程序 结构&#xff1a;images、pages两个为主体。 标题头部分 <view class"container"> <view class"head_box"> <image src"/images/面性鱼缸.png"><…

公司裁员,为什么总是从技术人员开始?

今天聊一个让技术人员心塞的话题——公司裁员。不知道大家有没有发现&#xff0c;一到裁员的时候&#xff0c;技术人员往往就像那先被推出去的“小羊羔”。这到底是为啥呢&#xff1f;其实&#xff0c;很多时候是因为领导们的一些错误认识造成的职场乱象。 先来说说一些领导们的…

C++ 实现图书馆资料管理系统

1、问题描述 &#xff1a; 图书馆中的资料很多&#xff0c;如果能分类对其资料流通进行管理&#xff0c;将会带来很多方 便&#xff0c;因此需要有一个媒体库管理系统。 图书馆共有三大类物品资料&#xff1a;图书、视频光盘、图画。 这三类物品共同具有的属性有&#xff1a;编…

BFS:多源BFS问题

一、多源BFS简介 超级源点&#xff1a;其实就是把相应的原点一次性都丢到队列中 二、01矩阵 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:const int dx[4]{1,-1,0,0};const int dy[4]{0,0,1,-1};vector<vector<int>> updateMatrix(vector…

2024最新国际版抖音TikTok安装教程,免root免拔卡安卓+iOS,附全套安装工具!

我是阿星&#xff0c;今天给大家带来是2024年最新TikTok国际版抖音的下载和安装教程&#xff0c;而且还是免root免拔卡的那种&#xff0c;安卓和iOS都能用哦&#xff01;由于某些原因&#xff0c;国内用户并不能使用TikTok。今天阿星就教一下大家怎么安装TikTok。 TikTok在全球…

自动驾驶AVM环视算法--540度全景的算法实现和exe测试demo

参考&#xff1a;金书世界 540度全景影像是什么 540度全景影像是在360度全景影像基础上的升级功能&#xff0c;它增加了更多的摄像头来收集周围的图像数据。通常&#xff0c;这些摄像头分布在车辆的更多位置&#xff0c;例如车顶、车底等&#xff0c;以便更全面地捕捉车辆周围…

【C++题解】1156 - 排除异形基因

问题&#xff1a;1156 - 排除异形基因 类型&#xff1a;数组基础 题目描述&#xff1a; 神舟号飞船在完成宇宙探险任务回到地球后&#xff0c;宇航员张三感觉身体不太舒服&#xff0c;去了医院检查&#xff0c;医生诊断结果&#xff1a;张三体内基因已被改变&#xff0c;原有…

微信小程序---npm 支持

一、构建 npm 目前小程序已经支持使用 npm 安装第三方包&#xff0c;但是这些 npm 包在小程序中不能够直接使用&#xff0c;必须得使用小程序开发者工具进行构建后才可以使用。 为什么得使用小程序开发者工具需要构建呢❓ 因为 node_modules 目录下的包&#xff0c;不会参与…

【建议收藏】一万字图文并茂,终于有人把GPT的玩法整理全了

1. 学生常用 1.1 辅导作业、写作业 打数学建模和写期末作业~ Openai GPT-4o 模型从 2024 年 5 月发布以来&#xff0c;作为各项性能评测综合第一的 GPT。 对于法律类&#xff0c;语言类的作业&#xff0c;随意秒杀了&#xff01;&#xff01; 所以我决定让他做一道高等数学…

【开源项目的机遇与挑战】探索、贡献与应对

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一&#xff1a;开源项目的发展趋势 &#x1f343;开源项目的蓬勃发展现状 &#x1f343;开…

GitHub访问慢的问题彻底解决(一)

1、访问巨慢&#xff0c;图片打不开 按照下面这个项目来解决 https://github.com/521xueweihan/GitHub520 【前提】能够访问github 本项目无需安装任何程序&#xff0c;通过修改本地 hosts 文件&#xff0c;试图解决&#xff1a; GitHub 访问速度慢的问题GitHub 项目中的图…

【STM32标准库】读写内部FLASH

1.内部FLASH的构成 STM32F407的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域。 一般我们说STM32内部FLASH的时候&#xff0c;都是指这个主存储器区域&#xff0c;它是存储用户应用程序的空间。STM32F407ZGT6型号芯片&#xff0c; 它的主存储区域大小为1MB。其…

JavaSE 面向对象程序设计进阶 IO 综合练习 利用糊涂包生成假数据 随机点名器 登录案例

目录 生成假数据 利用糊涂包生成假数据 随机点名器 综合练习 生成假数据 制造假数据 制造假数据也是开发中的一个能力 在各个网上爬取数据 这是其中一个方法 爬取网站中的内容 import cn.hutool.core.io.FileUtil;import java.io.IOException; import java.io.InputSt…

银行函证业务的数字化转型:合合信息智能文档处理平台如何实现集中化处理与全流程合规?

“银行函证”是注册会计师在获取被审计单位授权后&#xff0c;直接向银行业金融机构发出询证函&#xff0c;银行业金融机构针对所收到的询证函&#xff0c;查询、核对相关信息并直接提供书面回函的过程。 财政部、银保监会联合发布《关于加快推进银行函证规范化、集约化、数字…

教程系列2 | 趋动云『社区项目』一步实现与 AI 对话

上周&#xff0c;我们沉浸于文生图【教程系列1 | 趋动云『社区项目』极速部署 SD WebUI】的奇幻世界&#xff0c;领略了文字转化为视觉的无限乐趣。本周我们继续与 AI 进行对话&#xff0c;探索智能交互的无限魅力&#xff01; Llama3-8B-Chinese-Chat Llama3-8B-Chinese-Cha…