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

系列文章目录

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中断是什么?

        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闪烁


总结

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


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值