STM32学习--中断
这里写目录标题
- 什么是中断?
- 中断的作用
- 中断的特点
- STM32与中断
- NVIC
- 中断通道
- 中断优先级
- 中断服务函数
- SysTick中断(内核中断)
- SysTick中断函数
- NVIC库函数
- NVIC初始化函数
- 抢断优先级分组
- USART使能中断
- 配置步骤(USART)
- 外部中断--EXTI
- EXTI 特性
- 外部中断/事件线
- 外部中断框图
- EXTI寄存器
- 中断挂起寄存器
- 中断屏蔽寄存器(EXTI_IMR)
- 事件屏蔽寄存器(EXTI_EMR)
- 软件中断事件寄存器 (EXTI_SWIER)![在这里插入图片描述](https://img-blog.csdnimg.cn/f6cddf2b40654851adae0f743a0233a2.png)
- 软件中断
- EXTI库函数
- EXTI初始化函数
- 清除普通标志位
- 清除中断标志位
- 获取普通标志位
- 获取中断标志位
- 产生软件中断
- SYSCFG系统配置控制器
- SYSCFG寄存器
- SYSCFG库函数
- 总结
什么是中断?
中断是一个过程,STM32正在执行一个程序,当STM32正在执行程序时,有一个外部事件或者内部事件的发生导致STM32暂停当前正在执行的程序,转而去执行由内部事件或者外部事件发生产生的中断服务程序的这样的一个过程叫做中断。
中断的作用
中断所对应的中断服务函数的优先级要高于当前main()的优先级。
例如:在流水灯程序中需要获取KEY1按下的时间,需要在while(1)循环中反复去判断KEY1是否按下,会浪费cpu资源,而引入中断的时候,会在按键按下时跳出main()去执行获取KEY1按下的时间,运行完后再回到中断前的位置继续执行,节省反复判断的cpu资源。
中断优点:节约CPU资源,提高CPU工作效率
中断缺点:保护现场时,一些寄存器的值和变量的值会保存到栈区,栈区的空间一般默认是1KB,如果保存的内容过多可能会造成栈区溢出;理解起来比较困难。
中断的特点
1、触发源:触发产生中断的事件。
2、保护现场:程序运行到发生中断的位置
3、屏蔽中断
张三正在看书,门铃响了,但是张三没有去开门;
4、挂起中断
张三正在看书,门铃响了,张三没有开门,而是等到当前页看完之后再去开门;
5、中断优先级
如果有两个以上的中断同时发生,STM32会根据每个中断的优先级来判断是哪一个中断先发生。
1)抢占优先级(可以被编程)
2)响应优先级(可以被编程)
3)自然优先级(厂家固定,无法编程)
三者的权重关系:抢占优先级权重 > 响应优先级 > 自然优先级(数值越小,优先级越高)
抢占优先级可以嵌套,响应有优先级不可以嵌套。例如:事件1:抢占优先级1、响应优先级2,事件2:抢占优先级2、响应优先级2。当事件2发生时事件1发生会产生中断。
事件1:抢占优先级2、响应优先级2,事件2:抢占优先级2、响应优先级1。
当事件2发生时事件1发生不会产生中断。
STM32与中断
NVIC
NVIC:嵌套向量中断控制器(Nested Vectored Interrupt Controller),在Cortex-M4内核之中,主要作用管理中断。
对于几乎所有的微控制器,中断都是一种常见的特性。中断一般是由硬件(如外设和外部输人引脚)产生的事件,它会引起程序流偏离正常的流程(如给外设提供服务)。
中断过程示意图:
当外设或硬件需要处理器的服务时,一般会出现下面的流程:
(1)外设确认到处理器的中断请求。
(2)处理器暂停当前执行的任务。
(3)处理器执行外设的中断服务程序(ISR),若有必要可以选择由软件清除中断请求。
(4)处理器继续执行之前暂停的任务。
所有的Cortex-M处理器都会提供一个用于中断处理的嵌套向量中断控制器(NVIC)。除了中断请求,还有其他需要服务的事件,将其称为“异常”。按照ARM的说法,中断也是一种异常。Cortex-M 处理器中的其他异常包括错误异常和其他用于OS支持的系统异常(如SVC指令)。处理异常的程序代码一般被称作异常处理,它们属于已编译程序映像的一部分。
1、由处理器产生的事件导致中断的发生,称之为系统异常-----一般不配置
2、由SysTick定时器溢出产生的事件导致中断发生,称之为溢出中断-----可以配置
3、外设会产生NMI(不可屏蔽中断)-----看门狗产生
4、外设和IO端口产生中断请求(IRQ)
(1)由外设(USART,TIM,SPI等)产生的中断称之为外设中断
(2)由GPIO输入引脚(检测边沿)产生的中断称之为外部中断----exti
Cortex-M3和Cortex-M4最多支持240个中断请求,但是一般芯片没有这么多中断请求,具体的中断请求的数量是由芯片厂商决定的,当前芯片(STM32F407)的可屏蔽中断请求为82个。
中断通道
不同的外部中断需要通过不同的通道来向NVIC发送中断请求
stm32f407的通道
中断优先级
中断优先级寄存器有4位抢占如果占1位(0和1),响应占3位(0-7)
抢占如果占3位(0-7),响应占1位(0和1)
中断服务函数
当中断请求并没有被屏蔽的时候,就会进入中断服务函数
中断服务函数特点
1、无参无返回值
2、不需要声明
不能被调用—只要中断请求经过中断通道进入NVIC,经NVIC管理之后,NVIC会自动执行相匹配的中断服务函数。
例如SysTick触发异常(中断)就会进入 SysTick_Handler函数
void SysTick_Handler(void)
{//中断服务函数体
}
SysTick中断(内核中断)
之前介绍SysTick中的CTRL的第1位就是中断中断使能位,当使能之后当计数归零的时候就会发生中断(寄存器)
SysTick中断出发的过程:计时器发出中断信号,然后通过SysTick_IRQn中断通道发送给NVIC,然后执行中断服务函数,完成中断。
SysTick中断函数
NVIC库函数
NVIC和SCB位于系统控制空间(SCS),地址从0xE000E000开始,大小为4KB。SCS中和位于系统控制空间(SCS),地址从0xE000E000开始,大小为4KB。SCS中还有SysTick定时器、存储器保护单元(MPU)以及用于调试的寄存器等。该地址区域中基本上所有的寄存器都只能由运行在特权访问等级的代码访问。唯一的例外为软件触发中断寄存器(STIR),它可被设置为非特权模式访问。
NVIC初始化函数
void NVIC_Init (NVIC_InitTypeDef *NVIC_InitStruct)
Initializes the NVIC peripheral according to the specified parameters in the NVIC_InitStruct.
根据NVIC_InitStruct结构体中的成员来初始化NVIC
抢断优先级分组
void NVIC_PriorityGroupConfig (uint32_t NVIC_PriorityGroup)
Configures the priority grouping: pre-emption priority and subpriority.
根据填入的参数分配抢占优先级的位数
USART使能中断
void USART_ITConfig (USART_TypeDef *USARTx, uint16_t USART_IT, FunctionalState NewState)
Enables or disables the specified USART interrupts.
使能USARTx的中断
配置步骤(USART)
1、开启相应使能中断标志位=》TXEIE,TCIE,RXNEIE,IDLEIE
2、配置中断优先级分组–2
3、NVIC初始化=》通道,通道使能,抢占优先级,响应优先级
外部中断–EXTI
外部中断/事件控制器包含多达 23 个用于产生事件/中断请求的边沿检测器。每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请求的状态线。
EXTI 特性
EXTI 控制器的主要特性如下:
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求
外部中断/事件线
另外七根 EXTI 线连接方式如下:
● EXTI 线 16 连接到 PVD 输出
● EXTI 线 17 连接到 RTC 闹钟事件
● EXTI 线 18 连接到 USB OTG FS 唤醒事件
● EXTI 线 19 连接到以太网唤醒事件
● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
● EXTI 线 21 连接到 RTC 入侵和时间戳事件
● EXTI 线 22 连接到 RTC 唤醒事件
外部中断框图
EXTI寄存器
中断挂起寄存器
用来检测中断是否触发触发了就置为1
中断屏蔽寄存器(EXTI_IMR)
用来屏蔽来自EXTIx的中断请求
事件屏蔽寄存器(EXTI_EMR)
用来屏蔽来自EXTIx上某个事件的请求
软件中断事件寄存器 (EXTI_SWIER)![](/assets/blank.gif)
当此中断没有被屏蔽时,产生一个虚拟的中断
软件中断
软件中断事件寄存器产生的虚拟中断请求
EXTI库函数
EXTI初始化函数
void EXTI_Init (EXTI_InitTypeDef *EXTI_InitStruct)
Initializes the EXTI peripheral according to the specified parameters in the EXTI_InitStruct.
根据EXTI_InitStruct结构体中的成员来初始化EXTI
Line :EXTI_Line0 -EXTI_Line22
Mode:
EXTI_Mode_Interrupt 中断
EXTI_Mode_Event 事件
Trigger: EXTI_Trigger_Rising 上升沿
EXTI_Trigger_Falling 下降沿
EXTI_Trigger_Rising_Falling 上升和下降
清除普通标志位
void EXTI_ClearFlag (uint32_t EXTI_Line)
Clears the EXTI’s line pending flags.
清除line标记位
清除中断标志位
void EXTI_ClearITPendingBit (uint32_t EXTI_Line)
Clears the EXTI’s line pending bits
获取普通标志位
FlagStatus EXTI_GetFlagStatus (uint32_t EXTI_Line)
Checks whether the specified EXTI line flag is set or not.
获取中断标志位
ITStatus EXTI_GetITStatus (uint32_t EXTI_Line)
Checks whether the specified EXTI line is asserted or not.
产生软件中断
void EXTI_GenerateSWInterrupt (uint32_t EXTI_Line)
Generates a Software interrupt on selected EXTI line.
SYSCFG系统配置控制器
系统配置控制器主要用于管理对可执行代码的存储区域的地址重映射、选择以太网 PHY 接口以及管理 GPIO 的外部中断线连接。
SYSCFG寄存器
比如要映射PI0引脚 就需要在CR写入1000
…
SYSCFG库函数
void SYSCFG_EXTILineConfig (uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex)
选择GPIO引脚作为外部中断输入线
总结
优先级:抢占优先级可以嵌套,响应优先级不能嵌套
中断与异常:内核事件叫异常,外设和外部产生的事件叫中断
STM32学习--中断相关推荐
- STM32学习——中断方式下的发送数据
利用中断接收数据较为简单,但利用中断去发送数据弄了半天才搞定... 注:在设置USART的控制寄存器的TE位时,会发送一个空闲帧,于是便会进入中断. 错误的做法 本来的思路是中断里的代码尽可能地少,发 ...
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...
- STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)
本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...
- 009 - STM32学习笔记 - 中断
009 - STM32学习笔记 - 中断 这节的内容,野火的官方视频我反复看了好几次,但是感觉火哥在这块讲解的特别绕,理解起来很吃力,后来在看了一下其他老师的视频,结合一些书本资料和官方手册,才搞清楚 ...
- STM32学习:外部中断
文章目录 一.STM32外部中断 1.基本知识 2.中断设计流程 二.硬件配置 1.proteus仿真电路搭建 2.CubeMX硬件配置 3.配置中断 1.寻找中断虚函数 2.中断回调函数编写 3.p ...
- STM32学习手记5 BKP后备寄存器、RTC和中断
STM32的后备寄存器: STM32共有42个16位后备寄存器,可以用来存储84个字节的用户数据.而所谓的后备寄存器,并不是真正的EEPROM.当VDD电源被切断,VBAT仍然保持供电,后备寄存器的内 ...
- stm32学习笔记----双串口同时打开时的printf()问题
stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...
- STM32学习心得十九:电容触摸按键实验及相关代码解读
记录一下,方便以后翻阅~ 主要内容 1) 电容触摸按键原理: 2)部分实验代码解读. 实验内容 手触摸按键后,LED1灯翻转. 硬件原理图 上图,TPAD与STM_ADC用跳线帽相连,即TPAD与PA ...
- STM32学习心得二十一:实时时钟RTC和备份寄存器BKP特征、原理及相关实验代码解读
记录一下,方便以后翻阅~ 主要内容 1) RTC特征与原理: 2) BKP备份寄存器特征与原理: 3) RTC常用寄存器+库函数介绍: 4) 相关实验代码解读. 实验内容: 因为没有买LCD屏,所以计 ...
最新文章
- Java反射详细介绍
- webstorm遇到的问题
- quick time不可用是什么意思_fpga是什么意思(fpga怎么用)
- 修改3389端口为3389端口
- Grafana实现zabbix数据可视化展示
- 四位七段数码管pcb_BlockPi入门教程——数码管
- Unity编辑器:自定义编辑器样式——GUIStyle
- Oracle下载账户
- 【统计学】皮尔森相关系数公式理解
- 计算机网络技术毕业生实习报告_20XX计算机网络技术毕业生实习报告1000字
- 芯片流片(晶圆制造)工艺服务的流程。 细节详解连载
- 自然辩证法概论-雨课堂
- 你中招了吗?《心理学常见误区》
- ubuntu du/eog 命令
- springboot毕设项目自驾旅游网站的设计与实现gah85(java+VUE+Mybatis+Maven+Mysql)
- linux -m32,32位gcc和64位gcc与-m32选项有什么区别?
- 优秀的汽车后市场门店应该具备的数字化能力
- react-ant 实现二级路由和三级路由
- 11月最值得关注的26个热点
- HC-05蓝牙AT指令无反应问题