stm32的EXTI的初始化-学习笔记

简介:

        最近在学习stm32外设的过程中,学到EXTI这个外设的时候,感觉有点复杂,虽然是hal库开发,但是不明白所以,所以跟着也野火的教程,一遍看寄存器,一边看hal库的例子,写一篇记录在此,以备查阅。以下叙述思路:

①EXTI功能框图是最重要的,因为不仅仅可以大致看出配置流程,还能看出寄存器的控制过程。

②GPIO的初始化

③AFIO和CR1/2/3/4寄存器和EXIT0-15的映射关系,这个可以在参考手册AFIO章节中看

④NVIC的初始化

实验目的:通过按下按键1产生中断,然后中断服务函数执行让PB0的电平灯翻转一次,中断服务函数自己随便写,也可以发送一串字符到UART1上。目的是知道按键按下后,单片机收到按键按下的信号后到执行中断服务函数这中间的逻辑过程。

平台:野火的指南者开发板

实验原理图如下:按下KEY1,LED1亮一次,再按一次LED1灭。

一、EXTI功能框图

        这张图在参考手册的EXTI章节,此处用野火的图便于叙述。看图顺序从右到左。

首先可以看到红色的线和绿色的两条线,下面简单记录一下处理逻辑和目的。

红色线:①处引脚被外部控制产生电平变化,从而EXTI通知NVIC执行中断服务函数。

绿色线:①处引脚被外部控制产生电平变化,从而EXTI通知⑦脉冲发生器,产生高低脉冲,通知ADC、TIM等外设动作。

中断和事件区别:产生中断是为了执行中断服务函数,产生事件是为了通知其他外设动作。

        此次实验配置红色线,PA0连接的Key1,故将PA0配置成EXTI的输入源,产生中断,通知NVIC,然后执行中断服务函数,翻转PB0上的电平从而控制LED灯的亮灭。

EXTI的初始化代码如下:

	EXTI_InitStruct.EXTI_Line = EXTI_Line0;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);	

二、AFIO的CRx寄存器与GPIO引脚的对应关系

        如上图复用IO口AFIO的4个控制寄存器CR可以将GPIO的16个引脚配置成EXTI的16个输入源。即GPIOA的pin0对应EXTI0,pin15对应EXTI15。初始化代码如下。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

三、NVIC的初始化

        NVIC配置寄存器的工作已经由NVIC_Init函数做了,我们只需要传入可变的参数的即可,主要是配置中断源和中断源的抢断优先级、子优先级。初始化代码如下。

	NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);

四、实验

实验目的和拓扑图如下:按下KEY1,LED1亮一次,再按一次LED1灭。

实验原理:配置PA0为EXTI的中断源,按下KEY1,PA0上电平被拉高,此时产生一个上升沿中断信号,EXTI通知NVIC执行中断服务函数,服务函数中就将PB0的电平拉低,则LED亮,再按一次,第二次中断来了,中断服务函数将PB0电平拉高,LED灯灭。

代码逻辑

①先将PB0初始化为普通的IO口,即推挽输出模式,由单片机控制PB0的电平变化。

②将PA0初始化为浮空输入模式,由外部控制PA0的电平。

③将配置AFIO将PA0初始化为EXTI的中断源EXTI0

④将EXTI初始化为中断模式,而非事件模式,来源LINE_0。

⑤将NVIC的中断源配置为EXTI0。

⑥写EXTIO的中断服务函数,将PB0的电平反转一次。

完整的代码如下,写在一个C文件里面方便大家阅读。

#include "stm32f10x.h"void LED_GPIO_Config(void);
void GPIOA_Init(void);
void AFIO_Init(void);
void __EXIT_Init(void);
static void __NVIC_Init(void);
void EXTI0_IRQHandler (void);int main(void)
{LED_GPIO_Config();//第一步初始化PB0为推挽输出模式GPIOA_Init();//第二步初始化PA0为浮空输入模式AFIO_Init();//第三步通过AFIO将PA0初始化为EXTI的中断源EXTI0__EXIT_Init();//第四步将EXTI的中断源配置为EXIT0和中断模式__NVIC_Init();//第四步将EXTI的中断源配置为EXIT0和中断模式while(1){}
}//第一步初始化PB0为推挽输出模式
void LED_GPIO_Config(void)
{GPIO_InitTypeDef  GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);	
}//第二步初始化PA0为浮空输入模式
void GPIOA_Init(void)
{GPIO_InitTypeDef  GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;		GPIO_Init(GPIOA, &GPIO_InitStruct);	}//第三步通过AFIO将PA0初始化为EXTI的中断源EXTI0
void AFIO_Init(void)
{// 初始化EXTIRCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
}//第四步将EXTI的中断源配置为EXIT0和中断模式
void __EXIT_Init(void)
{EXTI_InitTypeDef  EXTI_InitStruct;EXTI_InitStruct.EXTI_Line = EXTI_Line0;EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTI_InitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStruct);	
}//第五步将NVIC的中断源配置为EXTI0,和中断优先级
static void __NVIC_Init(void)
{NVIC_InitTypeDef NVIC_InitStruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);
}//第六步将PB0的电平取反,来一次中断取反一次。
void EXTI0_IRQHandler (void)
{if(EXTI_GetITStatus(EXTI_Line0) != RESET){GPIOB->ODR ^= GPIO_Pin_0;}EXTI_ClearITPendingBit(EXTI_Line0);
}

代码中的宏,只要包含了stm32f10x.h头文件均可以使用,都定义在了hal库的各个文件中。

编译下载之后,代码实现了按下key1灯亮,再按灯灭的功能,达到实验目的。

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

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

相关文章

web学习笔记(三十)

目录 1.jQuery选择器 2. jQuery祖宗的相关方法 3.jQuery子代的相关方法 4.jQuery同胞的相关方法 5.jQuery的class类操作 6.jQuery动画 6.1显示show()和hide() 6.2滑入slideDown()和滑出slideUp() 6.3淡入fadeIn()和淡出fadeOut() 7.自定义动画 animate() 1.jQuery选…

QT使用RabbitMQ

文章目录 1.RabbitMQ 客户端下载地址:1.1RabbitMQ基本结构:2.搭建RabbitMQ server3.安装步骤4.运行4.1 报错问题解决5.使用5.1 配置Web管理界面6.常用命令总结7.Qt客户端编译7.1 这里重点强调一下,这个文件需要改成静态库7.2 下载地址:(qamqp自己下载,下载成功后,静态编译…

如何解决循环依赖

在Spring框架中,Bean的创建与管理是通过Spring容器进行的,而Spring容器在创建和管理Bean时使用了三级缓存(three-level cache)机制,以提高性能并避免重复创建相同的Bean。这三级缓存分别是singletonObjects、earlySing…

Linux 安装使用 Docker

目录 一、前提卸载命令:执行情况: 二、安装 Docker1. 通过仓库进行安装(在线方式)1.1 设置存储库1.2 查看可安装版本1.3 安装 Docker1.4 启动 Docker1.5 验证是否成功 2. 通过 RMP 包安装(离线方式)2.2 安装…

Echarts+Vue 首页大屏静态示例Demo 第四版 支持自适应

效果: 源码: <template><ScaleScreenclass="scale-wrap":selfAdaption="true":autoScale="true":class="{ fullscreen-container: isFullScreen }"><div class="bg"><dv-loading v-if="loading&…

SeaTunnel-web in K8S

下载&#xff0c;官网下载有问题&#xff0c;上dlcdn.apache.org下载 https://dlcdn.apache.org/seatunnel/seatunnel-web/1.0.0/apache-seatunnel-web-1.0.0-bin.tar.gz apache-seatunnel-2.3.3中执行bin/install-plugin.sh下载connectors 下载web的源码 https://github.co…

LeetCode - 和为K的子数组

LCR 010. 和为 K 的子数组 看到这道题的时候&#xff0c;感觉还挺简单的&#xff0c;找到数组中和为k的连续子数组的个数&#xff0c;无非就是一个区间减去另一个区间的和等于k&#xff0c;然后想到了用前缀和来解决这道问题。再算连续子数组出现的个数的时候&#xff0c;可以使…

系统学习Python——装饰器:“私有“和“公有“属性案例-[使用伪私有、破坏私有和装饰器权衡]

分类目录&#xff1a;《系统学习Python》总目录 使用伪私有 除了泛化&#xff0c;这个版本还使用了Python的_X伪私有保持不变混合功能&#xff0c;通过将这个类的名称自动作为其前缀&#xff0c;就可以把wrapped属性局部化为代理控制类的变量。这避免了上一版本与一个真实的被…

DJI RONIN 4D变0字节恢复案例

RONIN 4D这个产品听起来比较陌生&#xff0c;还是DJI大疆出品。没错&#xff0c;这是大疆进军影视级的重点明星机型。前阵子刚处理过大疆RONIN 4D的修复案例&#xff0c;下边这个案例是和exfat有关的老问题:文件长度变成0字节。 故障存储:希捷18T /MS Exfat文件系统。 故障现…

uniapp实现点击选项跳转到应用商店进行下载

uni-app 中如何打开外部应用&#xff0c;如&#xff1a;浏览器、淘宝、AppStore、QQ等 https://ask.dcloud.net.cn/article/35621 Android唤起应用商店并跳转到应用详情页 兼容处理多个应用商店的情况 https://juejin.cn/post/6896399353301516295 如何查看market://detail…

如何借助CRM系统获得直观的业务洞察?CRM系统图表视图解析!

Zoho CRM管理系统在优化客户体验方面持续发力&#xff0c;新年新UI&#xff0c;一波新功能正在赶来的路上。今天要介绍的新UI功能在正式推出之前&#xff0c;已经通过早鸟申请的方式给部分国际版用户尝过鲜了。Zoho CRM即将推出图表视图&#xff0c;将原始数据转换为直观的图表…

低代码开发平台-企业级可视化快速开发工具

一、你们是否也遇到了以下问题 &#xff08;1&#xff09;作为传统型的软件公司&#xff0c;你们是否也遇到以下困扰&#xff1a; &#xff08;2&#xff09;作为大型企业软件开发部&#xff0c;你们是否也遇到以下困扰&#xff1a; 二、低代码平台介绍 MSPF快速开发平台是一…

​如何使用 ArcGIS Pro 分析爆炸波及建筑

假设在某栋建筑内发生了爆炸&#xff0c;需要根据爆炸的范围分析出来波及的建筑&#xff0c;对于这一需求&#xff0c;我们可以通过ArcGIS Pro来实现&#xff0c;这里为大家介绍一下分析的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

C语言数据类型范围概述

int范围: -2147483648~2147483647 (-2^31~2^31-1) unsigned int范围: 0~4294967295 (0~2^32-1) long 范围:-2147483648~2147483647 (-2^31~2^31-1) long long 范围: -9223372036854775808&#xff5e; 9223372036854775808(-2^63~2^63-1)

30个Linux性能问题诊断思路

文章目录 在Linux系统性能问题诊断过程中&#xff0c;有许多关键的检查点和技术可以用来识别潜在的问题源头。以下是30个Linux性能问题诊断思路的概览&#xff0c;包括但不限于&#xff1a; 系统负载监控&#xff1a; 使用uptime查看当前系统运行时间、在线用户数以及1/5/15分钟…

系列学习前端之第 5 章:学习 ES6 ~ ES11

1、什么是 ECMAScript ECMAScript 是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。 从第 6 版开始&#xff0c;发生了里程碑的改动&#xff0c;并保持着每年迭代一个版本的习惯。 ES62015年&#xff0c;ES72016年&#xff0c;ES82017年&#xff0c;ES92018年&#…

数据库板块

数据库软件: 关系型数据库: Mysql Oracle SqlServer Sqlite 非关系型数据库&#xff1a; Redis NoSQL 1.数组、链表、文件、数据库 数组、链表: 内存存放数据的方式(代码运行结束、关机数据丢失) 文件、数据…

MathType2024官方原版补丁包下载

MathType 7是一款功能强大的数学公式编辑器&#xff0c;广泛应用于各种文档和演示中&#xff0c;用于创建和编辑复杂的数学公式。下面我将详细介绍MathType 7的主要功能和使用方法&#xff0c;以及一些使用技巧。 一、主要功能 公式编辑&#xff1a;MathType 7提供了一个直观…

VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:

原因是unity 少安装了XR工具包 安装完后重新用unity打包&#xff0c;然后vs打开打包出来的工程&#xff0c;电脑和眼镜用usb连接&#xff0c;直接运行调试就可以了

养鸭场的污水怎么处理

养鸭场的污水怎么处理 养鸭场废水处理是现代农业管理中至关重要的环节之一。随着养殖业规模的扩大和环保要求的提高&#xff0c;有效处理养鸭废水已成为一个迫切的挑战。本文将介绍养鸭场废水的特点及处理方法&#xff0c;并重点讨论各种先进的废水处理设备&#xff0c;包括生物…