[APM32E0] APM32E030的EINT驱动(中断)

[复制链接]
156|0
口天土立口 发表于 2025-9-6 10:54 | 显示全部楼层 |阅读模式
, GPIO, pi, IO,



4389568bb9f5045845.png
查阅APM32E030的手册可知:E030的EINT可实现事件和中断两种,其中中断触发时,会置位对应的挂起位,同时产生中断请求,需要进入中断服务函数。

9919968bb9fb056027.png
1539668bb9fbfc47d9.png
内核可通过WFI和WFE指令停止,其中WFI指令为使用中断唤醒。

5614268bb9fe66a5b3.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_INTERRUPT;
  21.     eintConfig.trigger = EINT_TRIGGER_FALLING;
  22.     eintConfig.lineCmd = ENABLE;
  23.     EINT_Config(&eintConfig);
  24.    
  25.     NVIC_EnableIRQ(EINT0_1_IRQn);
  26.     NVIC_SetPriority(EINT0_1_IRQn, 0);
  27. }
  1. void EINT0_1_IRQHandler(void)
  2. {
  3.     if (EINT_ReadIntFlag(EINT_LINE1) != RESET) {
  4.         EINT_ClearIntFlag(EINT_LINE1);
  5.     }
  6. }
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_WFI);
  8. }
  1. // 应用任务
  2. void app_task(void)
  3. {
  4.     goio_toggle();
  5.     delay();
  6. }
EINT初始化后,使用PMU_EnterSleepMode(PMU_SLEEPENTRY_WFI);使内核进入睡眠模式,并等待中断唤醒。
注意:WFI为中断唤醒指令
当KEY2按下后,内核唤醒,LED持续翻转;

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



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

本版积分规则

19

主题

45

帖子

0

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