草庐IT

STM32学习--中断

GHFR233 2024-05-31 原文

这里写目录标题

什么是中断?

中断是一个过程,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)

当此中断没有被屏蔽时,产生一个虚拟的中断

软件中断

软件中断事件寄存器产生的虚拟中断请求

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学习--中断的更多相关文章

  1. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. ruby - ruby 乘法语句中星号中断语法前的空格 - 2

    在添加一些空格以使代码更具可读性时(与上面的代码对齐),我遇到了这个:classCdefx42endendm=C.new现在这将给出“错误数量的参数”:m.x*m.x这将给出“语法错误,意外的tSTAR,期待$end”:2/m.x*m.x这里的解析器到底发生了什么?我使用Ruby1.9.2和2.1.5进行了测试。 最佳答案 *用于运算符(42*42)和参数解包(myfun*[42,42])。当你这样做时:m.x*m.x2/m.x*m.xRuby将此解释为参数解包,而不是*运算符(即乘法)。如果您不熟悉它,参数解包(有时也称为“spl

  6. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  7. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  8. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  9. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  10. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

随机推荐