GD32F103单片机-EXTI外部中断

news/2024/9/21 17:16:49 标签: 单片机, GD32, EXTI

GD32F103单片机-EXTI外部中断

  • 一、EXTI及NVIC介绍
  • 二、编程实验
    • 2.1 相关库函数
    • 2.2 实验代码

EXTINVIC_1">一、EXTI及NVIC介绍

  • GD32和STM32的EXTI基本相似,具体见STM32F1单片机-外部中断
  • GD32EXTI包括20个相互独立的边沿检测电路请求产生中断或事件,4位优先级配置寄存器16个优先等级
  • GD32EXTI三种触发方式上升沿下降沿任意沿触发
  • 如下图为EXTI框图,通过EXTI_Line0-19(IO的16个管脚和内部模块的4根线)一共20条线路进入到边沿检测,或通过软件触发,最终通过中断屏蔽控制(挂起标志位-指示有中断发生,不意味着中断处理已经完成)到NVIC产生中断或者产生事件

在这里插入图片描述

  • 下图为EXTI触发源对应表

在这里插入图片描述

二、编程实验

2.1 相关库函数

  • 下面是GD32F103关于EXTI和NVIC相关的库函数
void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin);//外部中断源引脚选择
void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type);//外部中断初始化,通道,极性选择
void exti_interrupt_enable(exti_line_enum linex);//外部中断使能
FlagStatus exti_flag_get(exti_line_enum linex);//外部中断挂起标志位获取,指示有中断发生,不意味着中断处理已经完成
void exti_flag_clear(exti_line_enum linex);//清楚外部中断挂起标志位
FlagStatus exti_interrupt_flag_get(exti_line_enum linex);//外部中断标志位获取
void exti_interrupt_flag_clear(exti_line_enum linex);//清除外部中断标志位
void nvic_priority_group_set(uint32_t nvic_prigroup);//配置NVIC优先级分组
void nvic_irq_enable(uint8_t nvic_irq, uint8_t nvic_irq_pre_priority, uint8_t nvic_irq_sub_priority);//初始化NVIC,中断通道,抢占优先级和子优先级(响应优先级)
//中断服务函数入口在:startup_gd32f10x_md.s中
//枚举中断号IRQn在gd32f10x.h中

2.2 实验代码

  • 外部中断基本步骤如下:开启GPIO、AFIO时钟初始化GPIO外部中断引脚选择初始化EXTI和NVIC使能EXTI — 进入EXTI中断服务函数(判断中断标志位)
  • 使用触摸按键去模拟外部中断,触摸按键原理图如下所示
  • TTP223作为一款触摸检测IC、提供一个触摸按键,OUT_1接到PA0
  • Q是CMOS输出引脚、VS是接地,VDD电源,I是触摸输入,AHLB是输出有效选择(0表示高电平有效1表示低电平有效),TOB是输出模式选择(0表示直接模式1表示触发模式)。所以本图中表示的是直接模式低电平有效输出

在这里插入图片描述

  • 触摸按键部位有个感应电容,当触摸到按键部分时,会与C13电容并联使得输入I的电容变大,OUT_1输出低电平,松手时,OUT_1输出高电平,触摸期间一直输出低电平
    在这里插入图片描述
  • 实验内容:按下触摸按键A,实现LED的状态反转
  • 下面是My_EXTI.c
  • 中断服务函数不需要声明,main函数调用LED、EXTI初始化函数即可
#include "gd32f10x.h"                   // Device header
#include "LED.h"

/*
@brief:初始化EXTI
@param:无
@retval:无
*/
void My_EXTI_Init()
{
	rcu_periph_clock_enable(RCU_GPIOA);
	rcu_periph_clock_enable(RCU_AF);	//开启GPIOA,AFIO时钟
	gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0);//PA0上拉输入
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_0);//AFIO设置PA0为EXTI触发源
	exti_init(EXTI_0,EXTI_INTERRUPT,EXTI_TRIG_FALLING);//通道0,下降沿触发外部中断
	exti_interrupt_enable(EXTI_0);//使能EXTI
	nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);//NVIC分组
	nvic_irq_enable(EXTI0_IRQn,1,1);//配置NVIC,中断通道,抢占和子优先级为1
}

/*
@brief:EXTI中断服务函数
@param:无
@retval:无
*/
void EXTI0_IRQHandler()
{
	if(exti_interrupt_flag_get(EXTI_0) == SET)//判断中断标志位
	{
		LED1_Turn();
		exti_interrupt_flag_clear(EXTI_0);//清除中断标志位
	}
}

http://www.niftyadmin.cn/n/5669142.html

相关文章

漏洞——CVE简介

1、什么是CVE CVE (Common Vulnerabilities and Exposures)(常见漏洞与暴露)是一个标准化的命名系统,用于识别和描述公开披露的网络安全漏洞。CVE 的目的是为漏洞提供唯一的标识符,使安全专家、软件供应商和用户能够统一参考和讨…

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

java集合(1)

引入 我们我们保存多个数据时大多是使用数组,但数组有许多不足之处 数组的长度必须在开始时指定,而且长度一旦确定便不能修改保存的必须为同一类型的元素数组增加/删除元素较麻烦 //数组扩容 int[] num1 new int[1]; num1[0]1;//创建数组并赋值 int[]…

Python Web应用的可扩展性与高可用性设计

Python Web应用的可扩展性与高可用性设计 目录 🌟 水平扩展与垂直扩展📈 基于 Kubernetes 的自动扩展策略💾 数据库主从复制与读写分离🛠 分库分表的设计与实现🔗 分布式系统中的一致性问题(CAP理论&…

android 14分屏实战之小米su7的3分屏实现方案讨论及线索征集

背景: hi,粉丝朋友们: 近来有学员朋友询问到了马哥一个问题关于小米su7的分屏实现方案问题,具体小米su7的实现现象如下: 具体源头视频详细地址:https://www.bilibili.com/video/BV1UK421a7iB 针对小米su…

模板字符串中定义方法并传参

遇到一个使用js es6的模板字符串进行事件绑定和传参的问题,这个问题的引起是因为使用innerHTML插入了一大串html并进行事件的绑定和传参。 以react为例,写一个demo记录一下 模板字符串中写方法的话需要用onclick来定义,传参需要这么写${char…

网络编程练习:UDP聊天室

【1】服务器代码 #include <stdio.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in…

uboot:源码分析-启动第一阶段-start.S解析

start.S引入 进入start.S文件中&#xff0c;发现57行中就是_start标号的定义处 SourceInsight中添加行号 在SI中&#xff0c;如果我们知道我们要找的文件的名字&#xff0c;但是我们又不知道他在哪个目录下&#xff0c;我们要怎样找到并打开这个文件&#xff1f;方法是在SI中先…