【瑞萨RA_FSP】外部中断

news2024/12/23 23:44:32

文章目录

  • 一、外部引脚中断
  • 二、中断过程
  • 三、按键外部中断


一、外部引脚中断

1. ICU框图

在这里插入图片描述
根据ICU的功能框图可以知道,首先需要配置IRQCR寄存器(IRQ Control Register,IRQ英文全称:Interrupt ReQuest,中文名:中断请求)。之后配置IELSR寄存器(英文全称:ICU Event Link Setting Register,中文名:中断控制单元事件链接设置寄存器)。之后使能IR寄存器,最后配置NVIC。

2. 相应寄存器介绍
① IRQCR介绍
Interrupt Request Control Register(IRQCR) — 中断请求控制寄存器,这个寄存器拥有0-15个通道,有三个标志位: (1) IRQMD[1:0]检测感知选择 (2) FCLKSEL[1:0]数字滤波采样时钟选择 (3) FLTEN数字滤波器使能

IRQ控制寄存器:
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

二、中断过程

当中断来临的时候会最先经过IRQ寄存器,IRQ寄存器检测到中断的时候,会向中央处理嵌套向量中断控制器NVIC发送中断信号, 当NVIC检测到中断请求的时候,会将相应的中断服务函数进行挂起。之后将运行的八个寄存器进行压栈,压栈完成之后将中断服务程序进行激活。 之后将原先压栈的寄存器取出,继续运行之前的程序。

中断抢占的过程:
当中断来临的时候会最先经过IRQ寄存器,IRQ寄存器检测到中断的时候,会向中央处理嵌套向量中断控制器NVIC发送中断信号, 当NVIC检测到中断请求的时候,会将相应的中断服务函数进行挂起。之后将运行的八个寄存器进行压栈,堆栈完成之后将中断服务程序进行激活。 此时当另一个优先级更高的中断源发生请求的时候,会将相应的中断服务函数进行挂起。之后将当前运行的八个寄存器进行压栈,压栈完成之后将中断服务程序进行激活。 当中断服务程序运行完之后会将原先压栈的寄存器取出,之后继续运行之前中断服务的程序。中断服务程序运行完成之后之后将原先压栈的寄存器取出,继续运行之前的程序。

三、按键外部中断

中断在嵌入式应用中的地位不言而喻,几乎每个控制器都有中断功能。中断对事件得到第一时间处理是非常重要的。 我们设计使用按键来作为触发源,使得控制器产生中断,并在中断服务函数中实现控制LED灯的任务。

1. 硬件设计
轻触按键在按下时会使得按键的两个引脚接通,通过电路设计可以使得在按键按下时引脚产生电平变化。

野火启明6M5开发板的按键电路设计如下:
在这里插入图片描述
其中,RES 按键是开发板的芯片复位按键,用于复位MCU芯片。 另外两个按键为用户可自定义的按键,可用于实现用户所需的功能。

在按键的电路设计中,与按键相并联的电容属于硬件滤波电容,可以在一定程度上防止按键抖动带来的误触发。 其实,用户也可以使用瑞萨RA MCU的IO引脚内部自带的数字滤波功能,这样可以去掉该电容,从而减少电路板的硬件成本。

开发板按键引脚分配和中断号:

KEY_1SW2:P004(IRQ9-DS)
KEY_2SW3:P005(IRQ10-DS)

2. 软件设计
① FSP配置
首先打开 “16_ICU_External_IRQ” 项目的 FSP 配置界面,接下来在这个界面里配置芯片的引脚及其相应的功能。

首先配置引脚连接到 ICU 的中断通道。
在这里插入图片描述
然后,依次点击 “Stacks” -> “New Stack” -> “Input”-> “External IRQ” 来加入外部中断模块, 如下图所示。由于使用两个按键,需要两个外部中断,所以这里需要加入2个外部中断模块。
在这里插入图片描述
第一个外部中断模块设置的是按键1的外部中断配置,按如下图所示进行设置:
在这里插入图片描述
第二个外部中断模块设置的是按键2的外部中断配置,按如下图所示进行设置:
在这里插入图片描述

外部中断模块(r_icu)的属性介绍如下表所示
在这里插入图片描述

配置完成之后可以按下快捷键“Ctrl + S”保存, 最后点右上角的 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

② 按键外部中断初始化函数

/* KEY 外部中断初始化函数 */
void Key_IRQ_Init(void)
{
   fsp_err_t err = FSP_SUCCESS;

   /* Open ICU module */
   err = R_ICU_ExternalIrqOpen(&g_external_irq9_ctrl, &g_external_irq9_cfg);
   err = R_ICU_ExternalIrqOpen(&g_external_irq10_ctrl, &g_external_irq10_cfg);
   /* 允许中断 */
   err = R_ICU_ExternalIrqEnable(&g_external_irq9_ctrl);
   err = R_ICU_ExternalIrqEnable(&g_external_irq10_ctrl);
}
  1. R_ICU_ExternalIrqOpen() 用于打开一个外部中断模块实例。

  2. R_ICU_ExternalIrqEnable() 用于使能外部中断,使能后即可触发产生外部中断。

③ 按键中断回调函数
因为之前的 FSP 配置里面 Callback 属性配置的都是同一个中断回调函数, 因此,我们仅需实现一个中断回调函数即可。当然,中断回调函数也可设置为不同的两个函数,由用户定义。

两个按键共用 key_external_irq_callback 中断回调函数, 并通过 p_args->channel 参数来判断是哪个中断通道产生了中断从而判断是哪个按键按下,该函数如下:

/* 按键按下标志 */
volatile bool key1_sw2_press = false;
volatile bool key2_sw3_press = false;

/* 按键中断回调函数 */
void key_external_irq_callback(external_irq_callback_args_t *p_args)
{
   /* 判断中断通道 */
   if (9 == p_args->channel)
   {
      key1_sw2_press = true;   // 按键KEY1_SW2按下
   }
   else if (10 == p_args->channel)
   {
      key2_sw3_press = true;   // 按键KEY2_SW3按下
   }
}

④ hal_entry入口函数

/* 用户头文件包含 */
#include "led/bsp_led.h"
#include "key/bsp_key_irq.h"


extern volatile bool key1_sw2_press;
extern volatile bool key2_sw3_press;


void hal_entry(void)
{
   /* TODO: add your own code here */

   LED_Init(); // LED 初始化
   Key_IRQ_Init(); // KEY 外部中断初始化

   while(1)
   {
      /* 判断按键 KEY1_SW2 是否被按下 */
      if (key1_sw2_press)
      {
            key1_sw2_press = false; //标志位清零

            LED2_TOGGLE;            //LED2 翻转
      }

      /* 判断按键 KEY2_SW3 是否被按下 */
      if (key2_sw3_press)
      {
            key2_sw3_press = false; //标志位清零

            LED3_TOGGLE;            //LED3 翻转
      }

      // LED1 闪烁指示程序正在运行
      LED1_TOGGLE;
      R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒
      // 按键被按下触发中断后,在主循环中LED2或LED3最长会被推迟1秒翻转
   }


#if BSP_TZ_SECURE_BUILD
   /* Enter non-secure code */
   R_BSP_NonSecureEnter();
#endif
}

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

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

相关文章

C++入门篇---(命名空间、缺省参数、以及输入、输出)

前言 c 我来了,恭喜牛牛解锁新世界.开启c的学习之旅. 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:讲解C…

30年后,茶产业规模是现在的10倍

做个预言:30年后,茶产业是现在的10倍 【5.21是世界茶日】 杭州中国茶博会,我来啦 人工智能越让生产效率越来越高 常用物质将会唾手可得 人闲着,无法体会活着的意义,才是挑战 田园诗茶生活方式会有一席之地 趣讲大白话&…

【EMC专题】案例:读一读TI的按接口选择ESD器件指南

在TI的官网上看到一份ESD by Interface Selection Guide,也就是按接口选择ESD器件指南。因此想读一读看看一起学习一下。 首先看一下文档,是比较简明的。可以看到不同的接口推荐了一些不同的保护器件。因为应用环境不一样,所有有不同的器件封装(如单体、集成TVS等),这样在…

Spyder可在线使用!?

不同安装,如果想使用spyder进行编程,可以用其在线版,和本地版功能一样,就是有点慢。 另外需要用chrome浏览器,用火狐没法正常访问。 Spyder可以在线使用,所以在没有安装python环境的电脑上,想…

Linux常用命令——hostname命令

在线Linux命令查询工具 hostname 显示和设置系统的主机名 补充说明 hostname命令用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主…

字符串匹配--BF算法和KMP算法

0.前言 字符串函数strstr相信大家都不陌生–就是在一个字符串(主串)中找查找另一个字符串(子串),并返回子串在主串中的位置。那么这个函数是怎么实现的呢?这就涉及字符串匹配的问题,本章就让我们…

Node.js 事件循环和事件派发器

目录 1、process.nextTick() 介绍 2、setTimeout() 3、零延迟 4、setInterval() 5、递归setTimeout 6、setImmediate() 7、Node.js 事件派发器 1、process.nextTick() 介绍 Node.js中 process.nextTick函数以一种特殊的方式与事件循环交互。 当你试图理解Node.js事件循…

Redis数据结构——QuickList、SkipList、RedisObjective

承接上文,本文主要介绍QuickList、SkipList、RedisObjective 四、 Redis数据结构-QuickList 问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办? ​ 答&a…

计算机操作系统(慕课版)第二章课后题答案

一、简答题 (1)什么是前趋图?试画出下面四条语句的前趋图. S1:axy; S2:bz1; S3:ca-b; S4:wc1; 答:前趋图(Precedence Graph)是一个有向无循环图,…

chatgpt赋能Python-pythondataframe取出一列

用 Python Dataframe 取出一列 数据分析中,用到的数据往往是有多列多行的。而在实际的分析过程中,我们需要针对其中的某一列进行处理。这个时候,Python中的Dataframe就成了我们的利器。 在这篇文章中,我们将教你如何使用Python …

chatgpt赋能Python-pythongit

PythonGit:使Git操作更加高效 Git作为目前最流行的版本控制工具之一,已经被广泛应用于软件开发、Web开发等领域。PythonGit则是一个基于Python编写的Git客户端库,可以让开发者们更加高效地进行Git操作,提高开发效率。 PythonGit…

Qt Quick系列(2)—核心元素类型(1)

作者:CCAccept 专栏:Qt Quick 文章目录 前言ItemRectangleTextImageMouseArea 总结 前言 Qt Quick的元素分为 1、视觉元素(如Rectangle)具有几何属性 2、非视觉元素(如Timer)提供一般功能,用…

learn C++ NO.5 ——类和对象(3)

日期类的实现 在前面类和对象的学习中,由于知识多比较多和碎,需要一个能够将之前所学知识融会贯通的东西。下面就通过实现日期类来对类和对象已经所学的知识进行巩固。 日期类的基本功能(.h文件) //Date.h//头文件内容 #includ…

makefile 学习(4): makefile基础

0. 官方文档 GNU Make 官方网站: https://www.gnu.org/software/makeGNU Make 官方文档下载地址: https://www.gnu.org/software/make/manual/Makefile Tutorial:https://makefiletutorial.com/ 1.基本要求 1.1 基本格式 targets : prerequisties [tab键] command target : …

一、MongoDB简介

文章目录 一、MongoDB简介1、NoSQL简介2、什么是MongoDB ?3、MongoDB 特点4、安装mongodb5、MongoDB 概念解析5.1 数据库5.2 文档5.3 集合5.4 MongoDB 数据类型 6、适用场景 一、MongoDB简介 1、NoSQL简介 NoSQL(NoSQL Not Only SQL),意即反SQL运动,…

关于在spyder,jupyter notebook下创建虚拟环境(pytorch,tensorflow)均有效

anaconda下载地址 https://www.anaconda.com/download/ 下载完成后打开anaconda目录下的 anaconda prompt 在命令行中输入下面的命令创建一个叫tf2.0的虚拟环境(“tf2.0”是建立的Conda虚拟环境的名字,可以自拟) conda create -n tf2.0 p…

chatgpt赋能Python-pythonfor遍历

Python for 遍历:优雅地遍历数据结构 对于任何编程语言来说,遍历是一项基本操作。而在 Python 中,遍历是一项非常简单和优雅的操作。Python 提供了多种遍历数据结构的方法,包括 for 循环、while 循环、迭代器和生成器等。本文将介…

模板和STL【C++初阶】

目录 一、前言 二、函数模板 三、类模板 四、STL 一、前言 以前我们写swap函数时,对每一种类型的变量都要写一份swap函数,但是他们的格式都是一样的,未免有些麻烦 因此,我们今天学习的模板就可以针对广泛的类型而不是具体的类…

chatgpt赋能Python-pythondir

Python dir命令:探索Python模块的秘密 如果你是一名Python开发者,那么你一定或多或少接触过dir这个命令。但是,你了解dir到底能做什么吗?这篇文章将会介绍dir命令的用途、用法以及一些有趣的技巧。 什么是dir命令 简单来说&…

chatgpt赋能Python-pythonfind

Python文件搜索工具Pythonfind 在开发过程中,文件搜索工具是一个非常重要的工具。在大型项目中,可能需要查找特定类型的文件或者在代码库中查找特定的代码块。 Pythonfind是一个非常强大和灵活的python文件搜索工具,可以帮助我们简化这个过程…