SWM181 外部中断(EXTI)功能使用

news2024/9/24 21:28:25

SWM181 外部中断(EXTI)功能使用


  • 📌SDK固件包:https://www.synwit.cn/kuhanshu_amp_licheng/

  • 📖中断案例:
    在这里插入图片描述

  • 🌼开发板如下图:
    在这里插入图片描述

  • ✨注意新手谨慎选择作为入门单片机学习。

GPIO特性介绍

  • 每个 IO 均可触发中断。
  • 中断触发条件可配置,支持电平触发/沿触发。
  • 沿触发中断可配置为上升沿/下降沿/双沿触发。
  • 每个 IO 均支持上拉/下拉/开漏功能。

📑中断控制介绍

可根据需求将 GPIO 端口对应引脚配置为中断模式,并通过相关寄存器配置中断极性及触发方式。

  • 🔖触发方式分为边沿触发和电平触发两种模式。
  • 对于边沿触发中断,可以设置为上升沿触发,下降沿触发或双沿触发。中断发生后,标志位具备保持特性,必须通过软件对中断位进行清除
  • 对于电平触发中断,当外部引脚输入为指定电平时,中断发生。当电平翻转后,中断信号消失,无需软件进行清除。使用电平触发中断,需保证外部信号源保持电平稳定,以便有效中断电平能被端口识别.

📑外部中断相关库函数介绍

  • 🌿指定引脚外部中断初始化函数:EXTI_Init();
/****************************************************************************************************************************************** 
* 函数名称: EXTI_Init()
* 功能说明:	指定引脚外部中断初始化
* 输    入: GPIO_TypeDef * GPIOx	指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE
*			uint32_t n 		   指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
*			uint32_t mode	   有效值有EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL
* 输    出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void EXTI_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t mode)
{
	if(mode & 0x10)
	{
		GPIOx->INTLVLTRG |= (0x01 << n);			//电平触发
		
		if(mode & 0x01)
			GPIOx->INTRISEEN |= (0x01 << n);				//高电平触发
		else
			GPIOx->INTRISEEN &= ~(0x01 << n);				//低电平触发
	}		
	else
	{
		GPIOx->INTLVLTRG &= ~(0x01 << n);			//边沿触发
		
		if(mode & 0x02)
		{
			GPIOx->INTBE |= (0x01 << n);				//双边沿触发	
		}
		else
		{
			GPIOx->INTBE &= ~(0x01 << n);				//单边沿触发
			
			if(mode & 0x01)
				GPIOx->INTRISEEN |= (0x01 << n);			//上升沿触发
			else
				GPIOx->INTRISEEN &= ~(0x01 << n);			//下降沿触发
		}
	}
	
	EXTI_Clear(GPIOx, n);		//清除中断触发模式切换导致的中断标志
}

  • 🌿外部中断开启和关闭函数:EXTI_Open();EXTI_Close()
/****************************************************************************************************************************************** 
* 函数名称:	EXTI_Open()
* 功能说明:	指定引脚外部中断打开(即使能)
* 输    入: GPIO_TypeDef * GPIOx	指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE
*			uint32_t n 		   指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输    出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void EXTI_Open(GPIO_TypeDef * GPIOx, uint32_t n)
{
	GPIOx->INTEN |= (0x01 << n);
}

/****************************************************************************************************************************************** 
* 函数名称:	EXTI_Close()
* 功能说明:	指定引脚外部中断关闭(即禁能)
* 输    入: GPIO_TypeDef * GPIOx	指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE
*			uint32_t n 		   指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输    出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void EXTI_Close(GPIO_TypeDef * GPIOx, uint32_t n)
{
	GPIOx->INTEN &= ~(0x01 << n);
}

  • 🌿外设中断连接到内核中断IRQ0–IRQ31函数:IRQ_Connect()
/****************************************************************************************************************************************** 
* 函数名称: IRQ_Connect()
* 功能说明:	将外设中断连接到内核中断IRQ0--IRQ31
* 输    入: uint32_t periph_interrupt	指定外设中断,有效值见"SWM181_irqmux.h"
*			uint32_t IRQn		       	要连接到的内核中断号,有效值IRQ0_IRQ、IRQ1_IRQ、 ... ... IRQ30_IRQ、IRQ31_IRQ,
*										由于IRQ16--IRQ31每一个IRQ上可以连接两个外设中断,所以需要“按位或”上IRQ_INT0和IRQ_INT1来区分,并且
*										IRQ30_IRQ | IRQ_INT0 == IRQ30_IRQ,所以“按位或”IRQ_INT0可以省去
*			uint32_t priority	       	中断优先级,有效值0、1、2、3,数值越小优先级越高
* 输    出: 无
* 注意事项: 举例,IRQ_Connect(IRQ0_15_GPIOA1, IRQ6_IRQ, 0)					将GPIOA端口引脚1上的中断连接到IRQ6内核中断
*
*                 IRQ_Connect(IRQ16_31_UART0, IRQ18_IRQ | IRQ_INT0, 0)		将UART0中断连接到IRQ18内核中断的中断0上,它还可简化成
*				  IRQ_Connect(IRQ16_31_UART0, IRQ18_IRQ, 0)
*
*				  IRQ_Connect(IRQ16_31_SDADC, IRQ24_IRQ | IRQ_INT1, 0)		将SDADC中断连接到IRQ24内核中断的中断1上
******************************************************************************************************************************************/
void IRQ_Connect(uint32_t periph_interrupt, uint32_t IRQn, uint32_t priority)
{
	uint32_t INT1 = 0;
	__IO uint32_t * IRQ_SRC = &IRQMUX->IRQ0_SRC;
	
	if(IRQn > 0xFF)
	{
		INT1 = 1;
		
		IRQn -= 0x100;
	}
	
	if(IRQn <= IRQ15_IRQ)
	{
		IRQ_SRC = &IRQMUX->IRQ0_SRC + (IRQn - IRQ0_IRQ);
		*IRQ_SRC = periph_interrupt;
	}
	else
	{
		IRQ_SRC = &IRQMUX->IRQ16_SRC + (IRQn - IRQ16_IRQ);
		
		if(INT1 == 1)
		{
			*IRQ_SRC &= ~(0x1F << 5);
			*IRQ_SRC |= (periph_interrupt << 5);
		}
		else
		{
			*IRQ_SRC &= ~(0x1F << 0);
			*IRQ_SRC |= (periph_interrupt << 0);
		}
	}
	
	NVIC_SetPriority((IRQn_Type)IRQn, priority);
	
	NVIC_EnableIRQ((IRQn_Type)IRQn);
}

  • 🌿清楚中断标志位函数:EXTI_Clear()
/****************************************************************************************************************************************** 
* 函数名称:	EXTI_Clear()
* 功能说明:	指定引脚外部中断清除(即清除中断标志,以免再次进入此中断)
* 输    入: GPIO_TypeDef * GPIOx	指定产生外部中断的GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE
*			uint32_t n 		   指定产生外部中断的GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
* 输    出: 无
* 注意事项: 只能清除边沿触发中断的标志,电平触发中断的标志无法清除,只能在引脚电平不符合中断触发条件后硬件自动清除
******************************************************************************************************************************************/
void EXTI_Clear(GPIO_TypeDef * GPIOx, uint32_t n)
{
	GPIOx->INTCLR = (0x01 << n);
}
  • 🌿重写中断回调函数:IRQx_Handle(): IRQ0_Handler - IRQ31_Handler(具体参考startup_SWM181.s)

📝中断测试程序

/*
B8、B9、D0板载led
功能说明:按下接在PA6、PA14上的按键触发下降沿或低电平中断,
在在IRQx_Handler()中反转接在PB8、PD0上的LED亮灭状态。中反转接在PA5上的LED亮灭状态。
*/

#include "SWM181.h"


int main(void)
{	
	SystemInit();
	
	GPIO_Init(GPIOD, PIN0, 1, 0, 0, 0);			//输出,推挽模式,接LED
	GPIO_Init(GPIOB, PIN8, 1, 0, 0, 0);			//输出,推挽模式,接LED
	
	GPIO_Init(GPIOA, PIN6, 0, 1, 0, 0);			//输入,上拉使能,接KEY1
	GPIO_Init(GPIOA, PIN14, 0, 1, 0, 0);			//输入,上拉使能,接KEY2
//触发方式:EXTI_FALL_EDGE、EXTI_RISE_EDGE、EXTI_BOTH_EDGE、EXTI_LOW_LEVEL、EXTI_HIGH_LEVEL	
	EXTI_Init(GPIOA, PIN6, EXTI_LOW_LEVEL);		//下降沿触发中断
	EXTI_Init(GPIOA, PIN14, EXTI_FALL_EDGE);		//下降沿触发中断
	
	IRQ_Connect(IRQ0_15_GPIOA6, IRQ6_IRQ, 2);//将外设中断连接到内核中断IRQ6
	IRQ_Connect(IRQ0_15_GPIOA14, IRQ14_IRQ, 2);//将外设中断连接到内核中断IRQ14

	EXTI_Open(GPIOA, PIN6);//引脚外部中断打开
	EXTI_Open(GPIOA, PIN14);//引脚外部中断打开
	
	while(1)
	{
	}
}

void IRQ14_Handler(void)
{
	EXTI_Clear(GPIOA, PIN14);//请中断标志位
	
	GPIO_InvBit(GPIOD, PIN0);//电平反转
}
void IRQ6_Handler(void)
{
	EXTI_Clear(GPIOA, PIN6);//请中断标志位
	
	GPIO_InvBit(GPIOB, PIN8);//电平反转
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录-49-111.二叉树的最小深度

目录前言题目1.层序迭代思路2. 本题思路分析&#xff1a;3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 …

从功能测试进阶自动化测试涨薪10k,只用了1个月...

在开始正文前&#xff0c;先给大家一碗鸡汤&#xff1a;“你要坚信时间是不会辜负每一个努力付出的人&#xff0c;当你拥有一万次的训练和沉淀后&#xff0c;生活也会还你诗和远方。” 现在有很多人经常被“想要快速看到好的结果”的“快”思维裹挟着&#xff0c;稍微在短时间…

循环删除 List 中的元素

引用&#xff1a;https://mp.weixin.qq.com/s/j3k70kB3KPGO5ZKpOxJ4Pw 问题 比如有以下这个 List&#xff1a; public List<String> initList Arrays.asList("张三", "李四", "周一", "刘四", "李强", "李白&…

【微电网_储能】基于启发式状态机策略和线性程序策略优化方法的微电网中的储能研究【给定系统约束和定价的情况下】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

Share Creators确认参展GDC 2023,致力于解决游戏开发者数字资产管理难题

全球游戏行业年度盛会“2023 游戏开发者大会”&#xff08;Game Developers Conference&#xff0c;简称 GDC&#xff09;&#xff0c;是全球规模最大的游戏开发者盛会&#xff0c;将于 2023 年 3 月 20 至 24 日于美国旧金山举行。自 1988 年首次举办以来&#xff0c;本届 GDC…

Linux网络基础

目录 一.计算机网络背景 二、认识协议 三.OSI七层模型 四.TCP/IP五层(或四层)模型 五.网络传输基本流程 六.数据包封装和分用 七.网络中的地址管理 一.计算机网络背景 网络本质是一个层状结构&#xff0c;同时也是操作系统的一部分 网络发展 独立模式: 计算机之间相互…

学术速运|利用机器学习进行有机反应机理分类

​题目&#xff1a;Organic reaction mechanism classification using machine learning 文献来源: Nature | Vol 613 | 26 January 2023 | 691 代码&#xff1a;https://doi.org/10.48420/16965271 简介&#xff1a;对催化有机反应的机理的理解,有助于设计新的催化剂、反应…

微服务一 实用篇 - Docker安装

《微服务一 实用篇 - Docker安装》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《微服务一 实用篇 - Docker安装》《微服务一 实用篇 - Docker安装》0.安装Docker1.CentOS安装Docker1.1.卸载&#xff08;可选&#xff09;1.2.安装docker1.3.启动docker…

聚观早报|文心一言将于3月16日发布;字节Pico调低VR设备销售目标

今日要闻&#xff1a;百度「文心一言」将于3月16日发布&#xff1b;字节Pico调低VR设备销售目标&#xff1b;iPhone16Pro将采用屏下Face ID&#xff1b;京东低调重试前置仓卖菜业务&#xff1b;名创优品上季度净利增八成 百度「文心一言」将于3月16日发布 百度计划于 3 月 16 日…

DAGA : 基于生成方法的低资源标记任务数据增强 精读笔记

DAGA : 基于生成方法的低资源标记任务数据增强 精读笔记 文章目录DAGA : 基于生成方法的低资源标记任务数据增强 精读笔记1 Introduction2 BackgroundName Entity RecognitionPart-of-Speech (POS) TaggingTarget Based Sentiment Analysis3 Proposed Method3.1 Labeled Senten…

金三银四面试必备,“全新”突击真题宝典,阿里腾讯字节都稳了

前言招聘旺季就到了&#xff0c;不知道大家是否准备好了&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们Java程序员来说&#xff0c;多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知识点考…

长短记忆神经网络(LSTM,Long Short-Term Memory)

长短记忆神经网络定义 长短记忆神经网络&#xff08;Long-short term memory, LSTM&#xff09;是一种特殊的RNN结构。该神经网络可以有效保留历史信息&#xff0c;实现对文本的长期依赖信息进行学习。 关键问题&#xff1a;控制长期状态信息 解决方法&#xff1a;门控开关 门的…

在windows安装python3.11同时进行一个数据的练习

安装包百度网盘如下&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1l9H1GWP64LOxLaXXLie2uA?pwd6666 提取码&#xff1a;6666 1.我们选择自定义安装 2.当我们点了自定义安装后就直接next 3.修改路径&#xff0c;之后点击安装(install) 4.安装完成&#xff0c;进行…

南卡Neo骨传导运动耳机发布,重塑骨传导耳机舒适听感新体验!

近日&#xff0c;在骨传导耳机领域中最专业的南卡发布了今年全新系列——NEO&#xff0c;如果说南卡Runner Pro4的音质是偏向于节奏性&#xff0c;那么这款南卡NEO是更加偏向于沉稳性节奏&#xff0c;能够轻松征服轻运动场景&#xff0c;此系列在舒适度以及音质上&#xff0c;更…

3.3 利用群晖:群辉与PC电脑直连,实现万兆/2.5G速度文件互传(解决 直连后 网络/外网/网页 访问变慢,直连后群辉无网络 cloud sync无网络)

为黑群晖和电脑装备了万兆X540 T2网卡&#xff0c;为实现万兆速度的文件互传&#xff0c;决定将黑群晖直连PC&#xff0c;其需要注意的点有以下三点&#xff1a;修改PC和群辉的IPv4&#xff1a;为实现固定IP访问群辉&#xff0c;这里建议修改PC和群辉均为固定IP。1&#xff09;…

JS#3 事件监听

一. 简介事件:HTML事件是发生在HTML元素上的"事情"例如:按钮被点击鼠标移动到元素之上按下键盘按键事件监听: JavaScript 可以在事件被侦测到时执行代码二. 事件绑定事件绑定有两种方式方式一:通过HTML标签中的事件属性进行绑定方式二:通过DOM元素属性绑定代码<!D…

2.4 群辉驱动:多网口,系统网络只能识别两个网口 解决教程

所需工具下载&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1CMLl6waOuW-Ys2gKZx7Jgg?pwdchct提取码&#xff1a;chct安装的黑群晖华硕z490i主板自带一个i225 2.5G&#xff0c;后又插了一个4口8125B四口网卡&#xff0c;发现控制面板->网络->网络界面 只识别了其…

kafka入门到实战一(认识kafka)

kafka入门到实战一&#xff08;认识kafka&#xff09; 本次kafka的学习打算从三方面开始 认识kafka&#xff0c;掌握基础知识搭建kafka&#xff0c;为使用kafka创建条件使用kafka&#xff0c;基本的使用和解决顺序消费等问题 kafka消费流程 kafka大体消费流程&#xff1a;生…

webpack优化环境配置和webpack配置详解

目录 4 webpack优化环境配置 17 优化配置介绍 18 HMR 19 source-map 20 oneOf 21 缓存 22 tree shaking 23 code split (代码分割) 24 lazy loading 25 PWA 26 多进程打包 27 externals 28 dll 5 webpack配置详解 29 entry 30 output 31 module 32 resolve …

axios的二次封装

方式一&#xff1a;将axios单独分装到某个配置文件中import axios from axios; const axiosApi axios.create({baseURL:http://127.0.0.1:3000,timeout:3000 }) export default axiosApi在组件中使用:import $http from axios配置文件的地址 $http.get(/student/test).then(re…