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

news2024/11/30 18:35:37

单片机学习

目录

文章目录

一、外部中断配置步骤

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.coloradmin.cn/o/1255804.html

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

相关文章

企业如何创建和运营在线知识库?

随着企业业务的不断扩展和复杂化,建立一个在线知识库已经成为企业提高效率、减少重复劳动和提升服务质量的重要手段。接下来就详细介绍一下企业如何创建和运营在线知识库。 | 一、明确知识库的需求和目标 在开始建立在线知识库之前,企业需要明确知识库的…

ClickHouse中的物化视图

技术主题 技术原理 物化视图(Materialized View)是一种预先计算并缓存结果的视图,存储在磁盘上自动更新,空间换时间的思路。物化视图是一种优化技术,本质上就是为了加速查询操作,降低系统负载&#xff0c…

操作系统——解决了我的一些困惑

目录 1、电脑开机做了什么事情 2、真正实现并行的计算机 3、计算机中的淘汰算法 & 分配算法 & 调度算法 & 空间管理 4、什么是虚拟内存?为什么需要虚拟内存?最多可分配多少? 5、TLB(快表)、分页存储&…

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名!高级提示:使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…

佳易王幼儿园缴费系统软件编程应用实例

佳易王幼儿园缴费系统软件编程实例 佳易王幼儿园缴费系统功能: 1、系统设置 2、班级设置 3、其他费用名称 4、学生信息管理 5、学生缴费 6、统计报表 7、备份全部数据 软件试用版下载可以点击下方官网卡片

前端向后端传JSON数据,使用MyBatis查询

form中向后端传的是空字符串,并不是null 而在MyBatis的判断中应判断是否为空字符串,而并非null

2016年五一杯数学建模B题能源总量控制下的城市工业企业协调发展问题解题全过程文档及程序

2016年五一杯数学建模 B题 能源总量控制下的城市工业企业协调发展问题 原题再现 能源是国民经济的重要物质基础,是工业企业发展的动力,但是过度的能源消耗,会破坏资源和环境,不利于经济的可持续发展。目前我国正处于经济转型的关键时期&…

String,StringBuffer以及StringBuilder之间的区别

文章目录 区别一:字符串内容是否可变区别二:线程安全区别三:性能区别四:使用场景 “String,StringBuffer以及StringBuilder之间的区别的区别” 这个问题是面试官比较常问的一个Java基础题。在日常的开发中,也常常会用到…

Vue轻松入门,附带学习笔记和相关案例

目录 一Vue基础 什么是Vue? 补充:mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式? 插值表达式的缺点 解决方法 相关代…

Linux MMC子系统 - 6.eMMC 5.1工作模式-设备识别模式

By: Ailson Jack Date: 2023.11.26 个人博客:http://www.only2fire.com/ 本文在我博客的地址是:http://www.only2fire.com/archives/165.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。…

MyBatis Generator使用总结

MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator (MBG) 是 MyBatis 的代码生成器。它能够根据数据库表,自动生成 java 实体类、dao 层接口(mapper 接口)及m…

OpenCV检测圆形东西是否存在缺口?

文章目录 前言一、试过的方法二、最终使用的方法1.先极坐标变换2.计算斜率 总结 前言 想了挺久,一直没解决这个问题。后面勉强解决了。 一、试过的方法 1.想用圆度来解决,后来发现圆度差值很小,完整的圆圆度0.89,然后有缺角的圆圆…

性能测试【二】:nmon的常用操作

性能测试【二】:nmon的常用操作 1、nmon介绍说明2、软件下载2.1、Nmon下载地址2.2、Nmonanalyser下载地址 3、nmon使用3.1、将nmon上传至/usr/local/src目录下,并解压3.2、解压后根据自己系统的实际版本查找相应的使用命令,并给命令赋予可执行…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web:路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

Yolov8训练自己的数据集过程

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

2018年10月16日 Go生态洞察:App Engine新Go 1.11运行时发布

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

项目中启用Log4j2日志框架

在实际的项目开发中,日志十分重要,无论是记录运行情况还是定位线上问题,都离不开对日志的分析。日志记录了系统行为的时间、地点、状态等相关信息,能帮助我们了解并监控系统状态,并在发生错误或者接近某种危险状态时能…

emu8086汇编语言输出“Hello World!“

输出Hello world 首先我们尝试用C语言来实现该功能&#xff1a; #include <stdio.h>int main() {printf("Hello World!"); // 输出“Hello World!”return 0; } 将这行代码翻译成汇编语言... ; DS 数据段定义 DATA SEGMENTZIFU DB Hello World!,$ ;字符串…

歌曲《兄弟情深》:歌手荆涛歌曲中的真挚情感

在人生的道路上&#xff0c;有时我们会遇到迷茫、失落、困惑等种种情境。而在这些时刻&#xff0c;身边有一个真挚的兄弟&#xff0c;其意义是无法估量的。歌手荆涛演唱的《兄弟情深》即是对这种深厚情感的美妙歌颂。 一、迷茫时的指引 “当我迷茫时&#xff0c;有你帮目标重新…

安卓系统修图软件(二)

晚上好&#xff0c;自上一次博主分享修图软件之后&#xff0c;今天博主将带来第二期安卓修图软件的推送&#xff0c;个个都是宝藏&#xff0c;建议大家赶紧体验哦。 1.canva可画 如果说有一款手机APP可以与PS媲美&#xff0c;那么一定非canvas莫属。这款强大的修图软件支持海报…