本帖最后由 Gfan 于 2025-11-19 17:56 编辑
#技术资源# #申请原创#
@21小跑堂
1. 外设介绍 GPIO的所有引脚均能映射到EINT功能,实现外部输入检测。 EINT分为事件和中断两种类型,其中事件不需要经过中断处理函数,而中断需要。
2. 硬件 APM32F427ZG TINY板
3. 驱动介绍 EINT的事件初始化相当简单,配置对应引脚为输入,并开放EINT对应引脚的事件屏蔽寄存器,同时配置触发类型即可。注意:同时需要使能系统配置寄存器,并配置EINT的外部中断源。 - /*
- * [url=/u/brief]@brief[/url] EINT初始化
- *
- * @param None
- *
- * @retval None
- *
- */
- void bsp_eint_init(void)
- {
- GPIO_Config_T gpioConfig;
- EINT_Config_T eintConfig;
-
- RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
-
- /* PD9 -> K2 */
-
- /* GPIO初始化 */
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_9;
- gpioConfig.mode = GPIO_MODE_IN;
- gpioConfig.otype = GPIO_OTYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NOPULL;
- GPIO_Config(GPIOD, &gpioConfig);
-
- SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOD, SYSCFG_PIN_9);
-
- /* EINT初始化 */
- EINT_ConfigStructInit(&eintConfig);
- eintConfig.line = EINT_LINE_9;
- eintConfig.mode = EINT_MODE_EVENT;
- eintConfig.trigger = EINT_TRIGGER_FALLING;
- eintConfig.lineCmd = ENABLE;
- EINT_Config(&eintConfig);
- }
EINT中断模式配置改为开放中断屏蔽寄存器,同时需使能对应EINT的中断,并在中断处理函数内部清除挂起标志位即可。 - /*
- * @brief EINT初始化
- *
- * @param None
- *
- * @retval None
- *
- */
- void bsp_eint_init(void)
- {
- GPIO_Config_T gpioConfig;
- EINT_Config_T eintConfig;
-
- RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOD);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
-
- /* PD9 -> K2 */
-
- /* GPIO初始化 */
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_9;
- gpioConfig.mode = GPIO_MODE_IN;
- gpioConfig.otype = GPIO_OTYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NOPULL;
- GPIO_Config(GPIOD, &gpioConfig);
-
- SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOD, SYSCFG_PIN_9);
-
- /* EINT初始化 */
- EINT_ConfigStructInit(&eintConfig);
- eintConfig.line = EINT_LINE_9;
- eintConfig.mode = EINT_MODE_INTERRUPT;
- eintConfig.trigger = EINT_TRIGGER_FALLING;
- eintConfig.lineCmd = ENABLE;
- EINT_Config(&eintConfig);
-
- NVIC_EnableIRQRequest(EINT9_5_IRQn, 0, 0);
- }
- void EINT9_5_IRQHandler(void)
- {
- if (EINT_ReadIntFlag(EINT_LINE_9) != RESET) {
- EINT_ClearIntFlag(EINT_LINE_9);
- }
- }
4. 测试 EINT的事件方式测试,需调用__WFE()函数进行测试,等待事件唤醒。 - // 应用初始化
- void app_init(void)
- {
- gpio_init();
- bsp_eint_init();
- // 睡眠等待事件唤醒
- __WFE();
- }
EINT的中断方式测试,需调用__WFI()函数进行测试,等待中断产生唤醒。 - // 应用初始化
- void app_init(void)
- {
- gpio_init();
- bsp_eint_init();
- // 睡眠等待中断唤醒
- __WFI();
- }
5. 注意事项 需注意要使能系统配置的时钟,并配置EINT的外部输入源。
6. 详细代码
|