STM32之中断

一、提高程序实时性的架构方案

  1. 轮询式

指的是在程序运行时,首先对所有的硬件进行初始化,然后在主程序中写一个死循环,需要运行的功能按照顺序进行执行,轮询系统是一种简单可靠的方式,一般适用于在只需要按照顺序执行的并且没有外部事件的影响的情况下。

    //自定义延时函数    
void Delay();    
int main()   {    
//1.硬件初始化    
LED_Init();    
BEEP_Init();    
KEY_Init();    
//2.进入死循环   for(;;)    
{    
//判断按键状态,导致程序的实时性较差    
if(KEY0 == 0 )  {
//控制BEEP发声   GPIO_SetBits();    
Delay(50);   //50ms    
//控制LED点亮GPIO_ResetBits();    
Delay(100);  //100ms   
}     }    }
  1. 前后台

相比于轮询系统,前后台系统增加中断的概念,如果外部事件发生,则在中断中进行处理,主程序在轮询系统中运行,中断被称为前台,主程序中的while(1)就称为后台。中断会终止后台程序的运行,然后跳转到对应的中断服务函数中去处理,处理完成后,在继续执行后台的程序。使用前后台系统可以极大程度的提高程序的实时响应能力,避免造成外部事件的缺失。

//定义信号的回调函数,该函数不需要调用 
void signal_handler(int signum) 
{ 
//定义状态机 
switch(signum){ 
case SIGUSR1: xxxx;break;case SIGUSR2: xxxx; 
break; ..... 
} } 
int main(){ 
//1.硬件初始化 
LED_Init(); 
BEEP_Init(); 
KEY_Init(); 
//2.注册信号,进程收到该信号,会触发信号的回调函数,此时会中断当前程序 
signal(SIGUSR1, signal_handler); 
//3.进入死循环 
for(;;) 
{ 
//控制BEEP发声GPIO_SetBits(); 
Delay(50); //50ms 
//控制LED点亮 
GPIO_ResetBits(); 
Delay(100); //100ms } }
  1. 多任务

相比于前后台系统,多任务系统的外部事件也是在中断中进行响应,但是外部事件的处理是任务中进行处理。任务具有优先级,优先级高的任务先处理,所以程序就会被分割为一个个的任务,任务是一个独立的死循环,并且不能返回,可以由操作系统进行任务的调度,程序段的实时响应能力又得到提升。

//定义信号的回调函数,该函数不需要调用 
void signal_handler(int signum) 
{ 
//定义状态机 
switch(signum) 
{case SIGUSR1: xxxx;break; 
case SIGUSR2: xxxx; 
break; ..... 
} } 
//线程的任务 
void thread_task(void * arg) 
{ 
for(;;){//控制LED点亮 
GPIO_ResetBits();Delay(100); //100ms 
} } 
int main(){ 
//1.硬件初始化LED_Init(); 
BEEP_Init(); 
KEY_Init(); 
//2.注册信号,进程收到该信号,会触发信号的回调函数,此时会中断当前程序 
signal(SIGUSR1, signal_handler); 
//4.创建子线程 
pthread_create(&id,NULL,thread_task,NULL);//3.进入死循环 
for(;;) 
{ 
//控制BEEP发声 
GPIO_SetBits(); 
Delay(50); //50ms } }

二、MCU中断的原理与应用

  • 中断的概念

中断指的是CPU来处理和响应外部发生的异常,中断也就意味着打断,比如打断正在做的事,然后去处理一个紧急的事,处理完成后在继续做刚才没做完的事。

  • 中断源分析

中断源指的是异常发生的源头,中断源在内核中已经定义好了,中断源表也称为中断向量表,向量表在STM32F4中文参考手册参考。

上图中的表格就是STM32F4系列的异常向量表,对于STM32F407xx有82个可屏蔽异常!!!!

  • 中断的管理

NVIC指的是嵌套向量中断控制器,属于内核中的外设,作用是管理所有的中断,比如中断的使能或失能、中断的优先级.....。

不管是Cortex A系列还是Cortex M系列的内核内部均有NVIC,通过NVIC管理内核异常和外部异常。

NVIC管理中断通道的打开与关闭,可以把NVIC理解为负责管理所有中断的开关,想要使用中断发送中断请求,就必须提前打开中断的通道。关于NVIC的使用都存储在一个结构体中,这个结构体和NVIC的函数接口都定义在misc.c和misc.h中。

  • 中断的顺序

NVIC利用4bit的优先级来管理所有的中断通道,STM32中断的优先级分为两种:抢占式优先级(主优先级) + 响应式优先级(子优先级),有16个优先级(0~15),数字越小,优先级越高。

意义:如果同时发生多个中断请求,但是又不能同时处理,就根据中断请求的优先级来处理和响应中断。

抢占优先级(主优先级):抢占优先级高的中断可以打断正在执行的抢占优先级低的中断!!!

响应优先级(子优先级):在同时发生多个中断的情况下,响应优先级高的中断可先执行!!!

  1. 抢占优先级高的中断可以打断正在执行的抢占优先级低的中断
  2. 抢占优先级相同的中断同时发生,响应优先级高的中断先执行
  3. 抢占优先级相同的多个中断发生,响应优先级高的中断不能打算响应优先级低的中断
  4. 抢占优先级和响应优先级相同的多个中断同时发生,则按照向量表的中断编号来执行

为了方便用户管理和响应中断,NVIC需要对中断优先级进行分组,这样用户可以方便配置

注意:该函数必须在主程序的入口进行调用,并且整个项目应该只调用一次,因为设置好优先级分组之后就不应该随意更改分组,否则中断管理比较混乱,另外用户在设置中断优先级的时候应该遵守分组对应的优先级范围。

三、EXTI外设的基本原理与应用

  • 基本概念

EXTI指的是外部中断/事件控制器,一共有23个,每个都有一个内部的边沿检测器,可以检测上升沿或者下降沿,每根线都可以产生事件或者中断。

注意:每个GPIO引脚都可以配置为外部中断,但是和GPIO相关的外部中断线一共有16根,分别为EXTI0~EXTI15。

  • 基本原理

思考:STM32F407系列有114个GPIO口,那如何和外部中断线进行关联?通过映射的方式

注意:STM32F407所有IO口都可以设置为外部中断,但是必须把GPIO引脚配置为输入模式。

  • 程序设计
  1. 把EXTI外设的源文件以及SYSCFG外设的源文件添加到项目工程中,具体操作如下所示:

  1. 参考ST公司提供的外设的源文件的开头的注释以及参数ST公司提供的关于外设的例程

  1. 打开GPIOA端口时钟(因为KEY0按键对应的引脚PA0)以及SYSCFG外设时钟(映射)!

  1. 配置GPIOA端口PA0引脚的模式为输入模式,因为需要利用该引脚检测外部事件,如下

  1. 利用SYSCFG外设的寄存器对GPIOA端口的引脚PA0以及EXTI0建立映射关系(自动建立)

  1. 定义EXTI外设的结构体变量,对结构体成员初始化(编号+模式+边沿+状态),如下图

  1. 配置EXTI外设的中断,需要使用NVIC外设管理中断的通道以及中断的优先级,如下图

  1. 对EXTI中断通道配置完成后,需要编写对应的中断服务函数,中断服务函数的格式固定

注意:ISR中断服务函数的名字是已经提前定义在启动文件中向量表内,启动文件是在程序运行之前先运行的一个汇编文件(xxx.s结尾的),用户在选择使用某个外设的中断的时候,必须从启动文件中复制中断服务函数的名称,比如EXTI0外部中断线的中断服务函数名字是EXTI0_IRQHandler

启动文件的意思是在程序运行之后第一个被执行的文件,启动文件是使用汇编语言实现的,启动文件会对系统的堆栈空间进行初始化、以及会对系统的时钟进行初始化、以及会设置向量表的ISR地址,最后会跳转到标准C库的main函数中。

启动流程:堆栈空间初始化 ---> 设置中断向量表 ---> 系统时钟初始化 ---> 跳转到主函数

  1. 堆栈空间的初始化

  1. 设置中断向量表

中断向量表其实是用于记录异常的ISR中断服务程序的地址,向量表的本质就是一个指针数组,数组中的每个成员都是一个地址(ISR的地址),但是数组中每个元素本身也有地址,不要把地址搞混。

STM32F4的中文参考手册中记录了向量表中每个元素的地址,然后每个元素的地址下都会存储对应的异常的ISR的地址。

  1. 系统时钟的初始化

复位也属于异常,所以在MCU复位之后,CPU会自动跳转到复位的ISR函数执行,复位异常的ISR函数已经定义在启动文件中,ISR中会对系统的时钟进行初始化,并且会跳转到main函数。

提示:ISR中断服务程序的结构是固定,是不允许有返回值,以及不允许有参数,结构如下:

void PPP_IRQHandler(void) {

}

注意:如果需要使用异常,就一定要在汇编文件外部定义异常的ISR程序,并且ISR函数名称必须和启动文件的向量表中的异常名称一致,如果不一致,则会导致程序死循环!!!!!

注意:当异常发生后,CPU会跳转到异常的ISR程序进行执行,ISR程序应该精简,执行的越快越好。如果异常确实要使用较多代码解除,则可以选择回到后台对异常进行解决,可以选择采用状态机思想实现。

//定义全局变量,作为中断标志位 
int key_flag = 0; 
int main(void) 
{ 
//1.硬件初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); //优先级分组 
BEEP_Init(); //蜂鸣器初始化KEY0_Init(); //机械按键初始化 
//属于后台 
while(1) 
{ 
//设计状态机,在后台对异常的动作进行执行 
if(key_flag == 1) 
{ 
//重置标志,防止多次触发key_flag = 0; 
//执行动作 
} } } 
/** * @brief This function handles External line 0 interrupt request. * @param None * @retval None * 
@note ISR程序不应该手动调用,ISR程序要精简 
*/void EXTI0_IRQHandler(void){ 
//判断中断是否触发 
if(EXTI_GetITStatus(EXTI_Line0) != RESET) 
{ //中断标志成立 
key_flag = 1; 
//清除中断状态 
EXTI_ClearITPendingBit(EXTI_Line0); } }

作业:利用中断机制实现对开发板的4个按键的检测,另外要求了解4*4矩阵键盘的原理,并提供状态机方式实现16个按键的检测。

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

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

相关文章

LLM应用开发平台资料

课程和代码资料 放下面了,自取: https://pan.quark.cn/s/57a9d22d61e9

硬盘健康检测与性能测试的实践指南

在日常使用 Windows 系统的过程中,我们常常需要借助各种工具来优化性能、排查问题或管理文件。针对windows工具箱进行实测解析,发现它整合了多种实用功能,能够帮助用户更高效地管理计算机。 以下为测试发现的功能特性: 硬件信息查…

正则表达式进阶(三):递归模式与条件匹配的艺术

在正则表达式的高级应用中,递归模式和条件匹配是处理复杂嵌套结构和动态模式的利器。它们突破了传统正则表达式的线性匹配局限,能够应对嵌套括号、HTML标签、上下文依赖等复杂场景。本文将详细介绍递归模式((?>...)、 (?R) 等&#xff0…

从零开始创建React项目及制作页面

一、React 介绍 React 是一个由 Meta(原Facebook) 开发和维护的 开源JavaScript库,主要用于构建用户界面(User Interface, UI)。它是前端开发中最流行的工具之一,广泛应用于单页应用程序(SPA&a…

【前端部署】通过 Nginx 让局域网用户访问你的纯前端应用

在日常前端开发中,我们常常需要快速将本地的应用展示给局域网内的同事或测试人员,而传统的共享方式往往效率不高。本文将指导你轻松地将你的纯前端应用(无论是 Vue, React, Angular 或原生项目)部署到本地,并配置局域网…

【Python装饰器深潜】从语法糖到元编程的艺术

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心概念图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:基础计时装饰器案…

mbed驱动st7789屏幕-硬件选择及连接(1)

目录 1.整体介绍 2. 硬件选择 2.1 mbed L432KC 2.2 ST7789 240*240 1.3寸 3. mbed与st7789的硬件连接 4. 总结 1.整体介绍 我们在使用单片机做一些项目的时候,交互性是最重要的因素。那么对于使用者而言,交互最直接的体现无非就是视觉感知,那么我们希望将项目通过视觉…

SpringBoot集成Jasypt对数据库连接密码进行加密、解密

引入依赖 <!--配置密码加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency><plugin><groupId>c…

分类器引导的条件生成模型

分类器引导的条件生成模型 分类器引导的条件生成模型1. **基本概念**2. **核心思想**3. **实现步骤&#xff08;以扩散模型为例&#xff09;**4. **优点**5. **挑战与注意事项**6. **应用场景**7. **数学推导**总结 分类器引导的条件生成模型 分类器引导的条件生成模型是一种通…

WPF中的ObjectDataProvider:用于数据绑定的数据源之一

ObjectDataProvider是WPF(Windows Presentation Foundation)中一种强大而灵活的数据绑定源&#xff0c;它允许我们将对象实例、方法结果甚至是构造函数的返回值用作数据源。通过本文&#xff0c;我将深入探讨ObjectDataProvider的工作原理、使用场景以及如何在实际应用中发挥其…

lasticsearch 报错 Document contains at least one immense term 的解决方案

一、问题背景 在使用 Elasticsearch 存储较大字段数据时&#xff0c;出现如下异常&#xff1a; ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonDocument contains at least one immense term in field"fieldZgbpka"…

[目标检测] YOLO系列算法讲解

前言 目标检测就是做到给模型输入一张图片或者视频&#xff0c;模型可以迅速判断出视频和图片里面感兴趣的目标所有的位置和它 的类别&#xff0c;而当前最热门的目标检测的模型也就是YOLO系列了。 YOLO系列的模型的提出&#xff0c;是为了解决当时目标检测的模型帧率太低而提…

服务器操作系统时间同步失败的原因及修复

服务器操作系统时间同步失败可能导致日志记录不准确、安全证书失效等问题。以下是常见原因及对应的修复方法&#xff1a; ### 一、时间同步失败的常见原因 1. **网络连接问题** - NTP服务器无法访问&#xff08;防火墙阻止、网络中断&#xff09; - DNS解析失败或网…

Cribl 中function 使用过滤的特殊case:Parser + rename

Cribl 利用function 对parser 进行特殊过滤处理: Parser Function – Fields Filter Expression​ When you use the Stream Parser Functions Reserialize option, there is a special option that becomes available, called the Fields Filter Expression. This is basica…

inverse-design-of-grating-coupler-3d

一、设计和优化3D光栅耦合器 1.1 代码讲解 通过预定义的环形间距参数(distances数组),在FDTD中生成椭圆光栅结构,并通过用户交互确认几何正确性后,可进一步执行参数扫描优化。 # os:用于操作系统相关功能(如文件路径操作) import os import sys# lumapi:Lumerical 的…

TuyaOpen横空出世!涂鸦智能如何用开源框架重构AIoT开发范式?

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引子:AIoT开发的“不可能三角”被打破 当AI与物理世界深度融合的浪潮席卷全球,开发者们却始终面临一个“不可能三角”——开发效率、技术深度与商业化落地难以兼得。 …

智慧赋能光伏运维——无人机巡检+地面监控双链路覆盖,打造光伏电站管理新标杆

一、引言&#xff1a;光伏电站运维的挑战与机遇 在全球能源转型浪潮下&#xff0c;光伏电站作为清洁能源的重要载体&#xff0c;其高效运维管理成为行业核心命题。然而&#xff0c;传统光伏电站运维存在覆盖范围广、设备分散、人工巡检效率低、故障响应慢等痛点。为破解这一难…

前端无感登录刷新

前端实现无感登录 在现代的前端开发中&#xff0c;用户体验是非常重要的一环。无感登录&#xff08;也叫自动登录&#xff09;就是其中一个提升用户体验的关键功能。它的目标是让用户在登录后&#xff0c;即使关闭浏览器或长时间不操作&#xff0c;也能在下次访问时自动登录&a…

JAVASE查漏补缺

这段时间学习了很多知识&#xff0c;好多还有疑问不清楚的地方。今天有空总结一下。 javame,javase,javaee 一、Java ME&#xff08;Micro Edition&#xff0c;微型版&#xff09; Java ME是一种适用于移动设备和嵌入式系统的小型Java平台&#xff0c;具有高度可移植性和跨平…

【设计模式】基于 Java 语言实现工厂模式

目录 一、简单工厂模式 1.1 简单工厂模式的介绍 二、工厂方法模式 2.1 工厂方法模式的介绍 2.2 工厂方法模式的基本实现 2.3 工厂方法模式的应用场景 三、抽象工厂 3.1 抽象工厂的概念 3.2 抽象工厂的基本结构 3.3 抽象工厂的基本实现 3.4 抽象工厂的应用场景 四、…