[APM32F4] 外部中断不知道怎么配?带你玩透APM32F427的EINT事件与中断

[复制链接]
31|0
口天土立口 发表于 2025-11-19 11:35 | 显示全部楼层 |阅读模式
本帖最后由 Gfan 于 2025-11-19 17:56 编辑

#技术资源# #申请原创#

@21小跑堂

1. 外设介绍
GPIO的所有引脚均能映射到EINT功能,实现外部输入检测。
EINT分为事件和中断两种类型,其中事件不需要经过中断处理函数,而中断需要。

2. 硬件
APM32F427ZG TINY


3. 驱动介绍
EINT的事件初始化相当简单,配置对应引脚为输入,并开放EINT对应引脚的事件屏蔽寄存器,同时配置触发类型即可。注意:同时需要使能系统配置寄存器,并配置EINT的外部中断源。
  1. /*
  2. * [url=/u/brief]@brief[/url]       EINT初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_eint_init(void)
  10. {
  11.     GPIO_Config_T gpioConfig;
  12.     EINT_Config_T eintConfig;
  13.    
  14.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);
  15.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
  16.    
  17.     /* PD9 -> K2 */
  18.    
  19.     /* GPIO初始化 */
  20.     GPIO_ConfigStructInit(&gpioConfig);
  21.     gpioConfig.pin     = GPIO_PIN_9;
  22.     gpioConfig.mode    = GPIO_MODE_IN;
  23.     gpioConfig.otype   = GPIO_OTYPE_PP;
  24.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  25.     gpioConfig.pupd    = GPIO_PUPD_NOPULL;
  26.     GPIO_Config(GPIOD, &gpioConfig);
  27.    
  28.     SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOD, SYSCFG_PIN_9);
  29.    
  30.     /* EINT初始化 */
  31.     EINT_ConfigStructInit(&eintConfig);
  32.     eintConfig.line    = EINT_LINE_9;
  33.     eintConfig.mode    = EINT_MODE_EVENT;
  34.     eintConfig.trigger = EINT_TRIGGER_FALLING;
  35.     eintConfig.lineCmd = ENABLE;
  36.     EINT_Config(&eintConfig);
  37. }

EINT中断模式配置改为开放中断屏蔽寄存器,同时需使能对应EINT的中断,并在中断处理函数内部清除挂起标志位即可。
  1. /*
  2. * @brief       EINT初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_eint_init(void)
  10. {
  11.     GPIO_Config_T gpioConfig;
  12.     EINT_Config_T eintConfig;
  13.    
  14.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);
  15.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
  16.    
  17.     /* PD9 -> K2 */
  18.    
  19.     /* GPIO初始化 */
  20.     GPIO_ConfigStructInit(&gpioConfig);
  21.     gpioConfig.pin     = GPIO_PIN_9;
  22.     gpioConfig.mode    = GPIO_MODE_IN;
  23.     gpioConfig.otype   = GPIO_OTYPE_PP;
  24.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  25.     gpioConfig.pupd    = GPIO_PUPD_NOPULL;
  26.     GPIO_Config(GPIOD, &gpioConfig);
  27.    
  28.     SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOD, SYSCFG_PIN_9);
  29.    
  30.     /* EINT初始化 */
  31.     EINT_ConfigStructInit(&eintConfig);
  32.     eintConfig.line    = EINT_LINE_9;
  33.     eintConfig.mode    = EINT_MODE_INTERRUPT;
  34.     eintConfig.trigger = EINT_TRIGGER_FALLING;
  35.     eintConfig.lineCmd = ENABLE;
  36.     EINT_Config(&eintConfig);
  37.    
  38.     NVIC_EnableIRQRequest(EINT9_5_IRQn, 0, 0);
  39. }

  40. void EINT9_5_IRQHandler(void)
  41. {
  42.     if (EINT_ReadIntFlag(EINT_LINE_9) != RESET) {
  43.         EINT_ClearIntFlag(EINT_LINE_9);
  44.     }
  45. }

4. 测试
EINT的事件方式测试,需调用__WFE()函数进行测试,等待事件唤醒。
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     gpio_init();
  5.     bsp_eint_init();
  6.     // 睡眠等待事件唤醒
  7.     __WFE();
  8. }
EINT的中断方式测试,需调用__WFI()函数进行测试,等待中断产生唤醒。
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     gpio_init();
  5.     bsp_eint_init();
  6.     // 睡眠等待中断唤醒
  7.     __WFI();
  8. }

5. 注意事项
需注意要使能系统配置的时钟,并配置EINT的外部输入源。

6. 详细代码
Event.zip (6.68 MB, 下载次数: 0) Interrupt.zip (6.69 MB, 下载次数: 0)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

64

帖子

0

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