STM32_实验5_中断实验

通过外部中断来检测四个按键按下的状态:

WK_UP 控制蜂鸣器响和停

KEY0 控制 LED_R 互斥点亮

KEY1 控制 LED_G 互斥点亮

KEY2 控制 LED_B 互斥点亮。

中断的基本概念:

中断请求(IRQ):

        当发生某个特定事件(例如硬件信号、定时器溢出等)时,相关的外部或内部设备会向处理器发出中断请求。这种请求通知处理器有事情需要处理。

中断服务程序(ISR):

        当处理器接收到中断请求后,它会暂停当前的执行,保存当前的状态,并跳转到预先定义的中断服务程序(ISR)。ISR 是一段特定的代码,用于处理中断事件。

中断优先级:

        处理器可以为不同的中断分配不同的优先级,以决定在多个中断发生时,哪个中断首先得到处理。高优先级的中断会抢占低优先级的中断。

中断响应流程:

        中断触发:外部事件或内部条件触发中断请求。
        中断信号:处理器收到中断信号,暂停当前任务。
        保存状态:处理器保存当前执行状态,以便中断处理完成后能够恢复。
        执行 ISR:跳转到中断服务程序,处理具体的中断事件。
        恢复状态:中断处理完成后,恢复之前保存的状态,继续执行被中断的任务。

中断向量表:

        中断向量表是一个存储中断服务程序入口地址的表格。处理器通过查找中断向量表来找到并执行相应的 ISR。

中断的类型:

外部中断:

        外部中断(External Interrupt)指的是由外部事件触发的中断信号,用于处理来自微控制器外部的信号或事件。这种中断通常由外部硬件信号(如按钮、传感器或其他设备)产生,并被用于通知微控制器有重要事件需要处理。
        外部中断的配置通常涉及设置中断触发条件(例如边沿触发或电平触发)、中断优先级和使能中断请求。STM32 微控制器通过 EXTI(External Interrupt/Event Controller)模块来配置外部中断。
        外部中断广泛用于处理事件驱动任务,如按钮按下检测、外部信号捕获、时钟脉冲计数等。

 内部中断:

        由内部外设或系统模块产生的中断,如定时器溢出、USART 接收数据、ADC 转换完成等。

系统异常:

        处理器内的异常事件,如硬件故障、内存管理错误等。

在 STM32 微控制器中,中断的设置和使用通常包括以下步骤:

        配置外设或 GPIO:设置需要触发中断的外设或引脚。
        配置中断线:设置 EXTI 模块或其他中断控制器,指定中断源和触发条件。
        使能中断:在 NVIC 中使能相应的中断线,设置中断优先级。
        编写 ISR:实现中断服务程序来处理特定的中断事件。

例如,配置一个定时器中断:

// 定时器中断服务程序
void TIM1_UP_IRQHandler(void)
{if (TIM1->SR & TIM_SR_UIF)  // 检查更新中断标志{TIM1->SR &= ~TIM_SR_UIF; // 清除中断标志// 执行中断处理代码}
}
// 配置定时器并使能中断
void Timer_Init(void)
{// 初始化定时器// ...// 启用定时器中断HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);
}

外部中断回调函数:

        在 STM32 HAL 库中,HAL_GPIO_EXTI_Callback 是外部中断回调函数的标准命名。这个命名是由 HAL 库规定的,用于处理 GPIO 外部中断的回调。如果你想使用这个回调函数,你需要在你的代码中实现它,并在其中定义当外部中断触发时的具体行为。

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if (GPIO_Pin == GPIO_PIN_0){// 处理引脚 0 的外部中断}else if (GPIO_Pin == GPIO_PIN_1){// 处理引脚 1 的外部中断}// 其他引脚的处理
}

注意: 这个命名是为了确保与 HAL 库的兼容性和一致性。如果你在自定义项目中使用不同的命名,可能会影响到 HAL 库的功能调用。

HAL_GPIO_TogglePin 函数(高/低翻转):

HAL_GPIO_TogglePin 是 STM32 HAL 库中的一个函数,用于翻转(切换)指定 GPIO 引脚的状态。这意味着,如果引脚当前的电平是高(GPIO_PIN_SET),函数会将其切换为低(GPIO_PIN_RESET);如果电平是低,函数则会将其切换为高。

函数原型:

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参数: 

GPIOx      :指定 GPIO 端口。例如:GPIOA, GPIOB, GPIOC 等。这个参数决定了要操作哪个                           GPIO端口。
GPIO_Pin :指定要操作的 GPIO 引脚。可以是以下形式的掩码:GPIO_PIN_0, GPIO_PIN_1,                      GPIO_PIN_2, ..., GPIO_PIN_n(n 是引脚编号),或者多个引脚的位掩码组合,例                         如GPIO_PIN_0 | GPIO_PIN_1。 

作用是将指定的 GPIO 引脚的状态从高电平翻转为低电平,或从低电平翻转为高电平。这对于需要周期性切换引脚状态的应用非常有用,例如控制 LED 的闪烁。

 实验开始:

1.  具体的 pgio 引脚配置如下,蜂鸣器和 RGB 灯和以前一样配置,按键 KEY0(PD10) 、KEY1(PD9)、KEY2(PD8) 、WK_UP(PC13) 配置外部中断模式。配置串口 1 用于调试。

2、将按键 KEY0(PD10) 、KEY1(PD9)、KEY2(PD8) 配置为下降沿触发的外部中断模式,按键 WK_UP(PC13) 配置为上升沿触发的外部中断模式。这里举例为按键 WK_UP(PC13) 配置为上升沿触发的外部中断模式。

NVIC 使能中断线路组

(配置完生成代码)

EXTI (External Interrupt) line [9:5] 是 STM32 微控制器中的一个外部中断线路组,用于处理 GPIO 引脚 5 到 9 的外部中断请求。这一组中的每一条中断线都可以连接到对应的 GPIO 引脚,当引脚的电平发生变化时,触发相应的中断服务程序(ISR)。

3、在 HAL 库中,中断运行完后会先进入相对应的中断回调函数,处理完该函数后,才会退出中断。我们一般将中断需要处理代码会放在中断回调函数中去运行。

中断回调函数:void HAL_GPIO_EXTI_Callback*(uint16_t GPIO_Pin);

这里在 main.c 里可以定义 void HAL_GPIO_EXTI_Callback*(uint16_t GPIO_Pin); 函数编写逻辑代码,完成本实验。主函数可以空置,只需等待中断触发外部中断回调函数即可。

/* USER CODE BEGIN 4 */
// 外部中断回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{switch (GPIO_Pin){case GPIO_PIN_8: // KEY2HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_9);printf("LED_B state transition\n");break;case GPIO_PIN_9: // KEY1HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);printf("LED_G state transition\n");break;case GPIO_PIN_10: // KEY0HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_7);printf("LED_R state transition\n");break;case GPIO_PIN_13: // WK_UPHAL_GPIO_TogglePin(GPIOB, GPIO_PIN_2);printf("beep state transition\n");break;default:break;}
}
/* USER CODE END 4 */

中断优先级的配置
在 STM32 中,中断优先级通常分为两个部分:

        抢占优先级(Preemption Priority): 决定了中断之间的优先处理顺序。抢占优先级高的中断可以打断抢占优先级低的中断。
        响应优先级(Sub Priority): 决定了具有相同抢占优先级的中断的处理顺序。

 通过以下函数可以设置中断优先级:

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);

 示例:配置中断优先级

假设有三个中断源,分别是 EXTI0、EXTI1 和 EXTI2。我们希望 EXTI0 拥有最高的优先级,EXTI1 次之,EXTI2 优先级最低。可以通过以下代码设置:

// 设置 EXTI0 中断优先级为最高(抢占优先级 0,响应优先级 0)
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
// 设置 EXTI1 中断优先级为次高(抢占优先级 1,响应优先级 0)
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
// 设置 EXTI2 中断优先级为最低(抢占优先级 2,响应优先级 0)
HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);

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

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

相关文章

告别ELK,APO提供基于ClickHouse开箱即用的高效日志方案——APO 0.6.0发布

ELK一直是日志领域的主流产品,但是ElasticSearch的成本很高,查询效果随着数据量的增加越来越慢。业界已经有很多公司,比如滴滴、B站、Uber、Cloudflare都已经使用ClickHose作为ElasticSearch的替代品,都取得了不错的效果&#xff…

AOP 面向切面编程

1.准备工作&#xff0c;创建maven项目 1. pom.xml 加入依赖 <dependencies><!--spring核心坐标--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.6</version&…

算术移位的学习

术移位&#xff08;Arithmetic Shift&#xff09;是一种位移操作&#xff0c;主要用于有符号整数。它与逻辑移位相似&#xff0c;但在处理负数时有一些显著的不同。算术移位能够保持符号位的完整性&#xff0c;因此在有符号数的移位运算中非常有用。 算术移位的类型 算术左移&…

打造商业数字化生态,价值何在?

​在当今数字化时代&#xff0c;商业格局正发生着深刻变革。打造商业数字化生态&#xff0c;成为众多企业的战略选择。那么&#xff0c;它的价值究竟几何呢&#xff1f; 商业数字化生态是利用数字技术&#xff0c;将企业、消费者、合作伙伴等各方连接起来&#xff0c;形成相互依…

AI时代,谷歌会像当年的IBM一样陨落吗?

​从2015年到2024年 在2015年的某个清晨&#xff0c;阳光透过硅谷的薄雾&#xff0c;照亮了谷歌总部那标志性的入口。那时&#xff0c;谷歌正处于技术的巅峰&#xff0c;人们怀着激动的心情讨论着它如何将机器学习和人工智能&#xff08;AI&#xff09;无缝融入到所有产品中。它…

ubuntu 开启haproxy UI

一、修改haproxy.cfg nano /etc/haproxy/haproxy.cfg 添加一段 listen statsbind *:8080stats enablestats uri /uistats refresh 10sstats auth admin:123456stats admin if TRUE 重启 sudo systemctl restart haproxy 浏览器访问&#xff1a; http://192.168.31.182:80…

CMakeLists.txt 编写规则

目录 1. 注释 1.1 注释行 1.2 注释块 2. CMakeLists.txt的编写 2.1 同意目录下的源文件 2.2 SET指令 2.3 file和aux_source_directory 2.4 包含头文件 2.5 生成动态库和静态库 2.6 链接库文件 2.7 message指令 2.8 移除操作 2.9 find_library和find_package 3. 常…

Node.js初学者指南:搭建HTTP服务器、获取请求信息及响应、变量声明与NPM包管理

精神畅快&#xff0c;心气平和&#xff1b;饮食有节&#xff0c;寒暖当心&#xff1b;起居以时&#xff0c;劳逸均匀 文章目录 node.js使用http搭建服务器的问题获取请求相关的信息响应相关的信息var、let、const对比npm使用全局安装包 node.js 概念 node.js是一个基于Chrome …

渗透实战 JS文件怎么利用

1.前言 关于JS在渗透测试中的关键作用&#xff0c;想必不用过多强调&#xff0c;在互联网上也有许多从JS中找到敏感信息从而拿下关键系统的案例。大部分师傅喜欢使用findsomething之类的浏览器插件&#xff0c;也有使用诸如Unexpected.information以及APIFinder之类的Burp插件…

QT--文本框 QLineEdit、qtextedit

在Qt中&#xff0c;文本框&#xff08;QLineEdit 或 QTextEdit&#xff09;和标签&#xff08;QLabel&#xff09;是两种不同的部件&#xff08;widget&#xff09;&#xff0c;它们的主要区别在于用途和功能&#xff1a; QLabel&#xff08;标签&#xff09; 用途&#xff1…

企业数字化转型的理论指南:构建未来企业的关键策略与实践路径

数字化转型已经成为当今企业发展和市场竞争的核心驱动力&#xff0c;而在这一过程中&#xff0c;企业架构&#xff08;EA&#xff09;发挥着至关重要的作用。这本白皮书《世界级企业架构&#xff1a;建立和发展EA能力的领导者方法》提供了深入的理论指导&#xff0c;为企业如何…

专线物流公告服务平台痛点分析:重塑信任、效率与透明度的新篇章

专线物流公告服务平台痛点分析&#xff1a;重塑信任、效率与透明度的新篇章 在当今全球化的商业环境中&#xff0c;专线物流服务作为连接生产与消费的关键纽带&#xff0c;其重要性不言而喻。然而&#xff0c;随着市场竞争的加剧和消费者需求的日益多样化&#xff0c;专线物流…

禁止VMware Service进程开机自动启动

方法一&#xff1a;使用服务管理器 (Services.msc) 打开服务管理器&#xff1a; 按 Win R 打开运行对话框&#xff0c;输入 services.msc&#xff0c;然后按 Enter。 找到 VMware Authorization Service&#xff1a; 在服务列表中找到 VMware Authorization Service。 更改启动…

由云智慧发起的《数字政府统一运维 第1部分:运维平台建设指南》团标正式发布

2024年9月&#xff0c;由云智慧和中国信通院联合主导的《数字政府统一运维 第1部分&#xff1a;运维平台建设指南》团体标准完成编写&#xff0c;经中国互联网协会相关专家审查通过并准予发布&#xff0c;标准编号&#xff1a;T/ISC 0062-2024。 中国数字政府建设已经进入了高…

java高频面试题汇总

Java 基础 Java 中的序列化和反序列化是什么&#xff1f; 序列化是将 Java 对象转换为字节流的过程&#xff0c;以便可以将其存储在文件中或通过网络进行传输。反序列化则是将字节流恢复为 Java 对象的过程。通过实现 Serializable 接口&#xff0c;Java 对象可以支持序列化。…

基于Arduino的LED亮灭按键控制

一、项目简介 通过一个按键控制LED的亮灭&#xff0c;实现按键按一下LED点亮&#xff0c;再按一下LED熄灭&#xff0c;交替循环。 二、控制原理 1. 按键检测原理&#xff1a; 将Arduino的监测端口设置为输入上拉模式&#xff08;INPUT_PULLUP&#xff09;&#xff0c;用于连…

Python实现文本数据可视化:构建动态词云

引言 在信息爆炸的时代&#xff0c;如何有效地从海量的文本数据中提取关键信息并直观展示&#xff0c;成为数据分析师和研究人员面临的重要挑战。词云作为一种流行的文本可视化工具&#xff0c;通过不同大小、颜色和字体的文字展示文本中关键词的出现频率或重要性&#xff0c;…

某ai gpt的bug

某ai gpt的bug 背景 遇到了一个奇怪的现象&#xff1a; 输入内容 2024-10-21 10:09:31,052 ERROR o.a.j.t.JMeterThread: Test failed! java.lang.IllegalArgumentException:输出结果

Java应用程序的测试覆盖率之设计与实现(二)-- jacoco agent

说在前面的话 要想获得测试覆盖率报告&#xff0c;第一步要做的是&#xff0c;采集覆盖率数据&#xff0c;并输入到tcp。 而本文便是介绍一种java应用程序部署下的推荐方式。 作为一种通用方案&#xff0c;首先不想对应用程序有所侵入&#xff0c;其次运维和管理方便。 正好…

动态路由:RIP实验

1.划分IP 2.配置环回 3.接口配置IP地址 4.进入RIP中&#xff0c;关闭手工汇总&#xff0c;选择版本号&#xff0c;宣告 5.ping命令查看是否全网通 6.在R3上配置缺省路由 [R3-rip-1]default-route originate 在边界路由器上下发缺省 7.为了安全配置手工认证 [R1-Gigab…