STM32中断控制全解

合集下载

stm32单片机中断原理

stm32单片机中断原理

STM32单片机中断原理1. 什么是中断?在计算机系统中,中断是一种硬件或软件的事件,它打断了正在执行的程序,使CPU能够立即响应某个特定的事件。

中断机制是一种实现多任务处理的重要技术,它能够提高系统的响应速度和处理效率。

2. 中断的基本原理中断的基本原理是通过打断正在运行的程序,跳转到一个中断服务程序(ISR,Interrupt Service Routine)来处理特定的事件。

当发生中断时,CPU会暂停当前的任务,保存上下文(包括程序计数器、寄存器等),然后跳转到中断服务程序执行。

中断服务程序完成后,CPU会恢复之前的任务继续执行。

3. STM32中断的分类在STM32单片机中,中断可以分为两类:外部中断和内部中断。

•外部中断:是由外部设备(如按键、传感器等)触发的中断。

STM32单片机通常具有多个外部中断引脚,可以通过配置外部中断触发源来响应外部设备的事件。

•内部中断:是由单片机内部的事件触发的中断。

例如,定时器溢出、串口接收完成等。

4. STM32中断的基本原理为了使用中断功能,需要进行以下几个步骤:步骤1:中断向量表的配置中断向量表是一个存储中断服务程序地址的表格,用于指示中断发生时应该跳转到哪个中断服务程序执行。

在STM32单片机中,中断向量表位于Flash的起始地址处。

需要在代码中定义中断向量表,并将每个中断的中断服务程序地址写入相应的中断向量表项。

步骤2:中断优先级的配置每个中断都有一个优先级,用于确定中断的相对重要性。

在STM32单片机中,中断优先级可以通过设置优先级分组和优先级子组来进行配置。

优先级分组决定了中断优先级的位数和分配方式,优先级子组决定了同一分组内部的优先级划分。

步骤3:中断源的配置在STM32单片机中,可以通过配置寄存器来选择特定的中断源。

例如,可以通过配置GPIO的寄存器来选择某个引脚触发的外部中断源。

步骤4:中断服务程序的编写中断服务程序是中断发生时需要执行的代码。

STM32事件中断事件中断的详解

STM32事件中断事件中断的详解

STM32事件中断事件中断的详解凡从事过ST MCU应用开发的人往往会遇到事件、中断事件中断三个概念或术语。

这三个概念彼此关联,有时会让人有点混淆或犯迷糊。

先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。

比如一老师在教室里给学生们上课。

课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或纠正等,然后继续上课。

我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着上课的这个过程理解为中断或中断响应。

我们把可能导致老师上课中断的学生行为理解为中断事件。

结合上面的比方,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。

事件与中断事件是包含关系,即事件可分为中断事件或非中断事件。

而中断事件与中断之间属于前后关联的因果关系,虽有关联,但二者在时序上、行为上并不一样。

结合具体的ST MCU运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。

当然这些中断事件最终能否触发后续中断,得看是否开启了该中断事件的中断使能,相关中断矢量控制器【NVIC】是否配置,最终让CPU内核参与进来,并完成后续的中断服务动作。

不妨借助STM32 MCU的GPIO的外部事件与中断控制器的框图来理解上述概念。

从上图可以看出,不论外部电平变化成为中断事件还是非中断事件,绿色方框部分都是一样的,即具有相同的触发源。

stm32中断程序

stm32中断程序

stm32中断程序STM32是一款非常强大的微控制器系列,它的应用范围非常广泛,包括智能家居、汽车电子、医疗器械等等。

在STM32中,中断是非常重要的一个概念。

本文将详细介绍STM32中的中断程序。

一、中断的基本概念中断是指在程序执行过程中,某些硬件或软件条件满足时,CPU通过改变程序的执行顺序,转去执行相应的处理程序,处理完毕后再返回原程序继续执行。

换句话说,中断是指CPU在执行主程序时,暂停执行当前的指令序列,执行一段中断处理程序,处理完毕后再返回原处继续执行主程序。

二、STM32的中断控制器STM32的中断控制器是NVIC(Nested Vectored Interrupt Controller),它集成在Cortex-M3内核中。

NVIC可以处理中断请求,也可以管理中断优先级,它可以同时处理256个中断请求,并支持嵌套中断。

三、中断向量表中断向量表是一个表格,它里面存放着中断处理程序的入口地址。

在STM32中,中断向量表是存放在Flash中的,被称为向量表区或者中断向量表区。

向量表区的大小是固定的,为48字节(即12个中断)或者1024字节(即256个中断),它的起始地址是0x08000000或者0x00000000(取决于Flash的底层硬件设计)。

四、中断服务程序的编写中断服务程序可以分为两个部分:中断处理和中断返回。

中断处理是指具体的中断处理代码,中断返回则是指恢复现场并退出中断的代码。

在STM32中,中断服务程序的函数原型如下:void EXTIx_IRQHandler(void)其中,x表示中断源的编号,范围从0到15。

EXTI表示是外部中断。

在开发STM32中断程序之前,需要实现中断控制器的配置。

步骤如下:(1)设置中断向量表的首地址在开发环境中,中断向量表的首地址已经被定义好了。

如果在自定义的应用程序中需要重新设置中断向量表的首地址,可以使用以下代码:NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x10000);其中,NVIC_VectTab_FLASH表示中断向量表的首地址存储在Flash中,0x10000表示中断向量表的起始地址。

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解

STM32中断优先级彻底讲解stm32目前支持的中断共为84个(16个内核+68个外部),16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。

二:优先级推论stm32(cortex-m3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。

具备低抢占市场式优先级的中断可以在具备高抢占市场式优先级的中断处理过程中被积极响应,即为中断嵌套,或者说低抢占市场式优先级的中断可以嵌套高抢占市场式优先级的中断。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序同意先处置哪一个。

三:优先级分组既然每个中断源都须要被选定这两种优先级,就须要存有适当的寄存器位记录每个中断的优先级;在cortex-m3中定义了8个比特位用作设置中断源的优先级,这8个比特位在nvic应用领域中断与登位掌控递丛器(aircr)的中断优先级分组域中,可以存有8种分配方式,如下:所有8位用于指定响应优先级最低1十一位用作选定抢占市场式优先级,最高7十一位用作选定积极响应优先级最低2十一位用作选定抢占市场式优先级,最高6十一位用作选定积极响应优先级最低3十一位用作选定抢占市场式优先级,最高5十一位用作选定积极响应优先级最低4十一位用作选定抢占市场式优先级,最高4十一位用作选定积极响应优先级最低5十一位用作选定抢占市场式优先级,最高3十一位用作选定积极响应优先级最低6十一位用作选定抢占市场式优先级,最高2十一位用作选定积极响应优先级最低7十一位用作选定抢占市场式优先级,最高1十一位用作选定积极响应优先级这就是优先级分组的概念。

stm32中如何开关总中断

stm32中如何开关总中断

stm32中如何开关总中断在STM32/Cortex-M3 中是通过改变CPU 的当前优先级来允许或禁止中断。

PRIMASK 位:只允许 NMI 和 hard fault 异常,其他中断/ 异常都被屏蔽(当前 CPU 优先级=0)。

FAULTMASK 位:只允许NMI,其他所有中断/异常都被屏蔽(当前 CPU 优先级=-1)。

在 STM32 固件库中(stm32f10x_nvic.c 和 stm32f10x_nvic.h) 定义了四个函数操作 PRIMASK 位和FAULTMASK 位,改变 CPU 的当前优先级,从而达到控制所有中断的目的。

下面两个函数等效于关闭总中断:void NVIC_SETPRIMASK(void);void NVIC_SETFAULTMASK(void);下面两个函数等效于开放总中断:void NVIC_RESETPRIMASK(void);void NVIC_RESETFAULTMASK(void);上面两组函数要成对使用,不能交叉使用。

例如:第一种方法:NVIC_SETPRIMASK(); //关闭总中断NVIC_RESETPRIMASK(); //开放总中断第二种方法:NVIC_SETFAULTMASK(); //关闭总中断NVIC_RESETFAULTMASK(); //开放总中断常常使用NVIC_SETPRIMASK(); // Disable InterruptsNVIC_RESETPRIMASK(); // Enable Interrupts-------------------------------------------------------------------------------------------------在 3.0 的库中已经没有第一种方法:NVIC_SETPRIMASK(); //关闭总中断NVIC_RESETPRIMASK(); //开放总中断第二种方法:NVIC_SETFAULTMASK(); //关闭总中断NVIC_RESETFAULTMASK(); //开放总中断补充可以用#define CLI() __set_PRIMASK(1)#define SEI() __set_PRIMASK(0)。

简述stm32f1单片机中断管理过程

简述stm32f1单片机中断管理过程

简述stm32f1单片机中断管理过程
STM32F1 单片机是一种常用的嵌入式系统芯片,其中断管理过程如下:
1. 中断控制器 (INTC)
STM32F1 单片机内置一个 8 位的中断控制器 (INTC),用于管理中断请求。

INTC 由一个中断向量表和四个中断源寄存器组成。

其中,中断向量表中包含了所有可用的中断源及其对应的中断号,而四个中断源寄存器则分别记录了当前中断源的启用状态。

2. 中断请求的发送和响应
当外部设备需要使用中断时,会通过中断线向 INTC 发送中断请求信号。

INTC 接收到中断请求信号后,会将中断请求信息写入相应的中断源寄存器中,告知 CPU 中断请求已经发生。

然后,CPU 会暂时停止当前程序的执行,转向执行中断处理程序 (ISR)。

3. 中断处理程序 (ISR)
ISR 是中断处理程序的缩写,用于处理中断请求。

ISR 通常会将当前程序的状态保存到堆栈中,然后将中断请求信号清除,以便下一次中断发生时能够正常响应。

此外,ISR 还可能执行一些与中断请求无关的操作,例如读写外部存储器等。

4. 中断请求的撤销
在中断处理程序执行完毕后,CPU 会恢复中断请求信号,并继续执行被中断的程序。

如果需要在中断处理程序结束后撤销中断请求,可以通过向 INTC 发送特定的中断撤销信号来实现。

STM32F1 单片机的中断管理过程是一个复杂的过程,需要 CPU 和中断控制
器的协同工作。

通过中断机制,STM32F1 单片机可以实现对外部设备的高效管理和控制,提高系统的性能和响应速度。

STM32中按键中断分析

STM32中按键中断分析

STM32中按键中断分析 在按键学习中,我们有⽤到查询的⽅法来判断按键事件是否发⽣,这种查询按键事件适⽤于程序⼯作量较少的情况下,⼀旦程序中⼯作量较⼤较多,则势必影响程序运⾏的效率,为了简化程序中控制的功能模块的执⾏时间,引⼊中断控制就很有必要,,⼀旦有中断时间发⽣,则程序⽴马跳转到中断向量的执⾏程序中,执⾏完成后就恢复到正常的程序状态。

在STM32F中采⽤中断控制器NVIC来设定中断。

按照中断初始化配置的结构体⽂件,我们需要在NVIC初始化结构体配置如下: void EXti_PB12_Config(void) { //定义结构体 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; //开启外设时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); NVIC_Configuration(); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure); // 中断向量模式(PB12) GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12); //给中断向量成员赋值,这是因为PB12连接到EXTI_Line12; EXTI_InitStructure.EXTI_Line = EXTI_Line12; //设置中断触发模式,通过这个来不断查询相应的寄存器 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置触发模式为下降沿触发 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //使能 EXTI_InitStructure.EXTI_LineCmd = ENABLE; //调⽤库函数 EXTI_Init(&EXTI_InitStructure); } static void NVIC_Configuration(void) { //定义结构体 NVIC_InitTypeDef NVIC_InitStructure; //把NVIC中断优先级分组设置为第⼀组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //PB12配置为EXT1第10-15线的中断向量 NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //设置抢占优先级为0 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置响应优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //使能 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //调⽤库函数 NVIC_Init(&NVIC_InitStructure); } 从代码可以看出,我们可以创建两个⽂件,⼀个是EXTI_KEY.C和EXTI_KEY.H⽂件,将上述代码放置于EXTI_KEY.C⽂件中。

stm32F4 的中断解析

stm32F4 的中断解析

stm32F4 的中断2013年4月19日16:20Interrupt program status register 中断状态寄存器32位 31:9保留Bits 8:0 中断号,最多达256个中断stm32F4 用了98个0~98NVIC (Nested vectored interrupt controller) 嵌套向量中断控制器对于中断的优先级配置需要区分是Cortex-M4中断还是stm32中断System handler priority registers (SHPRx)SHPR1~SHPR3 3个32 位寄存器,每8位设置一个中断优先级共12个可配置的系统中断,8位里只用了高4 位,低4位,写无效,读为0。

还有3个中断的优先级为系统默认-3,-2,-1。

Interrupt priority registers (NVIC_IPRx)NVIC_IPR0~NVIC_IPR20 21个寄存器,每8位设置一中断优先级最多可设置84个,但stm32F4只有81个,保留了24位。

AIRCR (Application interrupt and reset control register) 应用中断和复位控制寄存器AIRCR[10:8] 可设置中断优先级分组要写这个寄存器,必须写0x5FA 到VECTKEY (AIRCR[23:16])SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;在misc.c 和core_cm4.h 中均有相应的设置函数(优先级分组,主优先级,从优先级,中断使能/禁止),但函数名不一样,通常调用的是misc.c里的。

但misc 中的函数只能对stm32F4的中断进行配置,不能对Core_M4系统中断配置。

用户对于优先级分组,主优先级,从优先级的配置很难协调。

用户既可以用misc.c 中的函数,也可以用core_cm4.h中的函数,各有优劣。

stm32中断学习总结

stm32中断学习总结

stm32中断学习总结经过了两天,终于差不多能看懂32的中断了,由于是⽤的库函数操作的,所以有些内部知识并没有求甚解,只是理解知道是这样的。

但对于要做简单开发的我来说这些已经够了。

我学习喜欢从⼀个例程来看,下⾯的程序是我粘贴但是改编的,⼤部分都做了注释。

其实主要步骤就是:1、将GPIO⼝配置成中断输⼊模式。

void Init_LED(void){GPIO_InitTypeDef GPIO_InitStructure; //定义⼀个GPIO结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |RCC_APB2Periph_GPIOG, ENABLE);//使能各个端⼝时钟,GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //板上LED编号 D2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOG, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //板上LED编号 D5GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOD, &GPIO_InitStructure);}2、这个例程是做的按键,就是你要哪个地⽅产⽣中断,然后将其所在的总线配置成中断源,然后照猫画虎,填写中断结构体成员,就是配置外部事件的模式、触发条件、使能外部触发,但是别忘了打开复⽤功能(现在我还不理解)void Init_TI_KEY(void){EXTI_InitTypeDef EXTI_InitStructure; //定义⼀个EXTI结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能IO复⽤功能,使⽤中断功能重要/* 引脚选择 */GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);//配置端⼝C的13引脚为中断源重要!!板上标号INT2GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); //配置端⼝E的0引脚为中断源重要!!板上标号INT1/* 设置外部中断结构体的成员*/EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13;EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_Init(&EXTI_InitStructure); //根据参数初始化中断寄存器}3、现在就该配置中断了。

stm32中断总结(刁钻的游戏)

stm32中断总结(刁钻的游戏)

二、外部中断 1、外部中断 EXIT 即由外部信号触发产生的中断,由 19 个产生事件中断要求的边沿检测器组成(即检测 引脚端口电平变化的检测) 。 GPIO 普通 IO 口有 ABCDE 每组端口由 16 个 IO 口, 外部中断的 0-15 是对应这 16 个 IO 口的,
3/5
也就是 EXTI0 对应 PA0,PB0,PC0,PD0,PE0,它们共用 EXTI0,也就是说当你对 PA0 设置 中断时,PB0,PC0,PE0 就不能设置外部中断了(他有一个选择寄存器) 。 附加:EXTI16 连接 PVD 输出 EXTI17 连接 RTC 闹钟事件 EXTI18 连接 USB 唤醒事件。 2、EXIT 寄存器 3、外部中断触发的原理 如下: 外部引脚信号检测 (需要配置边沿检测方式) 系统检测到信号将某一标志位寄存器置位 进入中断程序(防止连续性触发,需要清除标志位以便继续检测) 所以 EXTI 应该有 Init 初始化函数、清除标志位函数 ClearFlag。 4、对于 EXIT 相应的函数有 函数名 EXTI_DeInit EXTI_Init EXTI_StructInit EXTI_GenerateSWInterrupt EXTI_GetFlagStatus EXTI_ClearFlag EXTI_GetITStatus EXTI_ClearITPendingBit 描述 将外设 EXTI 寄存器重设为缺省值 根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器 把 EXTI_InitStruct 中的每一个参数按缺省值填入 产生一个软件中断 检查指定的 EXTI 线路标志位设置与否 清除 EXTI 线路挂起标志位 检查指定的 EXTI 线路触发请求发生与否 清除 EXTI 线路挂起位

stm32串口中断原理

stm32串口中断原理

stm32串口中断原理
STM32串口中断是指在串口收发数据时,通过中断方式进行
数据的处理和传输。

在STM32单片机中,串口通信是通过UART或USART模块实现的。

UART(Universal Asynchronous Receiver/Transmitter)是一种
通用异步收发器,主要用于串行通信。

USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是一个更加
通用且功能更强大的串行通信接口,可同时支持异步和同步通信。

在STM32中,串口通信一般使用USART模块。

通过配置USART的寄存器,设置波特率、数据位、停止位、校验位等
参数。

然后,通过使能USART接收中断和发送中断,可以实
现接收和发送数据时的中断处理。

当有新的数据要发送时,CPU会将数据写入USART的发送缓冲区,并启动发送操作。

当发送操作完成后,USART会触发
发送完成中断,通知CPU可以继续发送下一个数据。

当收到新的数据时,USART会将数据存入接收缓冲区,并触
发接收完成中断,通知CPU可以读取接收到的数据。

在中断服务函数中,我们可以根据需要处理发送和接收的数据。

比如,可以通过发送中断函数来发送下一个数据,或者在接收中断函数中进行数据的处理和分析。

总的来说,STM32串口中断通过配置USART的相关寄存器和使能中断,实现了在数据收发过程中的中断处理。

这种方式可以提高效率和可靠性,使程序可以及时响应串口数据的变化。

STM32中断的详细介绍及使用流程

STM32中断的详细介绍及使用流程

STM32中断的详细介绍及使用流程STM32是一款常用的32位微控制器系列,由STMicroelectronics (ST)研发,广泛应用于各种嵌入式系统中。

中断是STM32中非常重要的特性之一,本文将详细介绍中断的概念、分类、优点以及使用流程。

一、中断的概念中断是一种机制,允许外部硬件设备打断正常的程序运行,并立即执行一个称为中断服务例程(ISR)的特定函数。

中断通常由外部硬件引发,例如定时器溢出、外部触发事件等。

一旦中断发生,控制器将暂停当前正在执行的任务,转而执行ISR,当ISR执行完毕后,控制权将返回到原来的任务。

二、中断的分类1.外部中断:STM32的GPIO引脚可以配置为外部中断触发。

当配置为外部中断模式时,如果引脚上的输入信号满足特定条件(上升沿、下降沿等),将会触发一个外部中断,并执行ISR。

2.内部中断:STM32具有许多内置的模块,例如定时器、UART等,这些模块常常产生中断信号。

例如,定时器溢出中断可以用于周期性任务的处理。

三、中断的优点1.实时性:中断能够立即响应外部事件,极大提高了系统的实时性。

2.节约CPU资源:中断是一种事件驱动的方式,只有在需要处理的时候才会触发中断,节约了CPU资源。

3.模块化设计:通过使用中断,可以将复杂的任务分解为更小的块,实现模块化的设计。

四、中断的使用流程使用中断的流程通常包括以下几个步骤:1.初始化中断:配置相关的中断源和中断服务例程。

在STM32中,中断使用时需要开启并配置相关的寄存器。

2.注册中断服务例程:编写中断服务例程的函数,这是中断发生时将要执行的函数。

在STM32中,可以使用标准库提供的函数来注册中断服务例程。

3.启用中断:开启中断并配置相应的优先级,以确定中断发生时的处理顺序。

在STM32中,可以设置中断控制器的中断使能位和优先级。

下面以STM32CubeIDE为例,展示一个外部中断的使用流程:1. 打开STM32CubeIDE,创建一个新的工程,并选择相应的芯片型号。

stm32f103c8t6中断原理

stm32f103c8t6中断原理

stm32f103c8t6中断原理一、概述STM32F103C8T6是一款基于ARMCortex-M3核心的STM32系列微控制器。

它具有丰富的外设和强大的性能,广泛应用于各种嵌入式系统。

中断是STM32微控制器中非常重要的概念,用于处理硬件事件,使得处理器能够及时响应和处理这些事件,提高系统的实时性和响应速度。

二、中断系统架构STM32F103C8T6的中断系统由硬件和软件两部分组成。

硬件部分包括中断控制器、外设中断请求源、全局中断标志位等;软件部分包括中断优先级管理、中断处理函数等。

中断控制器负责管理各个外设的中断请求,并将这些请求分配给相应的中断优先级。

外设中断请求源包括定时器、串口、ADC等,它们会在特定事件发生时产生中断请求。

全局中断标志位用于指示是否有中断事件发生,这些标志位由处理器轮询或软件查询。

三、中断优先级管理STM32F103C8T6的中断优先级管理采用嵌套模式,即一个中断可以被嵌套在另一个中断的触发序列中。

处理器会根据中断优先级和嵌套级别来决定先处理哪个中断。

STM32的中断优先级范围为0-7,其中0为最高优先级,7为最低优先级。

可以通过软件配置寄存器来设置各个中断的优先级。

四、中断处理过程当有中断事件发生时,处理器会自动跳转到相应的中断处理函数执行。

中断处理函数通常会完成一些必要的清理工作,如清除相关标志位、释放锁定的资源等,然后返回到正常的主程序继续执行。

在处理完一个中断后,处理器会自动回到正常的主程序执行,而不会出现死循环或延迟。

五、特殊中断STM32F103C8T6微控制器还支持一些特殊的中断,如系统复位中断、系统心跳中断等。

这些中断通常用于系统状态监测和异常处理,确保系统的稳定性和可靠性。

六、总结STM32F103C8T6的中断原理涉及到硬件和软件两个方面的知识,包括中断系统架构、中断优先级管理、中断处理过程以及特殊中断等。

理解中断原理对于使用STM32微控制器进行嵌入式系统开发非常重要,可以帮助开发者更好地利用其强大的硬件资源,提高系统的实时性和响应速度。

stm32中断(NVIC与EXTI)

stm32中断(NVIC与EXTI)

stm32中断(NVIC与EXTI) D部有4个从优先级(00 01 10 11)。

1.中断输入与悬起当中断输入脚被置为有效后,该中断就被“悬起”。

所谓“悬起”,也就是等待、就绪的意思。

即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。

当某中断的服务程序开始执行时,就称此中断进入了“活跃”状态,并且其悬起位会被硬件自动清除。

在一个中断活跃后,直到其服务例程执行完毕,并且返回后,才能对该中断的新请求予以响应。

当NVIC响应一个中断时,会自动完成以下三项工作,以便安全、准确地跳转到相应的中断服务程序:入栈:把8个寄存器的值压入栈。

当响应中断时,如果当前的代码正在使用PSP,则压入PSP(进程堆栈),否则就压入MSP(主堆栈)。

一旦进入了服务例程,就一直使用主堆栈。

在自动入栈的过程中,将寄存器写入堆栈的顺序与时间顺序无关,CM3会保证正确的寄存器被保存到正确的位置。

取向量:当数据总线(系统总线)进行入栈操作时,指令总线(I-Code总线)正在从向量表中找出正确的中断向量与对应的服务程序入口地址。

更新寄存器。

注意:①如果在某个中断得到响应之前,其悬起状态被清除了,则中断被取消。

②新请求在得到响应时,由硬件自动清零其悬起标志位。

③如果中断源咬住请求信号不放,该中断就会在其上次服务例程返回后再次被置为悬起状态。

④如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则被视为只有一次中断请求⑤如果在服务例程执行时,中断请求释放了,但是在服务例程返回前又重新被置为有效,则NVIC会记住此动作,重新悬起该中断。

2.中断返回当中断完成,返回主程序时,NVIC自动完成以下两步:①出栈:先前压入栈中的寄存器在这里恢复。

内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回先前的值。

②更新NVIC 寄存器:伴随着中断的返回,它的活动位也被硬件清除。

对于外部中断,倘若中断输入再次被置为有效,则悬起位也将再次置位,新一次的中断响应序列也会再次开始。

stm32定时器中断原理

stm32定时器中断原理

stm32定时器中断原理
STM32定时器中断是通过STM32微控制器的定时器模块实现的。

定时器中断可以在特定的时间间隔内触发,用于执行特定的任务或
者处理特定的事件。

在STM32中,定时器中断通常用于实现周期性
的任务,比如采样数据、控制IO口、生成PWM信号等。

定时器中断的原理是通过配置定时器的预分频器、计数器和自
动重装载寄存器,来实现特定的计时功能。

当定时器的计数器达到
设定的值时,就会触发中断请求,然后CPU会响应中断请求,并执
行相应的中断服务程序。

在STM32中,定时器中断的实现通常包括以下步骤:
1. 配置定时器的时钟源和预分频器,以确定定时器的时钟频率。

2. 配置定时器的计数器和自动重装载寄存器,以确定定时器的
计数范围和中断触发的时间间隔。

3. 配置定时器的中断使能和优先级,以确定中断触发后的处理
方式。

4. 编写中断服务程序,用于处理定时器中断触发时的任务或事件。

定时器中断的原理是基于硬件定时器的计时功能和中断控制器的中断处理功能实现的。

通过合理配置定时器的参数和编写相应的中断服务程序,可以实现各种定时任务和事件处理,从而提高
STM32微控制器的应用灵活性和实时性。

总之,STM32定时器中断是通过配置定时器的参数和编写中断服务程序来实现的,可以实现周期性的任务和事件处理,是STM32微控制器中重要的功能之一。

STM32外部中断(实现按键控制LED)

STM32外部中断(实现按键控制LED)

STM32外部中断(实现按键控制LED)引⾔“中断” 这个概念,指的是在单⽚机运⾏过程中,在指定条件发⽣时,停下当前所有⼯作,去执⾏中断处理函数内的内容。

就像我们在教室上课时,突然地震了,不出意外的话我们都需要停下⼿中学习任务,去进⾏⼀系列的避险动作。

这⼀节我们通过中断的⽅式,完成通过按键控制LED亮灭的操作。

准备环节中断相关知识STM32的中断控制器⽀持19个外部中断/事件请求。

这⼗九个外部中断为:线0~15:对应外部IO⼝的输⼊中断。

线16:连接到PVD输出。

线17:连接到连接到RTC时钟事件。

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

配置使⽤时,需要先将IO⼝与相应中断线的映射关系建⽴,再对其进⾏使⽤。

那映射关系是怎样的呢?GPIOx.0 ~ GPIOx.15(x = A,B,C,D,E,F,G)分别对应中断线0 ~ 15配置GPIO与中断线关系的函数是void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)eg:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);把GPIO作为EXTI外部中断时,需要打开AFIO时钟。

APIO时钟何时需要打开,具体可以参考这篇⽂章:嵌套向量中断控制器(NVIC)初始化完线上中断和中断条件等内容,还需要配置中断分组。

配置中断分组之前,我们需要先确定如何进⾏分组。

这⾥就需要⽤到NVIC。

关于NVIC的具体内容可查看这篇博⽂:。

编码环节步骤初始化IO⼝输⼊开启AFIO时钟设置IO⼝与中断线的映射关系初始化线上中断、设置触发条件等配置中断分组,并使能中断编写中断服务函数main.c(以下内容均省略头⽂件)int main(void){delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC终端分组2LED_Init();KEY_Init();EXTIX_Init(); //外部中断初始化LED1 = 0;}exti.h#ifndef __EXTI_H#define __EXIT_H#include "sys.h"void EXTIX_Init(void); //外部中断初始化#endifexti.cvoid EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure; //外部中断结构体初始化NVIC_InitTypeDef NVIC_InitStructure; //中断分组结构体初始化KEY_Init();RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO时钟GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //映射IO⼝与中断线//以下为配置中断线初始化EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线EXTI_InitStructure.EXTI_Line = EXTI_Line0; //中断线标号EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //触发⽅式EXTI_Init(&EXTI_InitStructure);//以下为中断优先级的配置NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //声明使⽤的中断是哪⼀个NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //设置抢占优先级为2 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //设置⼦优先级为3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断NVIC_Init(&NVIC_InitStructure);}void EXTI0_IRQHandler(void) //中断服务函数{delay_ms(10); //软件去抖if(WK_UP==1){LED0 = !LED0;LED1 = !LED1;}EXTI_ClearITPendingBit(EXTI_Line0); //清除中断位}补充中断服务函数中断服务函数的名称是固定的,写错会导致⽆法中断。

stm32中断原理

stm32中断原理

stm32中断原理STM32中断原理STM32是一款广泛应用于嵌入式系统的微控制器,它具有高性能、低功耗、易于开发等优点。

在STM32中,中断是一种重要的机制,它可以使系统在执行某些任务时,及时响应外部事件,提高系统的实时性和可靠性。

本文将介绍STM32中断的原理和应用。

1. 中断的概念中断是指在程序执行过程中,由硬件或软件发出的一种信号,用于通知CPU停止当前任务,转而执行另一个任务。

中断可以分为硬件中断和软件中断两种类型。

硬件中断是由外部设备发出的信号,如按键、定时器、串口等,而软件中断是由程序内部发出的信号,如系统调用、异常等。

2. STM32中断的分类STM32中断可以分为两种类型:内部中断和外部中断。

内部中断是由CPU内部的某个模块发出的信号,如时钟中断、DMA中断等;而外部中断是由外部设备发出的信号,如按键中断、定时器中断、串口中断等。

3. STM32中断的实现STM32中断的实现需要以下几个步骤:(1)配置中断向量表中断向量表是一个存储中断处理函数地址的表格,当中断发生时,CPU会根据中断号在中断向量表中查找对应的中断处理函数地址,并跳转到该函数执行。

在STM32中,中断向量表存储在内存的0地址处,可以通过修改向量表中的地址来实现中断处理函数的替换。

(2)使能中断在STM32中,使能中断需要设置相应的中断控制寄存器。

例如,要使能外部中断,需要设置GPIO的中断控制寄存器,使其能够检测到外部信号,并触发中断。

(3)编写中断处理函数中断处理函数是用于处理中断事件的函数,它需要根据中断类型和中断源进行相应的处理。

在编写中断处理函数时,需要注意以下几点:① 中断处理函数需要使用特殊的函数声明方式,以告诉编译器这是一个中断处理函数。

② 中断处理函数需要尽可能地短小精悍,避免在中断处理函数中执行过多的操作,以免影响系统的实时性和可靠性。

③ 中断处理函数需要及时清除中断标志位,以便下一次中断能够正常触发。

STM32中断应用总结

STM32中断应用总结

STM32中断应⽤总结STM32中断很强⼤,STM32中断可以嵌套,任何外设都可以产⽣中断,其中中断和异常是等价的.中断执⾏流程: 主程序执⾏过程可以产⽣中断去执⾏中断的内容(保护现场),然后在返回继续执⾏中断.中断分类:(可以在参考⼿册查看)系统异常:内核⽔平 10个外部中断:外设⽔平 60个有关具体的系统异常和外部中断可在标准库⽂件 stm32f10x.h 这个头⽂件查询到,在 IRQn_Type 这个结构体⾥⾯包含了 F103 系列全部的异常声明.(部分截图)NVIC简介NVIC: 嵌套向量中断控制器,属于内核外设,管理着包括内核和⽚上所有外设的中断相关的功能。

各个芯⽚⼚商在设计芯⽚的时候会对 Cortex-M3 内核⾥⾯的 NVIC 进⾏裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 的 NVIC 的⼀个⼦集。

两个重要的库⽂件:core_cm3.h(内核外设)和misc.h ,NVIC的库函数定义全在misc.h(外设在STM32F10X.h)在配置中断的时候我们⼀般只⽤ ISER、 ICER 和 IP 这三个寄存器, ISER ⽤来使能中断, ICER ⽤来失能中断, IP ⽤来设置中断优先级。

优先级分为主优先级和⼦优先级,当主和⼦优先级相同时,⽐较中断向量表中的位置号.(参考⼿册)NVIC 库函数描述void NVIC_EnableIRQ(IRQn_Type IRQn)使能中断void NVIC_DisableIRQ(IRQn_Type IRQn)失能中断void NVIC_SetPendingIRQ(IRQn_Type IRQn)设置中断悬起位void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)设置中断优先级void NVIC_ClearPendingIRQ(IRQn_Type IRQn)清除中断悬起位uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)获取悬起中断编号uint32_t NVIC_GetPriority(IRQn_Type IRQn)获取中断优先级void NVIC_SystemReset(void)系统复位优先级及优先级分组的定义在 NVIC 有⼀个专门的寄存器:中断优先级寄存器 NVIC_IPRx,⽤来配置外部中断的优先级, IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越⼩,优先级越⾼。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[4]計時器1模式選擇(TMD1) 0 = 間隔模式 1 = 觸發模式
[5]計時器1初始化TOUT1的值(TCLR1) 0 = 在觸發模式下初始化TOUT1為0 1 = 在觸發模式下初始化TOUT1為1
計時器工作原理
計時器資料暫存器(Timer Data Registers,TDATA0, TDATA1):
計時器工作原理
通過設置計時器控制暫存器TCON中的控制位元可以 禁止或致能T0和T1。
計時器模式暫存器 (Timer Mode Register, TMOD)
TMOD是用於控制兩個32位元計時器的操作。
暫存器 TMOD
偏移位址 0x6000
操作 讀/寫
功能描述 計時器模式暫存器
重置值 0x0000,0000
[0]計時器0致能(TE0) [1]計時器模式選擇(TMD0)
0 = 禁止計時器0
0 = 間隔模式
1 = 致能計時器2]計時器0初始化TOUT0的值(TCLR0) 0 = 在觸發模式下,初始化TOUT0為0 1 = 在觸發模式下,初始化TOUT0為1
[3]計時器1致能(TE1) 0 = 禁用計時器1 1 = 致能計時器1
中斷控制器工作原理
中斷模式暫存器 (Interrupt Mode Register)
INTMOD會透過對每一位元的設定來決定每一種中斷是按照快 速中斷(FIQ)還是按照正常中斷(IRQ)加以回應
暫存器 INTMOD
偏移位址 0x4000
操作 讀/寫
功能描述 中斷模式暫存器
重置值 0x0000,0000
間隔模式(Interval Mode)
當計時器計數溢位時產生一個脈衝輸出,該脈衝輸出產生定時中斷 請求,同時從計時器配置輸出接腳(TOUTn)Pin196、Pin199輸出。
接腳的輸出脈衝頻率可按下式計算: fOUT = fMCLK/計時器的數據值 ; fMCLK = 50MHz
觸發模式(Toggle Mode)
中斷優先順序暫存器 (Interrupt Priority Register) 中斷模式暫存器 (Interrupt Mode Register) 中斷懸置暫存器 (Interrupt Pending Register) 中斷遮罩暫存器(Interrupt Mask Register)
[20:0]中斷模式位元元,
當中斷模式位元元被置為 “1”: FIQ方式處理中斷 “0”: IRQ方式處理中斷
中斷控制器工作原理
中斷懸置暫存器 (Interrupt Pending Register)
INTPND是用來保持每一個中斷源的中斷懸置位元
暫存器 INTPND
偏移位址 0x4004
其值決定計時器的計數溢位時間的長短。
該時間的計算公式為:
(計時器資料+1)個Clock週期
暫存器 TDATA0 TDATA1
偏移位址 0x6004 0x6008
操作 讀/寫 讀/寫
功能描述 計時器0資料暫存器 計時器1資料暫存器
重置值 0x0000,0000 0x0000,0000
[31:0]計時器0或計時器1 的數據值
[31:0]計時器0或計時器1 的計數值
計時器工作原理
計時器的工作過程描述
當致能計數器時,向計數器的計數暫存器寫入資料值, 然後計數暫存器開始遞減。
計時器計數溢位產生相應的中斷請求,同時重新裝入原 來的資料值並開始遞減。
在禁用計時器的情況下,可以向計時器的暫存器寫入一 個新的資料。
計時器工作原理
計時器計數暫存器(Timer Count Register):
保存計時器0或計時器1在正常工作情況下的當前計數值
暫存器 TCNT0 TCNT1
偏移位址 0x600C 0x6010
操作 讀/寫 讀/寫
功能描述 計時器0計數暫存器 計時器1計數暫存器
重置值 0xFFFF, FFFF 0xFFFF, FFFF
操作 讀/寫
功能描述 中斷懸置暫存器
重置值 0x0000,0000
指示中斷請求是否處於懸置狀態(未處理)。
如果中斷懸置位元被設定的話,則中斷懸狀態會一直保 存著,直到CPU透過寫入 ‘1’ 到中斷懸置暫存器的相對應 位元來加以清除 (注意,是寫 ‘1’ 來清除,而不是寫 ‘0’ )
當中斷懸置位元被設定時,無論中斷遮罩暫存器是否為 ‘0’,中斷服務程式都會開始執行。
組) 將所得的結果向右偏移一個字元組,而不是作一個位元組的偏移。 測試最高的8位元是已被清除的,如此可確定結果值只有24位元長
度(這是因為跳躍指令限制了偏移值) 與0xEA000000(此為跳躍指令的指令運算碼)做OR邏輯運算,以產生
在向量中所要放置的數值。
unsigned Install_Handle(unsigned routine, unsigned *vector) {
Abort_Addr DCD Abort_Addr
DCD 0
IRQ_Addr
DCD IRQ_Addr
FIQ_Addr
DCD FIQ_Addr
DCD P4-7
程式設計原理
使用C語言建立中斷向量表 由MAIN主函式中直接加入中斷向量表的建立。
使用跳躍指令的方法如下所列:
取得中斷服務常式的位址。 將這位址減去相對應的向量。 為了允許執行預先存取的工作,需先減去0x8(2個字元組,8個位元
例外事件 重置
未定義指令 軟體中斷 終止(預取指令) 終止(數據)
保留 IRQ FIQ
例外事件模式 管理模式 未定義模式 管理模式 終止模式 終止模式 保留 IRQ FIQ
中斷控制器工作原理
中斷基本概念與特性
S3C4510B支援多達21個中斷源,且中斷請求可由內部功 能模組或外部引腳信號產生
當有中斷請定產生時,對應的中斷懸置位元會被設定為 ‘1’ ,且在整體中斷遮罩位元和對應的中斷遮罩位元為 ‘0’ 時,中斷請求就會被加以回應
計時器工作原理
S3C4510B提供兩個32位元的計時器T0和T1 可工作在間隔模式(Interval Mode)或觸發模式(Toggle
Mode),對應的信號輸出為 TOUT0 和 TOUT1。
如果計時器在執行時暫停,原來的資料值不會被自動重 新裝入。
中斷控制器的工作過程描述
當中斷遮罩暫存器的整體遮罩位元與相對應的中斷遮罩 位元清除為0時,對應的中斷請求被打開
當中斷條件發生時,PC指標會跳躍到例外事件處理程式 中,執行相對應的操作
程式設計原理
一般中斷服務常式可以由三種方式來建立
NOP
B
IRQ_Handler
B
FIQ_Handler
程式設計原理
程式計數器傳輸指令
此一方式主要是將程式計數器直接指到中斷服務常式的位址。
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
跳躍指令
程式計數器傳輸指令
使用C語言建立中斷向量表
跳躍指令
使用跳躍指令設計中斷向量表是比較簡單的方式,但跳 躍空間只有32M位內
B
Reset_Handler
B
Underfined_Handler
B
SWI_Handler
B
Prefetch_Handler
B
Abort_Handler
pc,[pc,#offset])來產生替換向量的數值。 將中斷服務常式的位址放到儲存的區域。
unsigned Install_Handle(unsigned location, unsigned *vector) {
unsigned vec, oldvect; vec = (( routine-(unsigned)vector-0x8) >> 2); vec = 0xea000000 | vec; oldvect = *vector; *vector = vec; return (oldvect); }
程式設計原理
計時器工作原理
計時器的工作描述
當致能計數器時,會向計數器的計數暫存器填入一個資料值,然後 計數暫存器開始遞減。
當計時器計數溢位時,會產生相對應的中斷請求,同時重新填入原 來的資料值並開始加以遞減。
在禁用計時器的情況下,可以向計時器的暫存器寫入一個新的資料 如果計時器在執行時暫停,且原來的資料值不會被自動重新填入。
中斷控制器工作原理
中斷優先順序暫存器 (Interrupt Priority Register)
索引碼 [9] [8] [7] [6] [5] [4] [3] [2] [1] [0]
中斷源 GDMA通道1中斷 GDMA通道0中斷 UART1接收與錯誤中斷 UART1傳送中斷 UART0接收與錯誤中斷 UART0傳送中斷 外部中斷3 外部中斷2 外部中斷1 外部中斷0
LDR PC, Abort_Addr
NOP
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Underfined_Addr DCD Undefined_Addr
SWI_Addr
DCD SWI_Addr
Prefetch_Addr
DCD Prefetch_Addr
中斷控制器工作原理
在中斷服務程式中,必須透過向中斷懸置暫存器的相對應位 元寫入 ‘1’ 來清除中斷懸置旗標,以避免由於同一個中斷懸 置位元導致了中斷服務程式的反覆執行。
中斷控制器工作原理
中斷遮罩暫存器(Interrupt Mask Register)
相关文档
最新文档