[APM32E0] APM32E030的EINT驱动(事件)

[复制链接]
246|4
口天土立口 发表于 2025-9-6 10:05 | 显示全部楼层 |阅读模式
, pi, IO, 事件,
本帖最后由 口天土立口 于 2025-9-6 10:31 编辑


9835268bb96d414041.png


查阅APM32E030的手册可知:E030的EINT可实现事件和中断两种,其中事件触发时,不置位对应的挂起位,也不产生中断请求。

9350968bb97b753d3c.png
5255368bb97c262428.png
内核可通过WFI和WFE指令停止,其中WFE指令为使用事件唤醒
3556568bb98175f4cb.png
E030的EINT中断与事件线映射,共有18条。

本次代码基于开发板:APM32E030R Micro-EVB
EINT使用IO:PA1(KEY2)
现象LED:LED1

EINT的事件代码配置如下:
  1. void bsp_eint_init(void)
  2. {
  3.     GPIO_Config_T gpioConfig;
  4.     EINT_Config_T eintConfig;
  5.    
  6.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  7.    
  8.     /* GPIO初始化 */
  9.     GPIO_ConfigStructInit(&gpioConfig);
  10.     gpioConfig.pin     = GPIO_PIN_1;
  11.     gpioConfig.mode    = GPIO_MODE_IN;
  12.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  13.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  14.     gpioConfig.pupd    = GPIO_PUPD_PU;
  15.     GPIO_Config(GPIOA, &gpioConfig);
  16.    
  17.     /* EINT初始化 */
  18.     EINT_ConfigStructInit(&eintConfig);
  19.     eintConfig.line    = EINT_LINE1;
  20.     eintConfig.mode    = EINT_MODE_EVENT;
  21.     eintConfig.trigger = EINT_TRIGGER_FALLING;
  22.     eintConfig.lineCmd = ENABLE;
  23.     EINT_Config(&eintConfig);
  24. }
因EINT的事件不产生中断请求,所以不需要使能EINT的中断,也不需要编写对应的中断服务函数。
  1. void delay(void)
  2. {
  3.     volatile int n = 0xFFFFF;
  4.     while (n--);
  5. }
  1. void gpio_init(void)
  2. {
  3.     GPIO_Config_T gpioConfig;
  4.    
  5.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
  6.    
  7.     // GPIO初始化
  8.     GPIO_ConfigStructInit(&gpioConfig);
  9.     gpioConfig.pin     = GPIO_PIN_6;
  10.     gpioConfig.mode    = GPIO_MODE_OUT;
  11.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  12.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  13.     gpioConfig.pupd    = GPIO_PUPD_NO;
  14.     GPIO_Config(GPIOB, &gpioConfig);
  15. }
  1. void goio_toggle(void)
  2. {
  3.     if (GPIO_ReadOutputBit(GPIOB, GPIO_PIN_6) == BIT_SET) {
  4.         GPIO_ClearBit(GPIOB, GPIO_PIN_6);
  5.     } else {
  6.         GPIO_SetBit(GPIOB, GPIO_PIN_6);
  7.     }
  8. }
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     gpio_init();
  5.     bsp_eint_init();
  6.     // 睡眠等待事件唤醒
  7.     PMU_EnterSleepMode(PMU_SLEEPENTRY_WFE);
  8. }
  1. // 应用任务
  2. void app_task(void)
  3. {
  4.     goio_toggle();
  5.     delay();
  6. }


EINT初始化完成后,使用PMU_EnterSleepMode(PMU_SLEEPENTRY_WFE)使内核进入睡眠模式,并等待事件触发唤醒;
当KEY2按下后,内核唤醒,LED持续翻转。

详细代码,请查附件!
EVENT.zip (2.12 MB, 下载次数: 0)



评论

Hi 大佬 感谢分享,本篇文章暂不符合原创标准,更多详情请浏览https://bbs.21ic.com/icview-3431776-1-1.html  发表于 2025-9-17 16:50
CloudKiss 发表于 2025-9-6 10:53 | 显示全部楼层
外部中断,我只是使用过做为边沿触发来执行动作。
通过外部中断的方式退出sleep模式,看上去非常高效。
风暴之眸 发表于 2025-9-6 12:44 | 显示全部楼层
使用GPIO的外部中断退出低功耗模式,从而使用整个系统实现低功耗运行
幻影书记 发表于 2025-9-8 14:21 | 显示全部楼层
外部中断的触发,电平,边沿有啥区别啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

45

帖子

0

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