STM32——关于EXTI讲解及标准库应用(基础篇)

news2024/11/22 18:50:31

简介:

STM32的中断包括EXTI外部中断、TIM定时器、ADC模数转换器、USART串口,SPI通信、I2C通信等一系列的外设。这篇主要来讲解关于EXTI外部中断的概念和应用。EXTI(External Interrupt)是一个非常重要的外部中断模块,可以实现外部中断的响应。下面我们将对STM32的EXTI模块进行详细介绍,并且分析其在STM32应用中的实际应用。


一、EXTI的基本结构:

EXTI模块标准的EXTI支持事件和中断两种模式,它的基本结构包括以下几个部分:

  1. 中断控制器:中断控制器(NVIC)负责管理外部中断和系统中断,并为中断提供响应机制。

  2. EXTI触发器和控制器:EXTI触发器和控制器负责处理输入信号,并触发中断或事件。

  3. 直接存储器存取(DMA)控制器:DMA控制器可以使外设数据在不影响CPU的情况下传输数据。

  4. 系统时钟:STM32的EXTI需要系统时钟支持,以实现稳定,准确的功能。

二、EXTI的工作原理

STM32的EXTI工作原理如下:

  1. 触发方式:当外部中断探测到电平变化时,会产生中断请求。触发方式有上升沿/下降沿/双边沿/软件触发。

  2. 中断请求处理:当中断请求产生时,中断控制器将执行中断服务程序,根据中断向量表(IVT)处理特定的中断请求。中断服务程序可以保存当前状态,加载新的状态,然后执行一些特定的操作,最后返回处理器。

  3. 中断服务程序:中断服务程序通常由外设驱动程序编写。在中断服务程序中,需要首先确认中断请求的源头,根据这个中断源准备特定的函数,并调用这个函数来执行特定的操作。

  4. 确认中断请求:确认中断请求的方法有很多种,最常用的方法是使用中断控制器的“中断清除”功能。这个功能可以清除中断控制器中的中断标志位,从而中断控制器不再产生附加的中断请求。另外,还可以使用外设的通过特定寄存器提供的处理方式来确认中断请求。

三、EXTI的应用

作为一个外部中断模块,STM32的EXTI有很多的应用。下面我们将介绍STM32的EXTI在程序中的具体应用。

  1. 程序设计中的GPIO中断:STM32的GPIO引脚可以使用中断来响应其他设备或者用户的请求。通过在GPIO模式寄存器中设置对应的模式,可以使GPIO引脚变得可中断。因此,中断响应器通过改变定义为GPIO口的引脚的电平来产生外部中断,从而实现中断信号的触发。但是相同的Pin不能同时触发中断。

  2. 程序设计中的时钟中断:STM32的时钟中断可以用来控制未完成的同步传输操作或者块传输操作。在程序设计中,通过对应用程序接口(API)中的周期性中断标志位进行测试,可以检查时钟中断是否已经发生。

  3. 程序设计中的DMA中断:为了避免CPU和外设之间数据传输的中断负担,STM32的DMA控制器支持多个DMA通道。在程序设计中,使用配置DMA通道计数器和外设寄存器偏移量后,可以对这些DMA通道进行配置,并将它们绑定到外设。在数据传输完成时触发DMA传输完成中断,可以使CPU获得数据传输的完整性,并且强制停止外设操作。


代码介绍:

1、复位AFIO外设的
void GPIO_AFIODeInit(void);

2、锁定GPIO的配置
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

3、选择 GPIO 管脚用作事件输出
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

4、使能或者失能事件输出
void GPIO_EventOutputCmd(FunctionalState NewState);

5、进行引脚重映射
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

6、选择 GPIO 管脚用作外部中断线路
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
1、清除配置
void EXTI_DeInit(void);

2、根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

3、根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);

4、产生一个软件中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);

5、检查指定的 EXTI 线路标志位设置与否
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);

6、清除 EXTI 线路挂起标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);

7、检查指定的 EXTI 线路触发请求发生与否
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

8、清除 EXTI 线路挂起位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
1、设置优先级分组:先占优先级和从优先级即先占优先级和抢占优先级
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

2、根据 NVIC_InitStruct 中指定的参数初始化外设 NVIC 寄存器
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

演示代码效果:

1、EXTI_Configuration.c


#include "stm32f10x.h"                  // Device header

void EXTI_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	//开启APB2的外设时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);		//开启AFIO的外设时钟,EXTI和NVIC的时钟是一直开启,故不需要开启时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;	//定义结构体
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	//对于EXTI外部中断,引脚要选择浮空、上拉或者下拉输入
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);		//设置PB14引脚外部中断
	
	EXTI_InitTypeDef EXTI_InitStructure;
	EXTI_InitStructure.EXTI_Line = EXTI_Line14;//指定配置的中断线
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;	//选择开启中断或者关闭中断
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置触发模式
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	//	设置触发方式
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;	//外部中断线 15-10 中断
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//先占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//从优先级
	//优先级是在多个中断源同时申请,产生拥挤时才会产生作用
	NVIC_Init(&NVIC_InitStructure);
}


//中断函数不需要声明,其是自动执行的
void EXTI15_10_IRQnHandler(void)	//中断源触发的中断
{
	if(EXTI_GetFlagStatus(EXTI_Line14) == SET)	//如果触发到中断,则会进入下面的程序
	{
        /*这里为所要添加实现的功能

        */

		EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位
	}
}

2、EXTI_Configuration.h

#ifndef _EXTI_COUNT_H
#define _EXTI_COUNT_H

void EXTI_Configuration(void);

#endif
3、main.c


#include "stm32f10x.h"                  // Device header
#include "EXTI_Configuration.h"

int main(void)
{
	EXTI_Configuration();
	
	while (1)
	{
        /*这里为想得到的结果

        */
    }

}

首先,在这里先要讲解为什么要开启AFIO时钟,当我们使用非普通管脚时
即使用管脚的复用功能时,需要开启AFIO(复用IO)。但是,不是使用所有引脚的复用
功能时都需要开启AFIO时钟。

总之,STM32的EXTI模块是一个非常重要的外部中断模块,它有很多的应用,可以使STM32的应用程序更加完美和可靠。

参考网址(7条消息) STM32的AFIO时钟什么时候需要开启_afio时钟在什么情况下需要开启_阿基米东的博客-CSDN博客https://blog.csdn.net/lu_embedded/article/details/51552575

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

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

相关文章

chatgpt赋能python:Python多条图形绘制在一张图里的实现方法及应用

Python多条图形绘制在一张图里的实现方法及应用 作为一款优秀的编程语言,Python在数据可视化方面有着非常出色的表现。然而有时候我们需要在一张图里绘制多条不同的图形,这时候Python又有什么好的解决方案呢?本文将介绍多种方法实现Python在…

10个最流行的可生成图像嵌入向量的预训练AI模型

迁移学习的出现进一步加速了计算机视觉——图像分类用例的快速发展。 在大型图像数据集上训练计算机视觉神经网络模型需要大量的计算资源和时间。 幸运的是,通过使用预训练模型可以缩短时间和资源。 利用预训练模型的特征表示的技术称为迁移学习。 预训练通常使用高…

《MySQL(三):基础篇- 函数》

文章目录 3. 函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 3. 函数 函数 是指一段可以直接被另一段程序调用的程序或代码。 也就意味着,这一段程序或代码在MySQL中 已经给我们提供了,我们要做的就是在合适的业务场景调用对应的函数完成对应…

Vue.js 中的响应式原理是什么?

Vue.js 中的响应式原理是什么? Vue.js 是一种流行的前端框架,它使用了一种称为“响应式”的技术来实现数据绑定。这意味着当数据发生变化时,Vue.js会自动更新相关的视图,而无需手动操作DOM。在本文中,我们将深入探讨V…

【SCI征稿】Elsevier旗下中科院2区TOP, 仅1周见刊, 6月11日截稿 (文末有好)~

一、【期刊简介】 中科院2区智能计算类SCI (TOP/6.11截稿) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区; 【终审周期】走期刊部系统,3-5个月左右录用; 【检索情况】SCI&EI双检;正刊; 【数据库收录年份】2001年…

RHCE练习题目【更新至】

文章目录 第一题、安装和配置ansible第二题、创建和运行ansible临时命令第三题、使用剧本安装软件包第四题、使用RHEL系统脚色第一问、配置时间同步第二问、配置selinux 第五题、使用Ansible Galaxy安装角色第六题、创建和使用角色第七题、从Ansible Galaxy使用角色第八题、创建…

一文搞定国民N32G435高负载串口通信

副标题:USRAT无硬件双缓冲条件下的软件双缓冲 一、前言 在单片机中,USART的通信一般都是最常用也最先去接触的串口外设,在一般的小数据量应用中一般不需要考虑USART串口(以下简称为串口)的高负载能力,比如…

第六十五天学习记录:高等数学:函数与极限(宋浩板书)

C语言学习后,曾为先学C还是数据结构纠结了半天。在看数据结构前言的时候,发现学习数据结构之前还需要一定的数学基础。虽然涉及到的数学基础不多,但想到以前大学高数,现代不是60分万岁就是不到80分,好像就概率论稍微了…

【Python】Python系列教程-- Python3 循环语句(十七)

文章目录 前言while 循环无限循环while 循环使用 else 语句简单语句组for 语句for...elserange() 函数break 和 continue 语句及循环中的 else 子句pass 语句 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境…

Treap C++代码实现

一、全部代码 #include <iostream> #include <cstdlib> #include <time.h>using namespace std;//Treap结构 struct TreapNode {TreapNode *pLeft, *pRight;int value, fix; };//左旋 void TreapLeftRotate(TreapNode* &pCur){//首先&#xff0c;找到当…

平衡树原理讲解

平衡树——Treap 文章目录 平衡树——TreapBST定义性质操作插入insert(o, v)删除del(o, v)找前驱 / 后继get_prev(o)、get_next(o)查找最大 / 最小值get_min(o)、get_max(o)求元素排名get_rank(o)查找排名为 k k k的元素get_value_by_rank 平衡树左旋、右旋zag(o)、zig(o)左旋右…

Vue路由(vue-router)详细讲解指南

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成&#xff0c;让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向&#xff0c;就是我在页面上点击一个按钮需要跳转到对应的页面&#xff0c;这就是路由跳转&#xff1b; 首先我们来学习三个单词&…

运维小白必学篇之基础篇第八集:LVM实验

LVM实验 实验一&#xff1a; 使用/dev/sdb磁盘完成以下操作&#xff1a; 1、创建5个物理卷&#xff0c;组成大小为10G的卷组vgtest 2、创建大小为3G的逻辑卷lv1&#xff0c;格式化xfs文件系统&#xff0c;实现开机自动挂载 3、为lv1逻辑卷扩容至5G&#xff0c;然后查看扩容之…

男子路遇“纸片鸟”,AI帮忙免惹祸

据报道&#xff0c;近日&#xff0c;河南洛阳一网友在路边偶遇一只“纸片鸟”&#xff0c;小鸟远看像一张纸片&#xff0c;样子十分奇特&#xff0c;而且还死死地盯着自己&#xff0c;像是求救&#xff0c;后来他用手机一查发现是二级保护动物“黄斑苇鳽”&#xff0c;便报警处…

排水管网监测预警系统:为城市排水建设提质增效

最近&#xff0c;城市生命线安全工程占据着行业的头条榜单&#xff0c;与民众生活密不可分的城市基础设施&#xff0c;包括城市的燃气、桥梁、供水、排水、供热、综合管廊等被称为城市生命线。城市生命线安全工程是城市更新和新型城市基础设施建设的重要内容&#xff0c;其主要…

数说故事×中广协丨广告代言人内容商业沙龙走进大湾区

以“娱时俱进&#xff0c;内容赋能”为主题的广告代言人内容商业沙龙&#xff08;大湾区站&#xff09;&#xff0c;近日在广州市白云区美湾广场成功举行。 沙龙由中国广告协会作为指导单位&#xff0c;广东省广告协会与中国广告协会广告代言人工作委员会联合主办&#xff0c;广…

机器视觉陶瓷板外观缺陷检测系统应用

随着科技的不断发展&#xff0c;机器视觉技术在工业领域的应用越来越广泛。其中&#xff0c;机器视觉陶瓷板外观缺陷检测系统是一项十分重要的技术。该系统利用计算机视觉技术对陶瓷板表面的缺陷进行自动化检测&#xff0c;大大提高了生产效率和产品质量。 机器视觉陶瓷板外观…

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…

如何实现Web3去中心化云计算的大规模采用?

随着区块链技术的迅猛发展&#xff0c;Web3去中心化云计算正在逐渐崭露头角。它以分布式、安全和透明的特点&#xff0c;为用户和企业提供了许多独特的优势。 然而&#xff0c;要实现Web3去中心化云计算的大规模采用&#xff0c;仍然面临着一些挑战。本文将探讨这些挑战&#x…

[EuroSys2023 Best Poster] 面向动态图的极低时延GNN推理采样服务

作者&#xff1a;沈雯婷 GraphLearn是阿里云机器学习平台PAI 团队和达摩院智能计算实验室图计算团队共建的工业界大规模图神经网络训练框架, 也是一站式图计算平台GraphScope的图学习引擎。GraphLearn最新开源了面向动态图的GNN在线推理实时采样服务(DGS)。DGS具备处理实时高吞…