0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GD32F303红枫派开发板使用手册】第四讲 GEXTI-按键中断检测实验

聚沃科技 2024-05-31 10:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

wKgaomZVdiiAfR9BAB3mDFhHnZc972.png

4.1实验内容

通过本实验主要学习以下内容:

  • EXTI中断原理;
  • 按键中断检测原理;

4.2实验原理

4.2.1NVIC中断向量控制器

介绍EXTI之前,首先为各位读者介绍NVIC中断向量控制器,NVIC为M4内核组件,用于实现高效的异常和中断处理。NVIC可以支持抢占以及咬尾中断,具有多达68种外设中断以及4位中断优先等级配置(最多支持16个中断有限等级),当中断或异常产生时,系统自动将当前处理器工作状态压栈,在执行完中断服务子程序(ISR) 后自动将其出栈。

GD32F303系列MCU的中断向量表如下表所示(包含异常中断)。

wKgaomZZMUOAKKe6AAZLfpe9MpI833.png

有关NVIC中断相关配置函数可参考gd32f30x_misc.c,其中主要有以下几个函数,其功能简介如下表所示。

wKgaomZZMVuAaa25AAGOeMO_CvA028.png

4.2.2EXTI中断原理

EXTI为外部中断/事件控制器,GD32F303系列MCU EXTI可以最多支持20个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。

EXTI框图如下图所示,极性控制用于控制边沿检测,可实现对外部EXTI信号线进行检测判断,当符合相关极性配置的EXTI信号出现后,将会发出EXTI请求,硬件EXTI请求与内部软件触发信号相或,然后输出给NVIC中断向量控制器产生中断以及输出至唤醒单元进行唤醒,也即是内部软件也可以触发相关请求。

wKgaomY23rmAKysIAADHefyD1l8246.png

EXTI相关触发源如下表所示,所有的GPIO均可以触发EXTI,另外LVD、RTC闹钟、USB唤醒以及以太网唤醒也可以触发EXTI中断或事件,EXTI可用于唤醒深度睡眠模式下的MCU。

wKgaomY23syANkiFAAF9lZFhLyA501.png
  • 注意:相同编号的引脚共用中断入口,比如PA0、PB0、PC0均使用EXTI0中断线,读者在使用时需注意不同的EXTI中断需要使用不同编号的GPIO引脚。

•软件触发EXTI中断请求可通过设置EXTI_SWIEV软件中断事件寄存器实现,如下图所示,设置相应控制位为1,即可实现软件触发EXTI中断请求。

wKgZomY23uGAS0ibAALbL54CmCk304.png

4.3硬件设计

本例程所使用的电路也为按键电路,具体可参考3.3章节描述。

4.4代码解析

4.4.1主函数代码解析

主函数代码如下所示,主要包括延迟初始化、LED初始化、key按键结构体初始化(此处将KEY0按键配置为中断模式,并将中断回调函数注册为ROCKER_KEY_IRQHandler)、串口初始化以及NVIC配置,KEY0使用的是PE2引脚,因而使能EXTI2_IRQn中断号,延迟1S后,打印Example of key interrupt detection,之后进入主循环,在主循环中查询ROCKER_KEY.press_timerms标志位,当ROCKER_KEY被按键触发中断后,该标志将会被设置为PRESS_DOWN,然后被主循环检测到后,将会打印ROCKER_KEY is pressed to trigger an interrupt。

C
int main(void)
{
driver_init();
bsp_led_group_init();
bsp_led_on(&LED0);
bsp_led_off(&LED1);

/* 配置按键为中断模式,并注册按键回调函数 */
ROCKER_KEY.key_gpio->gpio_mode = INT_LOW;
ROCKER_KEY.key_gpio->int_callback = ROCKER_KEY_IRQHandler;
bsp_key_init(&ROCKER_KEY);
nvic_irq_enable(EXTI2_IRQn,0,0);

bsp_uart_init(&BOARD_UART);
delay_ms(1000);
printf_log("Example of key interrupt detection.\r\n");

while (1)
{
if(ROCKER_KEY.press_timerms == PRESS_DOWN)
{
/* 检测到按键被按下 */
ROCKER_KEY.press_timerms = PRESS_NONE;
printf_log("ROCKER_KEY is pressed to trigger an interrupt.\r\n");
}
}
}

4.4.2按键中断回调函数

按键中断回调函数如下所示,该函数在dvire_gpio_exti_handle中被调用,dvire_gpio_exti_handle在EXTI2_IRQHandler中被调用,其中EXTI2_IRQHandler为EXTI2的中断服务程序入口。

C
void ROCKER_KEY_IRQHandler(typdef_gpio_general *KEYx_IO)
{
if(SET==bsp_key_state_get(&ROCKER_KEY))
{
ROCKER_KEY.press_timerms=PRESS_DOWN;
bsp_led_toggle(&LED0);
bsp_led_toggle(&LED1);
}
}

void dvire_gpio_exti_handle(typdef_gpio_general *gpio)
{
bit_status int_input_bit=RESET;
if(exti_flag_get(gpio->extix)==SET)
{
exti_flag_clear(gpio->extix);
int_input_bit=dvire_gpio_pin_filter_get(gpio);

if( (gpio->gpio_mode==INT_LOW && int_input_bit==RESET) || (gpio->gpio_mode==INT_HIGH && int_input_bit==SET) )
{
if(gpio->int_callback!=NULL)
{
gpio->int_callback((typdef_gpio_general *)gpio);
}
}
}
}
void EXTI2_IRQHandler(void)
{
dvire_gpio_exti_handle(ROCKER_KEY.key_gpio);
}

4.5实验结果

将本例程烧录到红枫派开发板中,通过Type C数据线连接USB串口和PC,打开串口调试助手,上电复位后,首先将会打印Example of key interrupt detection.,之后按下ROCKER_KEY按键后,将会打印:ROCKER_KEYis pressed to trigger an interrupt.。

wKgaomZZMcWAKaWoAAR7MaMcBEk034.png

教程GD32 MCU方案商聚沃科技原创发布,了解更多GD32 MCU教程,关注聚沃科技官网

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6074

    文章

    45334

    浏览量

    663295
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18604

    浏览量

    386553
  • 开发板
    +关注

    关注

    25

    文章

    6121

    浏览量

    113141
  • GD32
    +关注

    关注

    7

    文章

    429

    浏览量

    26926
  • EXTI
    +关注

    关注

    0

    文章

    27

    浏览量

    4121
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RVMCU课堂「12」: 手把手教你玩转RVSTAR—外部中断

    [size=14.6667px]NucleiStudio IDE 202102版 硬件需求 RV-STAR开发板 中断知识介绍 外部中断处理介绍 在SoC层面,GD
    发表于 10-31 07:39

    MCU无法检测到W5500是怎么回事?

    检测到W5500,在GD32F303和N32G457都显示为Wiznet chip not detected。 在三个MCU上用的都是同一个SPI接口,RST,INT,CS用的GPIO都是一样的,在三个BSP中修改的地方也是基本上一样的。 不知道各位有没有碰到类似的情况,
    发表于 10-14 07:38

    GD32的串口DMA收发数据失败怎么解决?

    我在使用RTT的GD32F303的BSP时,配置使用串口DMA收发(rt_device_open),发现错误,最终无法收发数据,对比了STM32的BSP发现在drv_usart.c中
    发表于 09-17 06:04

    GD32F437开发板添加lwip支持后ping不通电脑怎么解决?

    使用GD32F437的开发板,在studio中添加lwip的支持后,将开设置和电脑相同的网段,并用网线连接开发板和电脑,
    发表于 09-09 07:43

    九航星达CPCI6320型复合视频播放使用手册

    九航星达CPCI6320型复合视频播放使用手册
    发表于 07-11 15:46 4次下载

    STM32固件库使用手册的中文翻译版

    STM32固件库使用手册的中文翻译版
    发表于 06-09 22:38

    基于小凌RK2206开发板:OpenHarmony如何使用IoT接口控制FLASH外设

    1、实验简介本实验将演示如何在小凌-RK2206开发板上使用IOT库的FLASH接口,进行FLASH编程开发。例程将创建一个任务,实现FL
    的头像 发表于 04-22 14:49 684次阅读
    基于小凌<b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>:OpenHarmony如何使用IoT接口控制FLASH外设

    基于小凌RK2206开发板:OpenHarmony如何使用IoT接口控制UART外设

    1、实验简介本实验将演示如何在小凌-RK2206开发板上使用IOT库的UART接口,进行UART编程开发。例程将创建一个任务,通过配置UA
    的头像 发表于 04-22 14:22 783次阅读
    基于小凌<b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>:OpenHarmony如何使用IoT接口控制UART外设

    基于小凌RK2206开发板:OpenHarmony如何使用IoT接口控制GPIO中断

    1、实验简介本实验将演示如何在小凌-RK2206开发板上使用IOT库的GPIO中断模式,进行GPIO编程
    的头像 发表于 04-21 10:39 888次阅读
    基于小凌<b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>:OpenHarmony如何使用IoT接口控制GPIO<b class='flag-5'>中断</b>

    基于RV1126开发板按键测试方法与例程

    RV1126开发板按键测试方法与例程详细描述
    的头像 发表于 04-15 17:03 829次阅读
    基于RV1126<b class='flag-5'>开发板</b>的<b class='flag-5'>按键</b>测试方法与例程

    基于小凌RK2206开发板:OpenHarmony如何使用IoT接口控制ADC外设

    1、案例简介本案例主要讲解如何在小凌-RK2206开发板上使用IoT库的ADC接口,进行ADC编程开发。例程内容为创建一个任务,读取按键的ADC值,并打印到串口。例程源代码:http
    的头像 发表于 04-10 16:00 703次阅读
    基于小凌<b class='flag-5'>派</b>RK2206<b class='flag-5'>开发板</b>:OpenHarmony如何使用IoT接口控制ADC外设

    雷卯收集AI实验课程开发板

    收集目的:方便客户选用AI实验课程开发板,并且能够让AI实验课程开发板稳定工作。雷卯EMC小哥围绕AI实验课程
    的头像 发表于 04-02 12:14 545次阅读
    雷卯收集AI<b class='flag-5'>实验</b>课程<b class='flag-5'>开发板</b>

    STM32/GD32开发板基本串口RS232\\RS485通信及CAN接口 usbhid升级 U盘升级 sd卡升级升级学习方案开发板

    STM32F103/STM32F407/gd32F103/GD32F303开发板,例程用标准库开发
    发表于 02-27 14:56

    迅为RK3588开发板实时系统编译-Preemption系统/ Xenomai系统编译-选择摄像头配置

    上的接口如下所示。如果想要单独使用哪个接口开启对应的宏定义即可,注意只能单独使能单个摄像头。如果想要使用多个摄像头,请参考《【北京迅为】itop-3588开发板摄像头使用手册》。 更多内容可以关注迅为RK3588开发板-【北京
    发表于 01-18 10:15

    迅为iTOP-RK3588开发板商业级/工业级/国产化/国产化工业级/邮票孔版本以及LPDDR5版本性能首选

    ubuntu开发环境手册 22-itop-3588开发板linux代码编写查看环境搭建手册 24-itop-3588开发板ubuntu安装d
    发表于 12-06 11:15