STM32CubeIDE基础学习-EXTI外部中断实验

news2024/11/24 12:43:01

STM32CubeIDE基础学习-EXTI外部中断实验


文章目录

  • STM32CubeIDE基础学习-EXTI外部中断实验
  • 前言
  • 第1章 硬件介绍
  • 第2章 工程配置
    • 2.1 工程外设配置部分
    • 2.2 生成工程代码部分
  • 第3章 代码编写
  • 第4章 实验现象
  • 总结


前言

中断概念:让CPU打断正在执行的程序,进而去执行紧急的程序,退出中断后回到原打断中断处继续执行。

前面学习了GPIO作为输入功能的实验,现在来学习使用中断的方式实现GPIO功能的控制,直接在KEY的工程基础上进行添加中断的功能代码就行,其它的功能不用修改。

外部中断实验和KEY按键实验的现象是一样的,只是本实验采用的是中断的方式实现而已,前面按键使用的查询方式,比较耗CPU。

这里说明一下:
前面按键使用的是轮询的方式,本实验将采用中断的方式来实现功能的控制,本实验之所以可以用按键来控制蜂鸣器和LED,是因为刚好按键的引脚和中断线是重合的,所以就很好的借用了按键来触发边沿检测进而触发中断,实质和按键关系不是很大。当没有接按键,用杜邦线把该引脚接3.3V 或 GND也可以实现功能,有兴趣可以测试下。

STM32CubeIDE基础知识学习回顾

实验目的:
学习外部中断功能的使用,实现按键控制BEEP和LED状态翻转功能。


第1章 硬件介绍

本实验使用的开发板主控芯片是STM32F103C8T6,其核心原理图如下:

在这里插入图片描述

时钟来源使用的是外部高速8M晶振作为高速时钟。

KEY_UP按键接到芯片的PA0引脚上,KEY按键接到芯片的PA2引脚上,原理图如下图所示:

在这里插入图片描述

第2章 工程配置

本实验直接采用上一个按键实验的工程作为基础模板,直接拷贝粘贴即可,然后在上面添加EXTI和NVIC的相关功能配置即可,其它不用修改,就不用再新建工程了。

2.1 工程外设配置部分

配置GPIO,鼠标左键点击该引脚,前面按键输入实验设置的功能是输入的,现在是外部中断的实验,那么就需要设置为EXTI的方式了。如下图所示:

在这里插入图片描述

在这里插入图片描述

选择完成后如下图所示:

在这里插入图片描述

这个软件有一个好处就是能实时检测同一个中断线不能多个共存,当你选择了EXTI2后,其它EXTI2的引脚就选不了这个外部中断功能了,比如选了PA2引脚再选择PB2引脚,则会把PA2选择的功能覆盖掉只留下PB2的,这样就说明它们是不能同时使用的,后面就不会存在引脚冲突的问题了。

接下来就可以配置具体端口功能了。

端口功能配置如下:
1、模式配置为上升沿、下降沿和双边沿触发模式。
2、更据硬件原理图来设置输出上拉或下拉。
3、User Label建议定义一个自己喜欢见名知意的名字,方便写程序时查看和方便使用。

模式配置说明如下:

在这里插入图片描述
后面几个事件模式本实验没有用到,这里就不展开描述了。

注意
为了确保能稳定正确读取到按键的触发电平,这里KEY_UP是需要配置下拉输入。
为了确保能稳定正确读取到按键的触发电平,这里KEY是需要配置上拉输入。

配置EXTI0和EXTI2具体的引脚配置如下图所示:

在这里插入图片描述

KEY_UP引脚采取上升沿的触发方式,配置为下拉输入。

在这里插入图片描述

KEY引脚采取下降沿的触发方式,配置为上拉输入。

配置完EXTI了之后,就可以进行配置NVIC了,主要设置中断使能、中断分组、中断优先级等信息。如下图所示:

在这里插入图片描述

在这里插入图片描述

设置后如上图所示:要注意标号2处的抢占优先级选择问题,默认是15的,后面代码需要用到延时消抖,如果选择了默认15的话,优先级是最低的,触发中断后会一直卡死在延时里面而出不来,所以这里需要设置的优先级比外部中断的都要高才行,不然就会让程序出问题的。

一般情况下的程序不建议在中断里面放阻塞函数,比如延时、printf等,避免程序执行出错,而且中断执行需要遵循快进快出的原则,不用过多的嵌套复杂代码。

RCC时钟、调试接口都不用修改,保持默认配置即可。

最终配置的功能如下图所示:

在这里插入图片描述

到此,整个工程需要新增的功能就配置完成了,接下来就可以生成代码工程进行代码编写了。

2.2 生成工程代码部分

可以按快捷键ALT+K,或者点击生成图标按钮生成代码工程。

生成后最终会显示下图这样的代码:

在这里插入图片描述

可以看到继承了前面的外设功能代码,接着就可以在上面添加自己需要实现的中断控制功能的代码了。

第3章 代码编写

进入main函数后如下图所示:

在这里插入图片描述

可以看到有这个stm32f1xx_it.c文件,里面存放了生成中断相关的函数代码,可以双击进去看具体的函数定义。如下图所示:

在这里插入图片描述

可以看到有两个中断服务处理函数,接着就发现两个中断处理服务程序都调用了HAL_GPIO_EXTI_IRQHandler()函数,函数里面的参数是中断所在的引脚号,那么再跳进去HAL_GPIO_EXTI_IRQHandler()函数里面看具体定义,可以看到下面这个函数的定义情况。如下图所示:

在这里插入图片描述

进入之后,可以看到这个中断服务程序先判断中断线的,然后清除中断标志,最后就调用HAL_GPIO_EXTI_Callback()函数。

接着再进去HAL_GPIO_EXTI_Callback()这个函数,发现该函数在库里面是弱定义的,提示需要用户自己重新定义才行。如下图所示:

在这里插入图片描述

接着就可以在这个函数里面编写自己的代码了,可以看到这个函数是库提供的,是一个弱定义的函数,说明如果用户没有定义和该函数一样名字的函数,则执行这里面的代码,有检测到定义则执行用户定义的函数功能。

一般情况下都不会直接在这个函数这里面写功能代码的,需要拷贝这个函数到其它地方或其它文件进行编写,具体位置没有强制要求,但一般习惯拷贝到stm32f1xx_it.c里面其它位置进行功能代码编写。

编写完中断处理代码内容如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 	HAL_Delay(10);         /* 延时消抖 */
	switch(GPIO_Pin)
	{
		case KEY_UP_Pin :
			if(HAL_GPIO_ReadPin(KEY_UP_GPIO_PORT, KEY_UP_GPIO_PIN) == GPIO_PIN_SET)/* KEY_UP按下 */
			{
				HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN);   /* BEEP翻转 */
				break;
			}

		case KEY_Pin :
			if(HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_GPIO_PIN) == GPIO_PIN_RESET)/* KEY按下 */
			{
				HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);     /* LED翻转 */
				break;
			}
	}
}
/* USER CODE END 1 */

中断执行逻辑方式和前面按键查询方式是差不多的,当中断线被触发了之后就执行里面的功能代码。KEY_UP是上升沿触发中断,KEY是下升沿触发中断。

到此,采用中断方式控制BEEP和LED的代码就写完了,编译下载后按下对应的按键就可以看到蜂鸣器和LED翻转情况了。

附加部分
前面学习了按键使用宏定义的方式,那么也可以引入到这里来,可以让代码量看上去少了很多。如下图所示:

在这里插入图片描述

代码片示例如下:

/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
 	HAL_Delay(10);         /* 延时消抖 */
	switch(GPIO_Pin)
	{
		case KEY_UP_Pin :
			if(KEY_UP == GPIO_PIN_SET)           /* KEY_UP按下 */
			{
				HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN);/* BEEP翻转 */
				break;
			}
		case KEY_Pin :
			if(KEY == GPIO_PIN_RESET)            /* KEY按下 */
			{
				HAL_GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PIN);/* LED翻转 */
				break;
			}
	}
}
/* USER CODE END 1 */

要注意,这里使用了相关的外设,则还要把相关头文件引入到这个stm32f1xx_it.c里面才行,不然会报错找不到定义的。如下图所示:

在这里插入图片描述

实现这个外部中断的功能就只需要在这个stm32f1xx_it.c文件里面完成代码编写即可,main函数的while里面以及其它所有的文件都不需要再添加写任何的代码了。

到此,整个中断控制的代码就全部写完了。

第4章 实验现象

编译下载代码后,按开发板的KEY_UP按键,可以听到蜂鸣器的状态发生了变化,当再一次按下按键时,蜂鸣器的状态也会翻转。当按下开发板的KEY按键后,可以看到LED灯的状态翻转了,再一次按下时,LED的状态又发生了翻转。当长按按键不松手,则程序会一直保持该执行的状态,能看到这些现象之后则说明这个代码编写逻辑是没有问题的。


总结

这个外部中断的内容不是特别难理解,代码逻辑和按键实验的差不多,当检测到IO的电平发生变化时,即可触发外部中断,进而执行中断服务函数。重点是理解中断线和回调函数的使用问题。

中断执行流程:
按键按下 > 检测到边沿信号从而触发外部中断线 > 跳转到中断服务程序执行该中断 > 最后进行执行中断回调函数。

注意事项:
1)STM32所有IO都支持外部中断功能,但是不同的端口(PORTA ~ PORTC)相同的PIN(PIN0 ~ PIN15)引脚就不能同时使用外部中断。

2)前面判断中断线时,在case里面用了if判断,这个是用于确认按键按下的,目的是为了更准确的判断该中断是否真正的被触发,如果不要这个if判断也是没有问题的,想要程序执行稳定,建议加上的。

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

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

相关文章

第8关:删除P表中所有的记录

任务描述 删除P表中所有的记录 相关知识 零件表P由零件代码(PNO)、零件名(PNAME)、颜色(COLOR)、重量(WEIGHT)组成; P表如下图: 现已构建P表,结构信息如下: 开始你的任务吧,祝你成功 USE my…

spring MVC是如何找到html文件并返回的?

Spring MVC 搜索路径 启动一个SpringBoot项目时,访问http://localhost:8080,对于SpringMVC,它会默认把这段url看成http://localhost:8080/index.html,所以这两个url是等价的。 .html, .css, .js, .img …都是静态资源文件&#x…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念,为了更好地服务于客户…

6.如何判断数据库搜索是否走索引?

判断是否使用索引搜索 索引在数据库中是一个不可或缺的存在,想让你的查询结果快准狠,还是需要索引的来帮忙,那么在mongo中如何判断搜索是不是走索引呢?通常使用执行计划(解释计划、Explain Plan)来查看查询…

Linux之缓冲区与C库IO函数简单模拟

缓冲区 首先, 我们对缓冲区最基本的理解, 是一块内存, 用户提供的缓冲区就是用户缓冲区, C标准库提供的就是C标准库提供的缓冲区, 操作系统提供的就是操作系统缓冲区, 它们都是一块内存. 为什么要有缓冲区? 先举个生活中的例子, 我们寄快递的时候往往是去驿站寄快递, 而不是…

Spring MVC文件下载配置

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 文件下载 在Spring MVC中通常利用commons-io实现文件下载,示例代码如下: Controller RequestMapping("......") public class DownloadC…

【晶振选型】输出波形的比较 CMOS Clipped sine wave TTL

疑问:哪种波形更好呢?答案是如果数字域方波最好,模拟域必须是正弦波了,所以还是具体问题具体分析。或者设计好冗余电路。 现在简单总结一下 晶振做的比较好的厂家 crystek 有一片被国内晶振厂家拿去分享的PDF; [CLIPPED SINEWA…

解决在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store的问题| Bug

目录 如果你已经尝试过将python添加到系统变量在系统变量里把你自己的路径放到应用商店的路径之前删除windowsapps下的python.exe文件 如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行,输入…

Linux CentOS 7.6安装Redis 6.2.6 详细保姆级教程

1、安装依赖 //检查是否有依赖 gcc -v //没有则安装 yum install -y gcc2、下载redis安装包 //进入home目录 cd /home //通过wget下载redis安装包 wget https://download.redis.io/releases/redis-6.2.6.tar.gz //解压安装包 tar -zxvf redis-6.2.6.tar.gz3、编译 //进入解压…

Prometheus修改默认数据存储时间

Prometheus的默认数据存储时间可以通过修改启动脚本中的相关参数来调整。具体来说,可以通过修改--storage.tsdb.retention.time参数来改变数据保留的时长。该参数决定了何时删除旧数据,默认为15天。如果需要延长数据保留时间,可以将该参数的值…

Day15:二叉树层序遍历 LeedCode 102.二叉树的层序遍历 199二叉树的右视图 637.二叉树的层平均值 101.对称二叉树 226.翻转二叉树

102.二叉树的层序遍历 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]思路…

汇丰:大宗商品的“供给侧大故事”

今年3月以来,黄金、铜、原油、可可等各类大宗商品价格开启“狂飙”模式。 国际黄金从每盎司2050美元涨至接近2200美元;作为全球经济晴雨表,伦铜价格已经突破9000美元/吨,创近1年新高;原油价格也连续上涨,I…

采用U盘安装Win10系统教程

安装流程: 下载 Windows 10https://www.microsoft.com/zh-cn/software-download/windows10 手把手教你如何重装win10系统,自己动手安装系统其实很简单 - 知乎笔者在这里写一个详细点的系统重装教程。手把手教大家如何从零开始重装win10系统。因为是写给新…

CPU设计实战-Wishbone总线接口

为什么需要改用总线接口? 1.但是在实际应用中,程序的体积可能非常大,指令存储器就不能再集成在FPGA内部了,一般使用FPGA芯片外部的Flash作为指令存储器。同理,-般使用FPGA芯片外部的SDRAM作为数据存储器。 2.统一接口标准。 很多…

科研学习|研究方法——实验法

1.实验方法的渊源 今天我们说物理学、生物学是实验的科学,应该不会有人再持异议了,然而连物理学这样的学科在历史上也并非一开始就是实验科学。在2000多年以前的亚里士多德时代,众人都认为物理学是非实验性质的,物理学成为实验科学…

cuda多版本安装

主要参考文章: ubuntu 20.04下多版本cuda&cudnn下载与安装 在ubuntu上安装多个版本的CUDA,并且可以随时切换 1 环境检查 nvidia-smiCUDA Version:12.4表示最高支持cuda 12.4版本 nvcc -V如图所示表示系统目前版本为cuda 12.2 2 多版本cuda下载与…

从零开始的LLaMA-Factory的指令增量微调

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

外卖项目:使用AOP切面,完成公共字段自动填充(断点调试详细讲解)

文章目录 一、问题描述二、实现思路三、实现步骤四、断点实操五、代码演示 一、问题描述 我们已经完成了后台系统的员工管理功能和菜品分类功能的开发,在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段,在编辑员工或者编…

Sentinel持久化(nacos)

导入依赖 <!--SpringCloud ailibaba sentinel-datasource-nacos --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency> yml配置 rule-type: naco配置: resource&am…

javaweb遇到的servlet问题,jar包问题

有时候会遇到这种问题&#xff0c;有的地方会报红 这是因为这个找不到这个包&#xff0c;这个项目缺少jar包 在tomcat9之前还不是Jakarta这个名字&#xff0c;我的运行环境与服务器是jdk17与tomcat10 解决方法&#xff1a; 在项目结构中&#xff0c;找到模块&#xff0c;再…