查阅APM32E030的手册可知:E030的EINT可实现事件和中断两种,其中中断触发时,会置位对应的挂起位,同时产生中断请求,需要进入中断服务函数。
内核可通过WFI和WFE指令停止,其中WFI指令为使用中断唤醒。
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_INTERRUPT;
- eintConfig.trigger = EINT_TRIGGER_FALLING;
- eintConfig.lineCmd = ENABLE;
- EINT_Config(&eintConfig);
-
- NVIC_EnableIRQ(EINT0_1_IRQn);
- NVIC_SetPriority(EINT0_1_IRQn, 0);
- }
- void EINT0_1_IRQHandler(void)
- {
- if (EINT_ReadIntFlag(EINT_LINE1) != RESET) {
- EINT_ClearIntFlag(EINT_LINE1);
- }
- }
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_WFI);
- }
- // 应用任务
- void app_task(void)
- {
- goio_toggle();
- delay();
- }
EINT初始化后,使用PMU_EnterSleepMode(PMU_SLEEPENTRY_WFI);使内核进入睡眠模式,并等待中断唤醒。
注意:WFI为中断唤醒指令
当KEY2按下后,内核唤醒,LED持续翻转;
详细代码,请查看附件!
INTERRUPT.zip
(2.12 MB, 下载次数: 0)
|