[APM32F4] 【APM32F402R Micro-EVB】04:调试板载的外部中断

[复制链接]
305|8
聪聪哥哥 发表于 2025-8-25 16:51 | 显示全部楼层 |阅读模式
本帖最后由 聪聪哥哥 于 2025-8-22 21:07 编辑

一:极海半导体APM32F402 外部中断 EINT的知识介绍:
    中断/事件分为内部中断/事件、外部中断/事件。在该手册中,外中断指从 IO 引脚输入信号引起的中断/事件,在中断向量表中指 EINTX;其它中断指内部中断/事件。
    事件可分为硬件事件、软件事件。硬件事件是通过外部/内核硬件信号产生事件,软件事件是通过指令产生事件。
    中断需经过中断处理函数实现需要处理的工作;事件不需要经过中断处理函数,硬件触发可触发预先设置的工作。例如,外部事件为产生 GPIO输出脉冲,内部事件为一个 TMR 的更新事件触发另一个 TMR 工作。
(1)触发内部中断(内部硬件事件)但不触发中断处理函数唤醒
      使能外设中的一个内部中断,但不使能 NVIC 中对应的中断,避免触发中断处理函数
     在内核的系统控制器中使能 SEVONPEND 位,执行 WFE 指令使内核进入睡眠
     产生中断唤醒内核,当内核从 WFE恢复后,需要清除相应外设的中断挂起位和外设 NVIC 中断通道挂起位(在 NVIC 中断清除挂起寄存器中)
(2)通过 EINT 线事件(外部硬件事件)唤醒
    配置 EINT 线为事件模式
    执行 WFE 指令使内核进入睡眠
    产生事件唤醒内核,CPU 从 WFE 恢复后,因为对应事件线的挂起位没有被置位,不必清除相应外设的中断挂起位或NVIC 中断通道挂起位
    04-1.png
二:硬件如下所示:
2.1 按键的原理图如下:
04-2.png
可见,当按键没有触发的时候,为高电平,这里还是增加一个上拉电阻吧,要不然此处电平不稳定,我实际测试的时候发现,有时候按下KEY1按键时候,程序执行了两次,不确定是按键的问题,还是电平不稳定。
2.2 外部中断的寄存器外设。
04-3.png
可见程序编写的时候,需要判断0X0C的寄存器:
三:软件代码如下:
3.1 编写过程:
初始化IO口为输入。
开启IO口复用时钟。
设置IO口与中断线的映射关系。
初始化线上中断,设置触发条件等。
配置中断分组(NVIC),并使能中断。
编写中断服务函数。 清除中断标志位
3.2 初始化代码如下所示:
  1. void EXTI0_INT_INIT( void )
  2. {
  3.     GPIO_Config_T GPIO_ConfigStruct = {0U};
  4.     EINT_Config_T EINT_ConfigStruct = {0U};
  5.     /* Enable the BUTTON Clock */
  6.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA| RCM_APB2_PERIPH_AFIO);
  7.     /* Configure Button pin as input floating */
  8.     GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU;
  9.     GPIO_ConfigStruct.pin = GPIO_PIN_1;
  10.     GPIO_Config(GPIOA, &GPIO_ConfigStruct);
  11. //软件配置成上拉模式,,,这里在初始化的时候,配置成高电平,实际还是有误动作的情况,可能意义不大
  12.                 GPIO_SetBit(GPIOA,GPIO_PIN_1);

  13.     /* GPIOA ----> EXTI_Line0 */
  14.         /* Connect Button EINT Line to Button GPIO Pin */
  15.                 GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_A, GPIO_PIN_SOURCE_1);
  16.                 /* Configure Button EINT line */
  17.                 EINT_ConfigStruct.line = EINT_LINE_1;
  18.                 EINT_ConfigStruct.mode = EINT_MODE_INTERRUPT;
  19.                 EINT_ConfigStruct.trigger = EINT_TRIGGER_FALLING;
  20.                 EINT_ConfigStruct.lineCmd = ENABLE;
  21.                 EINT_Config(&EINT_ConfigStruct);
  22.                 /* Enable and set Button EINT Interrupt to the lowest priority */
  23.                 NVIC_EnableIRQRequest(EINT1_IRQn, 0x01, 0x01);
  24. }
3.3 中断处理函数如下:
  1. void EINT1_IRQHandler(void)
  2. {
  3.     if (EINT_ReadIntFlag(EINT_LINE_1))
  4.     {
  5.         BOARD_LED_Toggle(LED3);
  6.         EINT_ClearIntFlag(EINT_LINE_1);
  7.     }
  8. }
四:实测效果图如下所示:
04 00_00_00-00_00_30.gif
视频看的可能不是很明显,实际调试的发现,有时候按下一次,LED的电平完成了两次翻转。
中断的应用场景:
按钮/开关控制:当用户按下按钮或切换开关时,可以触发外部中断来响应用户的操作,例如控制LED的亮灭或执行特定功能。这种中断类型常用于用户界面交互,如按键控制设备启动、停止或切换模式。
传感器触发:当传感器检测到特定事件或条件发生时(如温度达到阈值、光线强度变化等),可以触发外部中断来及时处理传感器数据。这种中断类型在环境监测、工业自动化等领域有广泛应用。
抒情黎明 发表于 2025-8-27 16:28 | 显示全部楼层
外部中断的触发方式,和咱们平时使用的采样的也没有什么区别啊!
中断方式还没有去抖
 楼主| 聪聪哥哥 发表于 2025-8-27 19:28 | 显示全部楼层
抒情黎明 发表于 2025-8-27 16:28
外部中断的触发方式,和咱们平时使用的采样的也没有什么区别啊!
中断方式还没有去抖 ...

是的 有时候确实有误触发的情况。。去抖的话,,在中断中,也不能使用延时函数,还不如在定时器中直接读取引脚的电平状态
抒情黎明 发表于 2025-9-9 15:58 | 显示全部楼层
如果外部中断的触发方式更新为电平方式,抖动上面会不会就好一些啊
 楼主| 聪聪哥哥 发表于 2025-9-10 10:16 | 显示全部楼层
抒情黎明 发表于 2025-9-9 15:58
如果外部中断的触发方式更新为电平方式,抖动上面会不会就好一些啊

会的,会好一些,可以在定时器里面 扫描两次电平状态。
星云狂想曲 发表于 2025-9-10 17:27 | 显示全部楼层
外部中断的典型应用有哪些啊?
 楼主| 聪聪哥哥 发表于 2025-9-10 20:38 | 显示全部楼层
星云狂想曲 发表于 2025-9-10 17:27
外部中断的典型应用有哪些啊?

按键,限位,这些啊啊 工业上面很多场景
天体书记 发表于 2025-9-12 20:14 | 显示全部楼层
急停,限位开关的应用场景下都是使用外部中断来触发的。
与时间关系不大的,操作按键等考虑到系统资源倒是多数采取轮询查看的方式实现
 楼主| 聪聪哥哥 发表于 2025-9-13 08:07 | 显示全部楼层
天体书记 发表于 2025-9-12 20:14
急停,限位开关的应用场景下都是使用外部中断来触发的。
与时间关系不大的,操作按键等考虑到系统资源倒是 ...

嗯呢 对对,为了抗干扰还是轮询合适一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

307

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部