【致敬未来的攻城狮计划】— 连续打卡第十五天:FSP固件库外部中断处理编程(外部中断检测按键控制LED闪烁)

news2024/11/29 2:50:19

系列文章目录

1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下

2.开发环境的选择和调试(从零开始,加油)

3.欲速则不达,今天是对RA2E1 基础知识的补充学习。

4.e2 studio 使用教程

5.Keil配置使用(使用 RASC 生成 Keil 工程)

6.Keil配置使用(使用 RASC 生成 Keil 工程)

7.(电脑重装系统)学习RA产品家族选型手册

8.问题解决、学习RA寄存器、用寄存器的方式点亮第一个LED灯。

9.继续学习RA寄存器

10.FSP固件库开发及FSP配置详解。

11.FSP固件库开发点亮第一个灯。

12.FSP固件库开发按键输入检测控制LED灯闪烁

13.FSP固件库开发启动文件详解

14.FSP固件库开发延时函数(时钟详解)


文章目录

目录

系列文章目录

前言

一、RA2E1中断是什么?

二、中断设置

1.NVIC设置

​编辑 2.外部中断编程

3.FSP配置

三、实操

1.新建工程

​编辑 2.选择“Stacks”选项栏

 3.选择“New Stack”后,依次选择“Input”、“Extern IRQ Driver on r_icu”。

 4.选择“FSP Configuration”后,点击“g_external_irq0_External IRQ r_icu”,如下图所示。

5.在“g_external_irq0_External IRQ r_icu”栏中,可以根据需求选择“Trigger”模式,使能“Digital Filtering”,并为外部中断回调函数命名

6. 完成设置后,点击“Generate Project Content”,待右下方进度条完成后,配置结束。

7.外部中断初始化

总结


前言

                时钟讲完,立即该接上我们的外部中断这一块了,外部中断这一块也是咱们必修之一,非常之重要,于是外部中断这篇文章应运而生。后续也会接着定时器,讲定时器中断。


一、RA2E1中断是什么?

        ICU(中断控制单元)负责控制哪些中断信号链接到NVIC和DTC模块。在RA产品中使用ICU来配置外部中断。

        中断控制器单元(ICU)控制着一些事件发出的信号,从而链接到嵌套矢量中断控制器(NVIC)、DMA控制器(DMAC)和数据传输控制器(DTC)模块。ICU还控制着不可屏蔽的中断。 所以可以说围绕着 ICU 的有四个部分:NVIC、DMAC、DTC和NMI。

模块1

NMI

不可屏蔽的中断

模块2

NVIC

嵌套向量中断控制器

模块3

DTC

数据传输控制器

模块4

DMAC

直接内存访问控制器

        其中在ICU里最重要的是NVIC,它是属于内核级别的中断控制器。其次是DTC,用于提供在被中断请求激活时传输数据的功能。之后是DMAC,当产生DMA传输请求时,DMAC将存储在传输源地址的数据传输到传输目的地地址。最后是NMI不可屏蔽中断NonMaskable,用于处理非常紧急的事件。

        其实对学过stm32的同学,应该是不陌生NVIC的操作。

        NVIC 英文名全称:(Nested Vector Interrupt Controller)中文名:嵌套向量中断控制。 在所有Cortex-M系列处理器中都包含了一个叫做 NVIC 模块,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M系列的内核里面的NVIC进行裁剪。

        NVIC能够处理系统异常比如复位和一些系统错误,NVIC还能够处理中断源,比如定时器中断、外部中断等。

        RA系列MCU在内核水平上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中系统异常有8个(如果把Reset和HardFault也算上的话就是10个)。 除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。 有关具体的系统异常和外部中断可在core_cm33.h这个头文件查询到,在IRQn_Type这个结构体里面包含了RA系列MCU全部的异常声明。

        中断向量嵌套控制器是用来管理所有中断和事件的,包括中断的使能和除能,中断的优先级。这个是属于内核的东西。

代码 15‑1 NVIC结构体定义,来自固件库头文件:core_cm33.h
 typedef struct
 {
 __IOM uint32_t ISER[16U];           // 中断使能寄存器
         uint32_t RESERVED0[16U];
 __IOM uint32_t ICER[16U];           //中断清除使能寄存器
         uint32_t RSERVED1[16U];
 __IOM uint32_t ISPR[16U];           //中断挂起寄存器
         uint32_t RESERVED2[16U];
 __IOM uint32_t ICPR[16U];           //中断清除挂起寄存器
         uint32_t RESERVED3[16U];
 __IOM uint32_t IABR[16U];           // 中断激活寄存器\中断有效位寄存器
         uint32_t RESERVED4[16U];
 __IOM uint32_t ITNS[16U];           //中断目标安全寄存器
         uint32_t RESERVED5[16U];
 __IOM uint8_t  IPR[496U];           // 中断优先级寄存器
         uint32_t RESERVED6[580U];
 __OM  uint32_t STIR;
 }  NVIC_Type;

二、中断设置

1.NVIC设置

4309e874f1df4fbd81826e59fa455ecd.png

0c7ef9d4497147a7acd8194c90372305.png 2.外部中断编程

RA2E1开发板支持16个中断优先级,优先级从0到15,数值越小的中断优先级越高。具体的中断优先级如下:

中断优先级中断源
0NMI
1WDT
2LVD
3RTC
4S12AD
5TAU0
6TAU1
7TAU2
8TAU3
9TAU4
10TAU5
11DMAC0
12DMAC1
13DMAC2
14DMAC3
15DMAC4

3.FSP配置

        双击 configuration.xml 打开配置界面: 然后点开依次点击 Stacks -> Peripherals -> Storage -> New Stack -> Input-> IRQ 来配置外部中断模块。

c9d041fd775247b7adbf1be523708996.png

IRQ页面的属性介绍

c7ff35ec80a4a20ab9c3c938f6d1f458.jpeg

IRQ属性

描述

Name

名称

Channel

通道

Trigger

触发方式

Digital Filtering

滤波

Callback

中断服务回调函数

Pin Input priority

中断优先级


三、实操

1.新建工程

e47b66f27ced46bbaa3e2c24c406e7f2.png

0d002a8f7fe24989bc952ce9bf92939f.png 2.选择“Stacks”选项栏

6aea0c0273dc463faf85cc9e5997e2cb.png

 3.选择“New Stack”后,依次选择“Input”、“Extern IRQ Driver on r_icu”。

fe2d72f29e0a44c080566f48f8e9dfc2.png

 4.选择“FSP Configuration”后,点击“g_external_irq0_External IRQ r_icu”,如下图所示。

5ef1c54f137540fb9064e75743ba2bfc.png

e5ee4c9debb641329b2074c230bcb482.png

5.在“g_external_irq0_External IRQ r_icu”栏中,可以根据需求选择“Trigger”模式,使能“Digital Filtering”,并为外部中断回调函数命名

      0cc1b7b21f8c4ceaa62de7bb14ff8452.png

 

6. 完成设置后,点击“Generate Project Content”,待右下方进度条完成后,配置结束。

7.外部中断初始化

/* IRQ初始化函数 */
void IRQ_Init(void)
{
   /* 初始化外部中断*/
   R_ICU_ExternalIrqOpen(int0.p_ctrl,int0.p_cfg);
   R_ICU_ExternalIrqEnable(int0.p_ctrl);
}


R_ICU_ExternalIrqOpen()配置一个IRQ输入引脚与外部中断接口一起使用。

R_ICU_ExternalIrqEnable()在NVIC为指定通道启用外部中断。

 

#include "hal_data.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER


#define LED1_ON     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_LOW)
#define LED2_ON     R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_LOW)

#define LED1_OFF    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_01, BSP_IO_LEVEL_HIGH)
#define LED2_OFF    R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_05_PIN_02, BSP_IO_LEVEL_HIGH)

#define Irq_io_ON		R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_11, BSP_IO_LEVEL_HIGH)
#define Irq_io_OFF		R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_11, BSP_IO_LEVEL_LOW)

#define KEY_ON  1
#define KEY_OFF 0

/* 开发板,两个按键引脚定义 */
#define KEY1_SW2_PIN    BSP_IO_PORT_00_PIN_04

#define LED_Red     BSP_IO_PORT_05_PIN_01

uint32_t Key_Scan(bsp_io_port_pin_t key)
{
   bsp_io_level_t state;

   // 读取按键引脚电平
   R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
   if (BSP_IO_LEVEL_HIGH == state)
   {
      return KEY_OFF; //按键没有被按下
   }
   else
   {
      do  //等待按键释放
      {
            R_IOPORT_PinRead(&g_ioport_ctrl, key, &state);
      } while (BSP_IO_LEVEL_LOW == state);
   }

   return KEY_ON; //按键被按下了
}

/* 简单的软件延时函数
   使用不同的系统时钟,延时不一样
*/
void Delay(__IO uint32_t nCount)
{
   for(; nCount != 0; nCount--);
}

/* IRQ初始化函数 */
void IRQ_Init(void)
{
   /* 初始化外部中断*/
   R_ICU_ExternalIrqOpen(int0.p_ctrl,int0.p_cfg);
   R_ICU_ExternalIrqEnable(int0.p_ctrl);
}

bsp_io_level_t int0_status = BSP_IO_LEVEL_LOW;                                             //状态结构体

/* 中断服务回调函数 */
void int0_callback(external_irq_callback_args_t *p_args)                                    //当产生中断时会访问中断服务函数
{
   (void) p_args;
   R_IOPORT_PinWrite(&g_ioport_ctrl, LED_Red, int0_status);
   int0_status =~ int0_status;      
}


/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
	R_IOPORT_Open (&g_ioport_ctrl, g_ioport.p_cfg);
	IRQ_Init();
	LED1_ON;
	LED2_ON;
	while(1)
	{
	}
	
	
	
#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

视频效果:

RA2E1 外部中断 控制led闪烁


总结

        外部中断已完结!下一步定时器!!!加油,希望文章能对大家有所帮助。

 


没有所谓失败,除非你不再尝试。

 

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

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

相关文章

J - 在赌场玩

第一周任务 - Virtual Judge (vjudge.net) http://t.csdn.cn/rcwO7 第一周任务 - Virtual Judge (vjudge.net) 【题目描述】 然后所有玩家成对玩,每对玩家只玩一次。因此,例如,如果总共有四个玩家,则进行六场比赛:第…

真题详解(二分查找平均值)-软件设计(六十)

真题详解(数据流图平衡)-软件设计(五十九)https://blog.csdn.net/ke1ying/article/details/130394959 全码:指关系模式所有属性都是这个关系模式的候选码。 RISC特点: 指令种类:少,精简 指令…

彻底弄懂Java的泛型1 - 泛型类

Java泛型是初级程序员向中高级程序员进阶的必经之路,他不是特别难,但是想全部搞懂和会用,还是不容易的。 本文从实战角度出发,讲解你在公司做开发,可能会用到泛型的一种场景。 泛型T的用法 引子 先来看一个简单的类…

UDP 协议

目录 一、什么是协议 二、认识UDP 协议 2.2 UDP 协议的报文格式 2.3 使用UDP 协议传输大文件时的策略 2.4 UDP协议的工作流程 一、什么是协议 为了使数据在网络上传输(从源头到达目的),网络通信的参与方必须遵循相同的规则,如…

SpaceX的星舰爆炸了:产品开发,快速失败真的很重要

目录 前言 快速失败 产品生命周期 专栏上线 前言 看到很多人都在聊星舰,今天就来简单谈谈“炸星舰”带给我们的启示。 在美国中部时间20日,SpaceX公司的“星舰”超重型火箭进行了首次轨道飞行。 但在该火箭成功点火升空几分钟后,却在半…

Java-synchronized实现详解(从Java到汇编)

synchronized作为java语言中的并发关键词,其在代码中出现的频率相当高频,大多数开发者在涉及到并发场景时,一般都会下意识得选取synchronized。 synchronized在代码中主要有三类用法,根据其用法不同,所获取的锁对象也…

如何通过开源项目搭建私有云平台--第四步下:安装rancher 监控

第四步下:安装rancher 监控,缺告警 本来想监控与告警一起写,但最近几天研究了rancher的告警,按照文档说法,配置了但没有触发,网上找了一些资料,有的在rancer 2.6成功的,但我用同样的方法在2.7.…

09 【Sass语法介绍-函数指令】

1.前言 在之前的章节我们学习过 Sass 提供的各种各样的函数,那么如果我们需要自定定义函数来使用就需要用到函数指令 function了。本节内容我们来学习 Sass 函数指令的语法和使用,在 Sass 中自定义函数是必须要掌握的! 2.什么是 Sass 函数指…

又一款可视化神器,开源了!

在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具,我们能够大幅提升数据分析效率、生成更高质量的项目报告,让用户通过直观的数据看到结果,减低沟通成…

安卓项目如何做单元测试

前言 先说一下创建篇文章的目的,近期负责搭建公司的单元测试框架,于是查阅了网上的很多文章,以及参考了github上很多的项目例子,并且也进行了相当多的尝试。这其中花费了很多的精力,大约有两三周的时间,远…

淘系抓包流程(淘宝数据无法抓包解决方式)

淘系抓包流程 结合frida和adb工具以及mumu模拟器进行抓包。 具体的关系图: frida的安装 frida安装,直接安装官网的脚手架。frida官网使用python的pip安装,python > 3。 安装后使用查看版本命令来确认是否安装。 pip install frida-tools frida --ve…

【严重】VMware Aria Operations for Logs v8.10.2 存在反序列化漏洞(CVE-2023-20864)

漏洞描述 VMware Aria Operations for Logs前身是vRealize Log Insight,VMware用于处理和管理大规模的日志数据产品。 VMware Aria Operations for Logs 8.10.2版本中存在反序列化漏洞,具有 VMware Aria Operations for Logs 网络访问权限的未经身份验…

“SCSA-T学习导图+”系列:交换技术之STP

本期引言: 在通信工程当中,从物理层面上,我们可以采用冗余链路保证网络的健壮性。冗余是指出于系统安全和可靠性等方面的考虑,人为地对一些关键部件或功能进行重复的配置。当系统发生故障时,比如某一设备发生损坏&…

【Linux】Linux下的gbd调试,你学废了吗

操作系统核心数centos 3.10.032位单核 gbd调试方法-以线程运行时调试为例 线程死锁状态时查看栈升级gbd通过gdb在程序运行时进行调试 线程死锁状态时查看栈 在线程-线程安全之互斥中,我们自己写了一个模拟实现的线程死锁情况 我们用gbd调试查看了当前线程的调用&a…

拉链表制作

1.拉链表的应用场景 拉链表适合于:数据会发生变化,但是大部分是不变化的(即:缓慢变化维。还需要保留历史数据做分析的场景) 2.拉链表的形成过程 关键的过程 第四步:获取变化的数据(创建和修改…

Flask连接MySQL

本文章涉及到Flask框架和HTML内容,相关知识可查看链接 HTML-form表单和提交_html form 提交_小梁今天敲代码了吗的博客-CSDN博客https://blog.csdn.net/weixin_43780415/article/details/130110722 前端引入和html标签_小梁今天敲代码了吗的博客-CSDN博客https://b…

vscode下drawio无法使用

问题描述: Vscode下, 刚下载drawio这个插件,在vscode左边EXPLORER下,没有Test这个页面,导致vscode无法使用drawio。 解决办法: 在自己需要的目录下,新建一个文件,例如test,并命名为test.drawi…

数据结构算法

直接插入排序 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素 5.tem插入到该元…

5.1劳动节,致敬最可爱的人!Cocos社区杰出贡献者出炉

Cocos 引擎的生态建设与繁荣,离不开社区开发者的辛勤付出。 2022.5 ~ 2023.5 年度期间,有这样一批 Cocos 社区开发者,他们使用 Cocos Creaor 引擎创作内容与产品、分享技术和经验,为 Cocos 社区默默贡献自己的一份力量&#xff0c…

改进YOLOv8:替换轻量化骨干网络Efficient V1、Efficient V2《重新思考卷积神经网络的模型缩放》)

这里写目录标题 1 EfficientNetV1中存在的问题2.EfficientNetV2网络框架3.YOLOv8添加Efficient V1代码yaml文件Efficient V1代码运行4. 添加Efficient V2代码yaml文件Efficient V2运行Efficient V1论文地址:https://arxiv.org/pdf/1905.11946.pdf Efficient V1代码地址: