STM32学习笔记(2)外部中断

发布者:a407895356最新更新时间:2022-06-22 来源: eefocus关键字:STM32  学习笔记  外部中断 手机看文章 扫描二维码
随时随地手机看文章

一、中断

1.什么是中断

操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。


为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即当CPU收到中断或者异常的事件时,打断操作系统和应用的正常执行,暂停执行当前的程序或任务,让操作系统完成外设的相关处理,在完成对这个事件的处理后,再恢复操作系统和应用的正常执行。


举个栗子,当你在读文章时忽然来了一个电话,你会先去接电话,等电话挂断后你又接着回来读文章,接电话这一过程就是执行中断。


正是由于中断机制,计算机系统才能有条不紊地“同时”完成多个任务,中断机制实质上帮助提高了并发“处理”能力。


2.名词区分

中断:处理器运行的一个状态,该状态会打断处理器当前正常的进程。

事件:就是事件,其可能触发中断。

中断事件:触发中断的事件。


举个栗子,一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或纠正等,然后继续上课。我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着上课的这个过程理解为中断或中断响应。我们把可能导致老师上课中断的学生行为理解为中断事件。


结合上面,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。事件与中断事件是包含关系,中断事件属于事件,即事件可分为中断事件或非中断事件,中断是中断事件发生的结果。


3.系统简介

STM32F103 是基于 Cortex‐M3处理器内核设计的,ST 公司(芯片制造商)在原有 CM3 内核基础上,添加了储如定时器、串口、DMA等外设,最终组合成一个STM32单片机。其中 CM3 内核是单片机(MCU)的核心,是单片机的中央处理单元(CPU)。


CM3 的所有中断机制都由 NVIC 实现。 CM3内核支持256个中断,16个内核中断,240个外部中断,并且拥有256级的可编程中断设置。但是STM32只用到了CM3内核的一部分,STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程中断优先级。


STM32F103系列只有60个可屏蔽中断。


二、中断类型

中断包括内部中断和外部中断。


内部中断是通过数时钟脉冲所引起的中断,是不可屏蔽的中断。

外部中断就是通过外部信号所引起的中断,如通过判断引脚电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。


1.定时器中断

STM32 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和TIME7 等基本定时器。


定时器中断的用处

 1.时间切片,做操作系统时钟。


 2.硬件定时。如我们要做一个计时器就可以使用定时中断来做


 3.计数与目标计数。如检测计数产量计数动作计数等,不良超标提醒。


 4.外部中断扩展。


 5.脉冲发生器与脉冲计数器。如可同时控制几个步进电机。


 6.增强系统的实时性。


涉及知识较多,将专门写一篇文章介绍


2.串口中断

当发送寄存器中的数据被全部发送出去后,产生一个中断;当接受寄存器中的收满数据时,产生一个中断。


在这里中断的意义可以类比两个人搬运货物,当一个人把货物送给另一个人后,才能进行接下来的搬运。那如何判断货物是否被送出去了,就需要中断是否被执行来判断。


3.外部中断

STM32单片机的外部中断触发方式为边沿触发,即上升沿触发和下降沿触发。

在这里插入图片描述

STM32单片机的每一个GPIO都可以被设置为外部中断输入,根据引脚序号的不同可以将外部中断分为不同的组,分别为PA0-PG0为EXTI0组,以此类推,PA15-PG15为EXTI15组,共16组,并且每一组中同一个时刻只能有一个中断源工作,所以,STM32单片机最多允许同时有16个外部中断。

STM32F103 的中断控制器支持 19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。


STM32F103 的 19 个外部中断为:

EXTI 线 0~15:对应外部 IO 口的输入中断。

EXTI 线 16:连接到 PVD 输出。

EXTI 线 17:连接到 RTC 闹钟事件。

EXTI 线 18:连接到 USB 唤醒事件。

EXTI 线 19:连接到以太网唤醒事件。


STM32外部中断相关的寄存器

初始化GPIO时要用到如下寄存器:


APB2ENR:开启GPIO时钟和复用时钟

CRH:端口配置高寄存器

CRL:端口配置低寄存器

EXTICR[0]-EXTICR[3]:外部中断配置寄存器

IMR:中断屏蔽寄存器

EMR:事件屏蔽寄存器

FTSR:下降沿触发选择寄存器

RTSR:上升沿触发选择寄存器


三.NVIC

在介绍如何配置中断优先级之前,我们需要先了解下 NVIC。

NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3 内核里面的 NVIC 进行裁剪,把不需要的部分去掉,所以说 STM32的 NVIC 是 Cortex-M3 的 NVIC 的一个子集。

NVIC中断配置函数

四、中断优先级

1.优先级定义

在NVIC中有一个专门的寄存器:中断优先级寄存器NVIC_IPRx,用来配置外部中断的优先级,IPR宽度为8位,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用了高4位。

image.png

用于表达优先级的这4bit,又被分成抢占优先级和子优先级两组。


如果有多个中断同时响应,抢占优先级高的就会先于抢占优先级低的,优先得到执行。

如果抢占优先级相同,就比较子优先级。

如果抢占优先级和子优先级都相同的话,就比较它们的硬件中断编号,编号越小,优先级越高。

2.抢占优先级和响应优先级的区别

高优先级的抢占优先级可以打断低抢占优先级的中断;而抢占优先级相同的中断,高优先级的响应优先级不可以打断低响应优先级的中断。


抢占优先级相同的中断,高响应优先级不能打断低响应优先级。


抢占优先级相同的中断,当中断同时发生时,响应级高的先执行。


抢占和响应优先级都一样则哪个中断先发生,则执行哪个。


表1

在这里插入图片描述

注意:一般优先级分组只设置一次,否则会出现中断管理混乱


五、配置外部中断(含CubeMX)

按键点灯实验


1.CubeMXSTM32外部中断配置步骤

1)晶振时钟等基础配置


2)NVIC

15和4bit那里有一定关系,和上方优先级那个表1有关3)引脚配置

有不同的模式,这里咱们选择上升沿



2.程序内 STM32外部中断实现步骤

1)使能 IO 口时钟。


2)调用函数 HAL_GPIO_Init 设置 IO 口模式,触发条件,初始化GPIO为输入。


3)使能 SYSCFG 时钟(开启复用时钟)以及设置 IO口与中断线的映射关系。


4)配置中断优先级(NVIC),并使能中断。


5)在中断服务函数中调用外部中断共用入口函数

HAL_GPIO_EXTI_IRQHandler,设置触发条件。


6)编写外部中断回调函数 HAL_GPIO_EXTI_Callback(中断要做的事在此处执行)。


六、程序实现

在main.c中添加中断服务对象


/* USER CODE BEGIN 4 */

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if(GPIO_Pin == GPIO_PIN_3)

  {

HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);

  }


}

/* USER CODE END 4 */


注意:中断里不可以加延时HAL_Delay(),但可以用其他方法达到延时的效果

关键字:STM32  学习笔记  外部中断 引用地址:STM32学习笔记(2)外部中断

上一篇:STM32学习笔记(1) GPIO初始化及点亮LED
下一篇:STM32F072RB 实作笔记(六)- 计时器加上中断EXTI_IRQHandler(二)

推荐阅读最新更新时间:2024-11-13 12:26

GP2Y10驱动含PM2.5和AQI(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 GP2Y10模块:淘宝有售 二、实验效果 三、驱动原理 主要就是采集AD电压,对应转换公式做相关的转换。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 gp2y10.h #ifndef __GP2Y10_H__ #define __GP2Y10_H__ #include stm32f10x.h #include gpio.h #include delay.h #include uart.h #define GP2Y10_CONTROL PAout(0) #defin
[单片机]
GP2Y10驱动含PM2.5和AQI(<font color='red'>STM32</font>)
STM32 SYSTICK
void SysTick_Config(void);//SysTick定时器配置 void Delay_Ms(u32);//定时时间配置 void void SysTickHandler(void);//中断定时时间处理函数 static vu32 TimingDelay;//中断处理函数 //SysTick设置 void SysTick_Config(void) { SysTick_CounterCmd(SysTick_Counter_Disable); SysTick_ITConfig(DISABLE); SysTick_
[单片机]
2023 STM32全国巡展,米尔限量发STM32MP135开发板优惠券
2023年9月12日至10月27日,以“STM32,不止于芯”为主题的第十六届STM32全国巡回研讨会将走进11个城市,本届研讨会为全天会议,我们将围绕STM32最新产品开展技术演讲和方案演示。 本次STM32全国研讨会,米尔电子将现场展出STM32相关的最新产品技术和应用演示,为工程师们提供共话交流共同探索开放式平台,届时,米尔电子的技术工程师将与各位嘉宾面对面深入交流。感兴趣的客户和朋友欢迎莅临参观了解! 米尔电子的明星产品将精彩亮相 米尔MYC-YF13X 核心板及开发板 基于STM32MP1系列MPU,STM32MP135高性价比入门级MPU设计平台,完整的安全生态系统让MCU开发者友好地过渡到MPU平
[单片机]
2023 <font color='red'>STM32</font>全国巡展,米尔限量发STM32MP135开发板优惠券
STM32的LCD驱动编写思路
STM32开发板有很多配套LCD例程,如下图就是开发板上最常见的一种TFTLCD屏。商家会给封装好一些LCD函数,大家能学会如何点亮一个LCD。 在主函数中加入上述代码就可以轻松实现输出字符串、画矩形块、清屏等效果。 但是这些例程代码或许有下面的问题: 分层不清晰,通俗讲就是模块化太差 接口乱,只要接口不乱,分层就会好很多了 可移植性差 通用性差 为什么这样说呢?如果你已经了解了LCD的操作,请思考如下情景: 代码空间不够,只能保留9341的驱动,其他LCD驱动全部删除。能一键(一个宏定义)删除吗?删除后要改多少地方才能编译通过? 有一个新产品,收银设备。系统有两个LCD,都是OLED,驱动IC相同,但是一个是128x64
[单片机]
<font color='red'>STM32</font>的LCD驱动编写思路
stm32指令集合不区分大小写
单片机中接收到奥串口的指令一般为字符串,如果使用strncmp比较是否为我们的指令集中的指令,则不能区分大小写,这里可以使用strcasecmp( )函数和strncasecmp( )函数,来对接收到的字符串指令进行接收比较,并且可以不区分大小写,包含头文件include“stdio.h” 下面对strcasecmp( )函数和strncasecmp( )函数的原型以及应用进行介绍: strcasecmp( )函数说明: strcasecmp()用来比较参数s1和s2字符串,比较时会自动忽略大小写的差异。 返回值 若参数s1和s2字符串相同则返回0。s1长度大于s2长度则返回大于0 的值,s1 长度若小于s2 长度则返回小
[单片机]
贸泽率先独家备货STMicroelectronics的STM32 LoRaWAN 探索板
最新半导体和电子元件的全球授权分销商贸泽电子(Mouser Electronics) 即日起率先备货STMicroelectronics (ST)的STM32 LoRaWAN™ 探索板。这款新型探索套件与可从贸泽电子订购的Arduino兼容I-NUCLEO-LRWAN1 STM32 LoRa™扩展板一起作为一个平台,用于了解和评估基于LoRa和FSK/OOK 射频 (RF) 通信的解决方案。         贸泽电子独家备货的 ST STM32 LoRaWAN探索套件基于一体化开放式 Murata Type ABZ模块,支持低功率广域网(LPWAN) 和LoRaWAN 远程无线协议。Type ABZ模块包含一个具有192 KB 闪
[单片机]
ARM学习笔记002之gcc-4.3.2编译器不支持硬件除法运算的解决方
一般如果gcc不能使用除法,make后的错误是: 每一个错误处都使用了除法。 我的makefile代码如下: CC = arm-linux-gcc LD = arm-linux-ld AR = arm-linux-ar OBJCOPY = arm-linux-objcopy OBJDUMP = arm-linux-objdump INCLUDEDIR := $(shell pwd)/include CFLAGS := -Wall -O2 CPPFLAGS := -nostdinc -I$(INCLUDEDIR) export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR
[单片机]
ARM<font color='red'>学习</font><font color='red'>笔记</font>002之gcc-4.3.2编译器不支持硬件除法运算的解决方
GD32单片机和STM32单片机的区别
一、前言 什么GD32? GD32是国内开发的一款单片机,据说开发的人员是来自ST公司的,GD32也是以STM32作为模板做出来的。 所以GD32和STM32有很多地方都是一样的,不过GD32毕竟是不同的产品,不可能所有东西都沿用STM32,有些自主开发的东西还是有区别的。相同的地方我们就不说了,下面我给大家讲一下不同的地方。 二、区别 1、内核 GD32采用二代的M3内核,STM32主要采用一代M3内核,下图是ARM公司的M3内核勘误表,GD使用的内核只有752419这一个BUG。 2、主频 使用HSE(高速外部时钟):GD32的主频最大108M,STM32的主频最大72M 使用HSI(高速内部时钟):GD32的主频最大10
[单片机]
GD32单片机和<font color='red'>STM32</font>单片机的区别
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved