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,一经查实,立即删除!

相关文章

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

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

LeetCode - 和为K的子数组

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

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

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

如何借助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;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…

30个Linux性能问题诊断思路

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

MathType2024官方原版补丁包下载

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

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

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

word中图片位置问题(后续遇到问题再更新)

问题1&#xff1a;图片插入后显示不全 具体表现为&#xff1a;复制黏贴、或者插入图片后&#xff0c;出现插入的图片显示不全&#xff0c;或者不显示。 例如&#xff1a; 这是因为&#xff1a;图片被设定了固定行距 解决方案&#xff1a;ctrl1 效果&#xff1a; 问题2&am…

Elasticsearch进阶篇(一):Elasticsearch写入原理深入详解

Elasticsearch写入原理深入详解 1. ES相关问题 引用官方文档地址&#xff1a;分片内部原理 | Elasticsearch: 权威指南 | Elastic 为什么Elasticsarch是近实时&#xff0c;而不是准实时&#xff1f; 为什么文档的CRUD (创建-读取-更新-删除) 操作是实时的&#xff1f; Elast…

FineReport报表如何在单元格中显示本地图片(图片地址已存储到MySQL数据库中)

帆软帮助文档对应查看链接&#xff1a;https://help.fanruan.com/finereport/doc-view-854.html?source4#需求&#xff1a;在设计FineReport报表时&#xff0c;想在单元格中显示图书信息对应的图片&#xff0c;图片路径已存储到MySQL数据库中 一、查询数据库 查询MySQL中图书…

为什么defineProps宏函数不需要从vue中import导入?

前言 我们每天写vue代码时都在用defineProps&#xff0c;但是你有没有思考过下面这些问题。为什么defineProps不需要import导入&#xff1f;为什么不能在非setup顶层使用defineProps&#xff1f;defineProps是如何将声明的 props 自动暴露给模板&#xff1f; 举几个例子 我们…

【算法面试题】-06

智能成绩表 题目描述 小明来到学校当老师&#xff0c;需要将学生按考试总分或单科分数进行排名&#xff0c;你能帮帮他吗&#xff1f; 输入描述 第 1 行输入两个整数&#xff0c;学生人数 n 和科目数量 m。 0 < n < 100 0 < m < 10 第 2 行输入 m 个科目名称&…

探索性数据分析EDA的数据可视化

大家好&#xff0c;数据可视化是探索性数据分析的重要组成部分&#xff0c;因为它有助于分析和可视化数据&#xff0c;以获得对数据分布、变量之间的关系和潜在异常值的启示性见解。Python具有丰富的库&#xff0c;可以快速高效地创建可视化。 在Python中&#xff0c;通常使用…

MIT 6.S081---Lab: locks

Memory allocator (moderate) 修改kernel/kalloc.c&#xff0c;修改kmem声明并定义结构体数组&#xff1a; 修改kernel/kalloc.c中的kinit函数&#xff0c;对kmemList进行初始化&#xff1a; 修改kernel/kalloc.c中的kfree函数&#xff0c;获取当前的cpuid并将释放的内存添加到…

C语言知识点总结00-C语言知识点目录

专栏主页&#xff1a; 数据结构算法程序设计基础C语言知识点总结https://blog.csdn.net/seeker1994/category_12585732.html 最优算法100例00-最优算法100例目录 数据结构知识点总结00-知识点目录 ...... C语言知识点目录 程序设计基础C语言知识点总结 1 概述 2 数…

CSS 【详解】响应式布局(明天内容)

响应式布局&#xff1a; 同一页面在不同的屏幕上有不同的布局&#xff0c;即一套代码自适应不同的屏幕。 常用 单位&#xff1a; 像素&#xff08;px&#xff09;&#xff1a;像素是最常用的长度单位&#xff0c;它表示屏幕上的一个物理像素点。例如&#xff0c;width: 200px; …

Java学习笔记------常用API(二)

Object 无有参构造 public Object() 空参构造 成员方法&#xff1a; public String toString() 返回对象的字符串表示 public boolean equals(object obj) 比较两个对象是否相等 Object默认用号比较地址值&#xff0c;需要重写才能比较属性值 protected O…

使用Anaconda创建Python指定版本的虚拟环境

由于工作的需要和学习的需要&#xff0c;需要创建不同Python版本的虚拟环境。 比如zdppy的框架&#xff0c;主要支持的是Python3.8的版本&#xff0c;但是工作中FastAPI主要使用的是3.11的版本&#xff0c;所以本地需要两套Python环境。 决定使用Anaconda虚拟环境管理的能力&…