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

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

3天内不再提示

【GD32F470紫藤派开发板使用手册】第三讲 EXTI-按键中断检测实验

聚沃科技 2024-05-05 09:22 次阅读
wKgaomYwSqiAY_PQAAnl063z3JE116.png

3.1实验内容

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

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

3.2实验原理

3.2.1NVIC中断向量控制器

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

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

wKgaomY23qOAEmmfAAG0vgy2_U4513.png

3.2.2EXTI中断原理

EXTI为外部中断/事件控制器,GD32F4xx系列MCU EXTI可以最多支持23个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。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

3.3硬件设计

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

3.4代码解析

3.4.1主函数代码解析

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

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

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

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

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

3.4.2按键中断回调函数

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

C
void USER_KEY_IRQHandler(typdef_gpio_general *KEYx_IO)
{
if(SET==bsp_key_state_get(&USER_KEY))
{
USER_KEY.press_timerms=PRESS_DOWN;
bsp_led_toggle(&LED2);
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 EXTI1_IRQHandler(void)
{
dvire_gpio_exti_handle(USER_KEY.key_gpio);
}

3.5实验结果

将本例程烧录到紫藤派开发板中,在液晶上首先将会打印Example of key interrupt detection.,之后按下USER_KEY按键后,将会打印:USER_KEYis pressed to trigger an interrupt.。

wKgaomY23w-AQAFRACT6Poexn24819.png

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

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

    关注

    447

    文章

    48126

    浏览量

    410775
  • 单片机
    +关注

    关注

    6008

    文章

    44039

    浏览量

    622405
  • 开发板
    +关注

    关注

    25

    文章

    4528

    浏览量

    94631
  • GD32
    +关注

    关注

    7

    文章

    350

    浏览量

    23783
收藏 人收藏

    评论

    相关推荐

    GD32F470紫藤开发板使用手册】第九讲 USART-printf打印实验

    通过本实验主要学习以下内容: 串口简介 GD32F470串口工作原理 使用printf打印信息
    的头像 发表于 05-13 10:14 648次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第九讲  USART-printf打印<b class='flag-5'>实验</b>

    GD32F470紫藤开发板使用手册】第十一讲 SPI-SPI NOR FLASH读写实验

    通过本实验主要学习以下内容: •SPI简介 •GD32F470 SPI简介 •SPI NOR FLASH——GD25Q32ESIGR简介 •使用GD32F470 SPI接口实现对
    的头像 发表于 05-17 09:57 588次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十一讲 SPI-SPI NOR FLASH读写<b class='flag-5'>实验</b>

    使用GD32F470编译drv_adc.c时报错怎么解决?

    使用GD32F470芯片,编译drv_adc.c时报错好几个编译错误,可能是适配GD32F470芯片没有适配好。 编译问题如下图:
    发表于 02-23 06:55

    这是DE2开发板使用手册

    DE2开发板使用手册,有兴趣的人可以下载看一下
    发表于 06-03 17:58

    QC-CPLD开发板快速使用手册

    `QC-CPLD开发板快速使用手册.pdf`
    发表于 10-06 08:11

    FPGA开发板快速使用手册

    QC-FPGA-C1开发板快速使用手册.pdf感兴趣的可以看看0
    发表于 10-07 09:24

    【零基础学习STM32】第三讲EXTI中断输入实验——读取ARM按键状态

    原理图 在iCore3双核心开发板中,采用一个独立的按键与STM32F407的GPIO相连,另一端接地,且PH15外接一个1k电阻大小的上拉电阻。
    发表于 02-02 21:59

    迅为iMX6ULL开发板使用手册资料下载

    开发板使用手册》第一部分 开发板入门第二部分 开发环境搭建第三部分 Linux系统编译第四部分 QT
    发表于 12-02 14:13

    按键中断实验概述

    按键中断实验概述1.1 资源概述开发板:正点原子STM32F103zet6精英开发板控芯片型号:
    发表于 01-11 08:08

    现有的BSP工程可以直接在GD32F470上进行开发

    大家好:有关于GD32F470的BSP工程的问题咨询,我在GD官网上查照资料了解470和450是很相似的,目前因为项目需要使用的470芯片,想使用rt-thread的操作系统,但是不知
    发表于 08-01 10:39

    YL-51开发板使用手册

    YL-51开发板使用手册,YL-51开发板使用手册YL-51开发板使用手册YL-51
    发表于 05-10 16:31 18次下载

    开发板烧写测试使用手册

    开发板烧写测试使用手册,有需要的下来看看
    发表于 06-03 14:30 0次下载

    STC15单片机实战项目软件开发第三讲 - 按键检测(外部中断)

    STC15单片机实战项目软件开发第三讲 - 按键检测(外部中断)
    发表于 11-22 15:06 16次下载
    STC15单片机实战项目软件<b class='flag-5'>开发</b><b class='flag-5'>第三讲</b> - <b class='flag-5'>按键</b><b class='flag-5'>检测</b>(外部<b class='flag-5'>中断</b>)

    GD32F470紫藤开发板使用手册】第六讲 TIMER_3路PWM输出实验

    通过本实验主要学习以下内容: TIMER PWM输出原理 TIMER 定时中断
    的头像 发表于 05-08 09:20 131次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第六讲  TIMER_3路PWM输出<b class='flag-5'>实验</b>

    GD32F470紫藤开发板使用手册】第十讲 USART-中断串口收发实验

    通过本实验主要学习以下内容: •使用中断进行串口收发
    的头像 发表于 05-14 10:39 140次阅读
    【<b class='flag-5'>GD32F470</b><b class='flag-5'>紫藤</b>派<b class='flag-5'>开发板</b><b class='flag-5'>使用手册</b>】第十讲 USART-<b class='flag-5'>中断</b>串口收发<b class='flag-5'>实验</b>