STM32 外部中断配置与中断函数设计

单片机学习

目录

文章目录

一、外部中断配置步骤

1.1配置RCC

1.2配置GPIO

1.3配置AFIO

1.4配置EXTI

1.5配置NVIC

二、中断函数设计

总结


一、外部中断配置步骤

  • 第一步:配置RCC,把涉及外设的时钟打开。
  • 第二步:配置GPIO,选择端口为输入模式。
  • 第三步:配置AFIO,选择使用这一路GPIO,连接到后面的EXIT。
  • 第四步:配置EXTI,选择边沿触发方式(上升沿、下降沿、双边沿);选择触发响应方式,可以选择中断响应和事件响应。
  • 第五步:配置NVIC,给中断选择一个合适的优先级。

外部中断配置可以参考EXIT基本结构图

详细内容可参考之前文章

https://blog.csdn.net/Echo_cy_/article/details/134548970?spm=1001.2014.3001.5502

1.1配置RCC

        配置RCC,把涉及外设的时钟打开。

  • 开启GPIOB的时钟。
  • 开启AFIO的时钟。
  • 因为NVIC和EXIT的时钟一直开启,所以不需要配置。

代码示例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO的时钟

1.2配置GPIO

        配置GPIO,选择端口为输入模式。可使用GPIO_Init函数,函数具体介绍可见上一篇内容https://blog.csdn.net/Echo_cy_/article/details/134587440?spm=1001.2014.3001.5502

代码示例:

	GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_14;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);

1.3配置AFIO

        配置AFIO,选择使用这一路GPIO,连接到后面的EXIT.可使用GPIO_EXTILineConfig函数配置AFIO外部中断引脚。

代码示例:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);

1.4配置EXTI

        配置EXTI,选择边沿触发方式(上升沿、下降沿、双边沿);

        选择触发响应方式,可以选择中断响应和事件响应。

代码示例:

    EXTI_InitTypeDef EXIT_InitSrtucture;EXIT_InitSrtucture.EXTI_Line=EXTI_Line14;EXIT_InitSrtucture.EXTI_LineCmd=ENABLE;EXIT_InitSrtucture.EXTI_Mode=EXTI_Mode_Interrupt;EXIT_InitSrtucture.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXIT_InitSrtucture);

1.5配置NVIC

        配置NVIC,给中断选择一个合适的优先级。

在配置中断之前,先使用NVIC_PriorityGroupConfig函数指定中断分组,然后使用NVIC_Init函数初始化NVIC。

  • 这个分组方式整个芯片只能用一种,所以这个分组代码整个工程只需执行一次就可以。
  • 如果把这个函数放在分组模块里,那要确保每个模块分组都选的是同一个。
  • 也可以把这个代码放在主函数的最开始,这样模块里就不用再进行分组了。

代码示例:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);

二、中断函数设计

        通过NVIC,外部中断信号就可以进入CPU.这样才能让CPU由主程序跳转到中断程序执行,那么中断程序应该放在哪里呢?

        这就需要写一个中断函数。在STM32中,中断函数的名字都是固定的。每个中断通道都对应一个中断函数。中断函数的名字可参考启动文件中的startup_stm32f10x_md.s文件,文件里有定义的中断向量表,其中以IRQHandler结尾的字符串就是中断函数的固定名字。

        注意中断函数的名字不能写错,写错进不了中断。最好直接从启动文件复制过来。

代码示例:

void EXTI15_10_IRQHandler (void)
{if(EXTI_GetITStatus(EXTI_Line14) == SET)//判断所选定的中断标志位是不是为1.{//中断执行程序EXTI_ClearITPendingBit(EXTI_Line14);//清除中断标志位函数}
}

        在中断函数里,一般都是先进行一个中断标志位的判断,以确保是我们想要的中断源触发这个函数。

        中断程序结束后,一定要再调用一下清除中断标志位的函数。因为只要中断标志位置1了,程序就会跳转到中断函数,而如果你不清除中断标志位,那它就会一直申请中断,这样程序就会不断响应中断,执行中断函数,程序就会卡死在中断函数里,所以每次中断结束后,都应该清除一下中断标志位。
 


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了STM32中中断函数的使用。

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

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

相关文章

样品实验K-KAT348羧酸铋催化剂TDS说明书

样品实验K-KAT348羧酸铋催化剂TDS说明书 50克 100克 200克

STM32_11(SPI)

一、SPI通信 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slav…

还在愁没项目?来瞧瞧这些另类赚钱方式

客套话不多说,直接上案例,这些都是正儿八经的真实案例,相信大家通过这些人的案例自然能摸索整理出一套属于自己的项目!摸索不出,也多多少少能受一些灵感上的启发。 小A是长期混B站的,大家称他为“B站搬运工…

C++ 通过SQLite实现命令行工具

本文介绍了一个基于 C、SQLite 和 Boost 库的简单交互式数据库操作 Shell。该 Shell 允许用户通过命令行输入执行各种数据库操作,包括添加、删除主机信息,设置主机到特定主机组,以及显示主机和主机组列表。通过调用 SQLite3 库实现数据库连接…

【网络安全】meterpreter攻击实战

1.meterpreter 攻击成功后可以做什么指令? 远程控制命令执行摄像头监控密码获取创建后门用户破坏篡改系统。 2.创建后门用户并开启远程连接: net user zhangsan 123456/add && net localgroup adminstrators zhangsan/add exit run getgul -…

拓数派荣获上海市“智慧工匠”工业软件创新案例奖

近日,由上海市经济和信息化委员会指导、上海市城市数字化转型应用促进中心主办、上海中创产业创新研究院承办的“工业软件赋能新型工业化”主题沙龙暨2023“智慧工匠”工业软件创新案例竞赛颁奖典礼在上海圆满落幕。拓数派凭借上汽集团工业数据管理服务平台案例成功…

ROS vscode使用基本配置

1、创建ros工作空间 2、启动 vscode 3、vscode 中编译 ros ctrl shift B 调用编译,选择:catkin_make:build 修改.vscode/tasks.json 文件 4、 创建 ROS 功能包 选定 src ---> create catkin package 依次设置包名、添加依赖 5、C 实现 在功能包的 src 下…

Yolov8训练数据集过程 + 测试测试集 + 继续训练+报错解决

做自己第一次使用Yolov8训练的记录 1、下载代码 官网的我没找到对应的视频教程,操作起来麻烦,一下这个链接的代码可以有对应bilibili教程:完整且详细的Yolov8复现训练自己的数据集 选择这个下载: 2、安装需要的包: …

扫码听音乐该如何制作?音乐的二维码生成方法

多个音频文件怎么做成一个二维码显示?二维码在现在的生活中拥有丰富的使用场景,可以用来作为多种内容类型的载体,比如音频二维码就是经常被使用的一种二维码类型。通过扫秒二维码来听音频文件,更加的灵活方便,那么音频…

MySQL C代码连接

环境:5.7.42-0ubuntu0.18.04.1 (Ubuntu) mysql接口介绍 初始化mysql指针 用来生成MySQL对象,返回值为MySQL*,MySQL*是MySQL对象的指针。 MySQL在mysql.h中是一个结构体 链接数据库 初始化完毕之后,必须先链接数据库&#xff…

安防监控系统的工作原理是什么?具体包含哪些组成部分?

关于安防监控系统,大家熟知的就是监控系统平台,其实不然,智能视频安防监控系统涵盖的内容非常多,今天小编就和大家一起来探讨一下。 安防监控视频系统主要分为以下7大类: 1、 摄像头采集图像 安防监控系统通常使用摄…

11-30 SpringBoot

内嵌的tomcat tomcat的依赖 对于tomcat其实还是一个jar包 spring是一个IOC容器 tomcat的核心对象交给Spring容器 调用核心对象方法 启动Tomcat 1.添加依赖 tomcat-embed-core,叫做tomcat内嵌核心。就是这个东西把tomcat功能引入到了我们的程序中的 排除tomcat&a…

Nginx(无法解析PHP网页如何解决?FPM解决你的烦恼!)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技…

Android笔记(十六):前台服务

设置服务为前台服务。前台服务会在状态栏显示一个通知。通知界面与服务进行关联。 一、什么是通知? Notification通知是在移动应用APP提供给用户的消息提示,是在移动系统的通知栏中显示。当移动应用不在运行时或者在后台状态下,通过发布通知…

数据挖掘实战-基于word2vec的短文本情感分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

易点易动固定资产管理系统:提升企业固定资产管理效率的利器

固定资产是企业运营中重要的组成部分,对于企业的正常运转和发展至关重要。然而,传统的固定资产管理方法通常存在效率低下、信息不透明等问题。为了解决这些挑战,易点易动固定资产管理系统应运而生。本文将探讨易点易动固定资产管理系统的概念…

9款高效绘图神器,提升你的工作效率

在日常工作或生活中,我们必须绘制各种图表、流程图、思维导图等图形,或者想用画笔描述自己的想法。然而,我们在许多绘图软件面前感到困惑。我们不知道哪个绘图软件好,也没有足够的时间一一尝试 在接下来的空间里,我们…

堆栈_有效括号

题比较特殊,主要在于它的所有要输入,都是左括号开头,没有右括号开头的,比如"] [",这种是不算为括号的,由于必然是对称的,若能符合,因而直接在遇到右括号时,检查…

基于python实现心血管疾病风险预测分析

一、项目简介 项目背景 利用心血管疾病风险预测数据集进行深入分析,探究不同因素与心血管疾病风险之间的关联。 数据源 Kaggle上的心血管疾病风险预测数据集。(Cardiovascular Diseases Risk Prediction Dataset | Kaggle) 二、数据预处…

视图层、模板(补充)

视图层 响应对象 响应---》本质都是 HttpResponse HttpResponse---》字符串render----》放个模板---》模板渲染是在后端完成 js代码是在客户端浏览器里执行的模板语法是在后端执行的redirect----》重定向 字符串参数不是是空的状态码是 3开头JsonResponse---》json格式数据 …