本帖最后由 口天土立口 于 2025-9-6 10:31 编辑
查阅APM32E030的手册可知:E030的EINT可实现事件和中断两种,其中事件触发时,不置位对应的挂起位,也不产生中断请求。
内核可通过WFI和WFE指令停止,其中WFE指令为使用事件唤醒
E030的EINT中断与事件线映射,共有18条。
本次代码基于开发板:APM32E030R Micro-EVB
EINT使用IO:PA1(KEY2)
现象LED:LED1
EINT的事件代码配置如下:
- void bsp_eint_init(void)
- {
- GPIO_Config_T gpioConfig;
- EINT_Config_T eintConfig;
-
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
-
- /* GPIO初始化 */
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_1;
- gpioConfig.mode = GPIO_MODE_IN;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_PU;
- GPIO_Config(GPIOA, &gpioConfig);
-
- /* EINT初始化 */
- EINT_ConfigStructInit(&eintConfig);
- eintConfig.line = EINT_LINE1;
- eintConfig.mode = EINT_MODE_EVENT;
- eintConfig.trigger = EINT_TRIGGER_FALLING;
- eintConfig.lineCmd = ENABLE;
- EINT_Config(&eintConfig);
- }
因EINT的事件不产生中断请求,所以不需要使能EINT的中断,也不需要编写对应的中断服务函数。
- void delay(void)
- {
- volatile int n = 0xFFFFF;
- while (n--);
- }
- void gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
-
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
-
- // GPIO初始化
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_6;
- gpioConfig.mode = GPIO_MODE_OUT;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOB, &gpioConfig);
- }
- void goio_toggle(void)
- {
- if (GPIO_ReadOutputBit(GPIOB, GPIO_PIN_6) == BIT_SET) {
- GPIO_ClearBit(GPIOB, GPIO_PIN_6);
- } else {
- GPIO_SetBit(GPIOB, GPIO_PIN_6);
- }
- }
- // 应用初始化
- void app_init(void)
- {
- gpio_init();
- bsp_eint_init();
- // 睡眠等待事件唤醒
- PMU_EnterSleepMode(PMU_SLEEPENTRY_WFE);
- }
- // 应用任务
- void app_task(void)
- {
- goio_toggle();
- delay();
- }
EINT初始化完成后,使用PMU_EnterSleepMode(PMU_SLEEPENTRY_WFE)使内核进入睡眠模式,并等待事件触发唤醒;
当KEY2按下后,内核唤醒,LED持续翻转。
详细代码,请查附件!
EVENT.zip
(2.12 MB, 下载次数: 0)
|