EXIT(1)

news2024/11/20 20:18:27

EXTI介绍

在这里插入图片描述
EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下
那么是否有第二种方式检测按键是否被按下了呢?
通过EXTI 当EXTI检测到按键的电平发生变化 就会触发一个中断 送到NVIC进行相应的处理 就会触发相应的中断函数
在这里插入图片描述

EXTI的工作原理

EXTI的作用就是检测外部信号的变化由此产生中断
在这里插入图片描述
首先外部输入一个信号 信号有上升沿和下降沿 经过边路检测分为上升沿和下降沿还有双边沿三路信号 通过边沿的选择选择是哪路信号传入下一个的或门 (这里举例的是边沿选择选择的是上升沿)进入到或门后要看中断是否屏蔽如果没有屏蔽就接着往下传输 到脉冲位产生中断 看中断挂起 脉冲置为为1 无法自己清零 需要手动清零手动清零后电平型中断就为0 还有上升沿信号传入后还可以变为事件

事件

在这里插入图片描述
中断的模型就是片上外社产生一个中断传输到NVIC(CPU内)然后进行中断仲裁 然后通过后执行相应的中断函数 有CPU的参与
事件就是外部产生一个终端信号给与EXTI产生事件给部件将部件从睡眠模式中唤醒 不需要CPU的介入
在这里插入图片描述
检测多路信号 就是多个这样的结构同时检测多路信号的输入
EXTI的20路信号有什么用?
1.让所有IO具备触发中断的能力
在这里插入图片描述
EXTI具有19个通道 一个通道对应abcde…的第0个io口 依次类推所有的io口都连接到了EXTI上都具备了触发中断的能力 当每一个 如PA0口连接到EXTI0时其他都不能连接了
只用EXTI的16个通道作为IO引脚的触发 其他四个通道具有特殊的功能
在这里插入图片描述

EXTI的寄存器组

在这里插入图片描述
每一列对应的都是一个通道 TP0这一列对应的就是第1个通道

在这里插入图片描述
这里以EXTI0为列子 如果想上升沿TR0就写1 (上面) 下面的TR0就写0 如果想双沿触发就全部写1
在这里插入图片描述
中断屏蔽寄存器对应着开关 对应的通道的寄存器位写0就断开 写1就闭合事件屏蔽寄存器也是如此

EXTI的编程接口

在这里插入图片描述
第一个line参数是要哪一个EXTI的通道 第二个参数Mode是要什么模式 是中断模式 触发中断 传输到NVIC还是要事件模式 唤醒部件 第三个参数Trigger什么触发模式 上升还是下降还是双边 第四个参数linecmd是 是否要开启中断或者事件屏蔽如果选择的是事件模式就是控制下面的事件屏蔽开关 如果选择的是中断模式那么控制的就是上面的中断屏蔽开关
声明一个结构体变量 然后填表把相应的值填进去

在这里插入图片描述
第一个函数EXTI_Init是上面的函数 第二个函数Generate 返回值是空 传入的值是通道号(后面的也是如此) 通过调用这个函数(编程接口)可以产生软件中断就是在软件触发哪里可以产生一个脉冲信号触发一个中断在这里插入图片描述
第三个函数getflag 获取标志位的值 1位set 0为reset 会返回值1或者0在这里插入图片描述
第四个函数clearflag是清除标志位当信号传输到中断挂起位置时候产生的是一个电平型的信号 需要手动清零
在这里插入图片描述
第五个函数getstatus 是需要中断屏蔽和中断挂起为1才会为1(需要使能这个中断同时出触发这个中断)同样也会返回值 0或者1 reset或set
最后一个函数同样也是清除标志位 但是会经常用的就是这个函数 这个函数和第三个完全一样 但是由于名字会经常使用这个函数清除标志位

按钮编程实验

在这里插入图片描述
回忆一下之前按钮的编程时使用while语句一直检测previous(之前的电平)和current(当前的电平)的值然后判断两个值是否相等来判断按键是否按下或松开(按键按下或者松开previous和current的值都不会相同) 一直循环的去检测两个值 使用中断来实现按键编程
选择上升沿触发 因为我们要按键松开才该改变灯的电平就是从0电位到1电位 是一个上升沿 然后要使用PA0 PA1两个IO口所以EXTI要使用EXTI0和EXTI1两个通道
编程思路梳理
在这里插入图片描述
首先要使用按钮就要初始化两个io端口 然后要配置AFIO使得端口PA0和PA1连接到EXTI0 和EXTI1(也就是EXTI的IO映射)
在这里插入图片描述
然后EXTI0和EXTI1会分别产生两路中断传输到NVIC 接着配置NVIC
在这里插入图片描述
先配置中断屏蔽先把开关打开 然后配置中断优先级 配置几个位给抢占优先级和子优先级
(红色虚线的位置)

EXTI的IO映射

在这里插入图片描述
EXTI通道初始化
在这里插入图片描述
如果自己填
在这里插入图片描述

去头文件中搜这个结构体 EXTI_InitTypeDef在头文件中找每一个要填表的值 搜索后面的ctrl+f搜索填入表中每一行对应的值如第一行在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/f1daeb5f597a4f7aa7ff35668528fd24.png)

在这里插入图片描述
中断函数的名称要在stm32中启动文件中寻找
在这里插入图片描述
这就是个弱方法 就是先占名然后用重名的函数覆盖掉
在这里插入图片描述
点灯就是写0就亮起 写1就熄灭

#include "stm32f10x.h"
#include "stm32f10x_pal.h"

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	PAL_Init();
	
	// 1. 初始化IO引脚
	// 将PA0和PA1分别设置为输入上拉模式
	// 开启GPIOA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// PA0, PA1
	GPIO_InitTypeDef GPIOInitStruct;
	GPIOInitStruct.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIOInitStruct);
	
	// 2. 配置EXTI的引脚映射
	// 开启AFIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	// PA0 -> EXTI0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
	// PA1 -> EXTI1
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
	
	// 3. 初始化EXTI
	// 3.1. 初始化EXTI0
	EXTI_InitTypeDef EXTIInitStruct;
	EXTIInitStruct.EXTI_Line = EXTI_Line0;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	// 3.2. 初始化EXTI1
	EXTIInitStruct.EXTI_Line = EXTI_Line1;
	EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
	EXTIInitStruct.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTIInitStruct);
	
	// 4. 初始化NVIC
	NVIC_InitTypeDef NVICInitStruct;
	// 4.1. EXTI0
	NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	// 4.2. EXTI1
	NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;
	NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;
	NVICInitStruct.NVIC_IRQChannelSubPriority = 0;
	NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVICInitStruct);
	
	// 5. 初始化PC13
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // Open-drain
	GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOC, &GPIOInitStruct);
	
	while(1)
	{
	}
}

void EXTI0_IRQHandler(void)
{
	// 清除中断
	EXTI_ClearITPendingBit(EXTI_Line0);
	// 点亮LED PC13 <- 0
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}

void EXTI1_IRQHandler(void)
{
	// 清除中断
	EXTI_ClearITPendingBit(EXTI_Line1);
	
	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}

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

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

相关文章

找工作的网站都有哪些

吉鹿力招聘网作为一家知名的招聘网站&#xff0c;因其功能完善和用户隐私保护而备受用户青睐。它不仅可以与企业直接沟通&#xff0c;还可以提供在线聊工作的机会。通过吉鹿力招聘网&#xff0c;用户可以自主选择工作地点、时间和工作类型&#xff0c;大大提高了找到合适工作的…

扫码连接WiFi微信小程序项目(带源码下载)

微信小程序扫码连wifi(共享wifi)(WiFi地推项目)&#xff0c;2023年非常火爆全网的项目 下载: 项目源码 效果图如下 一 扫码连接WiFi如何收益 用户扫码连接WiFi时会有4-15秒的广告弹框,有效时间看完后微信会发送给项目负责人0.5-1元的广告费 (如给1元) 项目负责人(团长)(收益2…

AI主播“败走”双11,想用AI省成本的商家醒醒吧,程序员不必担心失业,发展空间依旧很大

目录 1 2 3 “AI人”并不算是新鲜事&#xff0c;随着AI的发展&#xff0c;AI主播也开始悄悄进入到直播间中。 持续无间断的直播、比人工费便宜等优势&#xff0c;让很多商家选择了AI主播。 AI主播到底好不好用&#xff1f;终于在今年“双11”现出了原形。 1 AI主播没火过半年…

代码随想录算法训练营|五十一天

最长递增子序列 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 递推公式&#xff1a; 有点像双指针的操作&#xff0c;例如{2,5,6,4,3}&#xff08;写不出来&#xff0c;画图&#xff09; public class Solution {public int LengthOfLIS(int[] nums) {if (n…

计算机视觉:使用opencv实现银行卡号识别

1 概述 1.1 opencv介绍 OpenCV是Open Source Computer Vision Library&#xff08;开源计算机视觉库&#xff09;的简称&#xff0c;由Intel公司在1999年提出建立&#xff0c;现在由Willow Garage提供运行支持&#xff0c;它是一个高度开源发行的计算机视觉库&#xff0c;可以…

接口测试--知识问答

1 做接口测试当请求参数多时tps下降明显&#xff0c;此接口根据参数从redis中获取数据&#xff0c;每个参数与redis交互一次&#xff0c;当一组参数是tps5133&#xff0c;五组参数是tps1169&#xff0c;多次交互影响了处理性能&#xff0c;请详细阐述如何改进增进效果的方案。 …

如果让你重新开始学 C/C++,你的学习路线会是怎么选择?

1. 第一阶段 学好 C 语言和 Linux 1.1 学好 C 语言 无论你是科班还是非科班&#xff0c;建议你一定要学好 C 语言&#xff0c;它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法&#xff0c;包括&#xff1a; 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用…

JTS: 19 IndexedPointInAreaLocator 判断是否在点在面的内部

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.locate.IndexedPointInAreaLocator; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom…

【Spring Boot】035-Spring Boot 整合 MyBatis Plus

【Spring Boot】035-Spring Boot 整合 MyBatis Plus 【Spring Boot】010-Spring Boot整合Mybatis https://blog.csdn.net/qq_29689343/article/details/108621835 文章目录 【Spring Boot】035-Spring Boot 整合 MyBatis Plus一、MyBatis Plus 概述1、简介2、特性3、结构图4、相…

关于ruoyi(若依)框架的介绍,若依项目的入门,ruoyi(若依)框架的优缺点

一&#xff0c;关于ruoyi&#xff08;若依&#xff09;框架的介绍 若依&#xff08;Ruoyi&#xff09;框架是一款基于 Spring Boot 2.5.5、Spring Cloud 2020.0、OAuth2 与 JWT 鉴权等核心技术&#xff0c;同时也支持Spring Security、Apache Shiro 等多种安全框架&#xff0c;…

C# 智慧医学实验室LIS系统源码,支持预制条码和即时打印条码;支持单工/双工数据采集;支持TAT监测与分析;具备检验智能审核功能,支持自定义多级审核规则

C#医院检验信息管理系统源码&#xff0c;智慧医学实验室LIS系统源码&#xff0c;云LIS系统源码 医院检验信息管理系统&#xff0c;利用计算机网络技术、数据存储技术、快速处理技术&#xff0c;对检验科进行全方位信息化管理&#xff0c;使检验科达到自动化运行&#xff0c;信息…

C++编写的多线程自动爬虫程序

以下是一个使用C编写的爬虫程序&#xff0c;用于爬取Python进行多线程跑数据的内容。本示例使用了Python的requests库来发送HTTP请求&#xff0c;并使用cheeseboy的爬虫ipIP库来设置爬虫ip信息。以下是详细代码和步骤&#xff1a; #include <iostream> #include <stri…

深度学习 机器视觉 人脸识别系统 - opencv python 计算机竞赛

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

1003:两个整数的四则运算

题目描述&#xff1a;输入两个整数num1和num2&#xff0c;请你设计一个程序&#xff0c;计算并输出它们的和、差、积、整数商及余数。 输入&#xff1a;输入只有两个正整数num1、num2。 输出&#xff1a;输出占一行&#xff0c;包括两个数的和、差、积、商及余数&#xff0c;数…

为什么打开idea时,没有启动页面,如何解决?

更新idea2021.2后&#xff0c;当双击idea打开时&#xff0c;发现没有启动界面&#xff0c;直接进入IDEA界面&#xff0c;中间等待时间&#xff0c;让人误以为没有打开idea成功&#xff0c;使得多次点击idea图标。 解决方案就是 在idea界面菜单栏中找到帮助&#xff08;Help)&a…

在Spring Boot中使用进程内缓存和Cache注解

在Spring Boot中使用内缓存的时候需要预先知道什么是内缓存&#xff0c;使用内缓存的好处。 什么是内缓存 内缓存&#xff08;也称为进程内缓存或本地缓存&#xff09;是指将数据存储在应用程序的内存中&#xff0c;以便在需要时快速访问和检索数据&#xff0c;而无需每次都从…

「NLP+网安」相关顶级会议期刊 投稿注意事项+会议等级+DDL+提交格式

「NLP网安」相关顶级会议&期刊投稿注意事项 写在最前面一、会议ACL (The Annual Meeting of the Association for Computational Linguistics)IH&MMSec (The ACM Workshop on Information Hiding, Multimedia and Security)CCS (The ACM Conference on Computer and Co…

腾讯云新客户服务器88元/年,540元/3年,另有5年新用户服务器

在选择云服务器时&#xff0c;首先需要考虑的是性能与配置是否与自己的需求相匹配。对于小型网站或者个人博客&#xff0c;轻量应用服务器是一个不错的选择。腾讯云双十一活动中&#xff0c;2核2G轻量应用服务器的活动优惠价为88元/年&#xff0c;2核4G轻量应用服务器的活动优惠…

接口自动化测试流程、工具及其实践!

01、接口自动化测试简介 接口自动化测试是指通过编写脚本或使用自动化工具&#xff0c;对软件系统的接口进行测试的过程。接口测试是软件测试中的一种重要测试类型&#xff0c;主要用于验证系统组件之间的通信和数据交换是否正常。通过接口自动化测试可以快速发现接口中的问题…

【Linux】第十六站:进程地址空间

文章目录 一、程序地址空间1.内存的分布2.static修饰后为什么不会被释放3.一个奇怪的现象 二、进程地址空间1.前面现象的原因2.地址空间究竟是什么&#xff1f;3.为什么要有进程地址空间4.页表5.什么叫进程&#xff1f;6.进程具有独立性。为什么&#xff1f;怎么做到呢&#xf…