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

[复制链接]
聪聪哥哥 发表于 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的亮灭或执行特定功能。这种中断类型常用于用户界面交互,如按键控制设备启动、停止或切换模式。
传感器触发:当传感器检测到特定事件或条件发生时(如温度达到阈值、光线强度变化等),可以触发外部中断来及时处理传感器数据。这种中断类型在环境监测、工业自动化等领域有广泛应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

93

主题

238

帖子

1

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