什么是中断?
中断是一个过程,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引脚作为外部中断输入线
总结
优先级:抢占优先级可以嵌套,响应优先级不能嵌套
中断与异常:内核事件叫异常,外设和外部产生的事件叫中断