中断系统
(1)中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在进行的程序,转而去处理中断程序,处理完成后又返回到原来被暂停的位置继续进行。
(2)中断优先级:当有多个中断源申请中断时,CPU回根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源(中断优先级的配置由NVIC来控制)。
(3)中断嵌套:当一个中断正在进行时,又有新的更高优先级的中断申请中断,CPU再次申请当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
中断执行流程
STM32中断相关知识
(1)68个可屏蔽中断通道,包含EXTI,TIM,ADC,USART,SPI,I2C,RTC等多个外设)。
(2)使用NVIC同意管理中断(通过设置抢占优先级和响应优先级)
抢占优先级:当CPU在执行一中断时,又来一中断,且该中断的抢占优先级高,则CPU停止当前中断,转向抢占优先级更高的中断。
响应优先级:当CPU在执行一中断时,且存在等待的中断,这时来了个中断,该中断的响应优先级高于在等待中的,则该中断将“插队”,在前一个中断结束后,率先被CPU处理。
NVIC相关函数
void NVIC_PriorityGroupConfig(uint32_t NVIC_PrioriityGroup)
作用:选择优先级分组。
void NVIC_Init(NVIC_InitTypeDef *NVIC_InitStructure)
作用:初始化NVIC
NVIC基本结构(外设——NVIC——CPU)
注:NVIC在内核,不用RCC_APB开启时钟。
NVIC分组优先级(由NVIC_PriorityGroupConfig()函数配置)
(1)NVIC当时中断由优先级寄存器的4位(0~15)决定,着4位可进行切分,分成高n位的抢占优先级和低4~n位的响应优先级
(2)抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级系统的按中断号排队。
补充:优先级的值越小,优先级越高。
EXTI简介
(1)EXTI(Extern Interupt)外部中断
(2)EXTI可监测指定GPIO口的电平信号,当其指定GPIO口产生电平变化时,EXTI立即想NVIC发出中断申请,经过NVIC裁决后即可中断CPU的主程序,使CPU执行EXTI对应的中断程序。
(3)支持的触发方式:
1.上升沿 0----->1
2.下降沿 1------>0
3.双边沿 0---->1 或 1----->0
4软件触发
(4)支持的GPIO:所有的GPIO口,但是相同的Pin口不能同时触发。(因为AFIO只能选择一个Pin口)。
(5)EXTI的通道
1.16个GPIO_Pin(主要功能)
2.PVD输出 ------------|
3.RTC闹钟 ------------|
--------------------> 因为外部中断有个功能,以低功耗模式下的停止
| 模式下唤醒STM
4.USB唤醒 ------------|
5.以太网唤醒 ---------|
(5)触发响应方式:
1.中断响应()申请中断,让CPU执行中断函数。
2.事件响应(如果选择该响应,那么,外部中断的信号不会通向CPU,而是通向其他外设,触发其他外设)。
EXTI基本结构
(1)AFIO:中断引脚选择(数据选择器),可在前16个GPIOx外设16Pin引脚里选择其中一个连接到后面EXTI通道里。
(2)EXTI外部中断的EXTI9~5H合到同一个通道中;EXTI15~10合到同一个通道中(说明外部中断的9~15会触发同一个中断函数,15~10会触发同一个中断函数),所以在这两个中断函数中,需要根据标志位来区分到底是哪个中断进来的(EXTI_GetITStatus()==SET?)
(3)EXTI有20条线路接到了其他外设,用于触发其他外设操作(事件响应)
EXTI相关函数
初始化相关函数
void EXTI_DeInit(void);
作用:将EXTI的配置都清除,恢复成上电默认状态。
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
作用:根据结构体的参数配置EXTI外设
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
作用:吧参数传递的结构体变量赋到一个默认值(即:将结构体初始化)
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
作用:用软件触发外部中断。
关于状态标志位相关函数
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
作用:获取指定的标志位是否被置1.
void EXTI_ClearFlag(uint32_t EXTI_Line);
作用:对置1的标志位清除
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
作用:获取指定的标志位是否被置1.
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
作用:对置1的标志位清除
补充:关于标志位
(1).当某个模块(比如串口,定时器),若有状态寄存器,则涉及标志位和中断之间的区别,进而有FlagStatus和ITStatus使用区别。
(2)标志位:是指当某事件发生时,无论对应的中断是否使能都会使相应的标志位。且当对应的中断也使能使,可以产生中断,此时要进行中断优先级配置,初始化配置,编写中断服务函数。(实际上,在中断函数中判断是否发生,是借助了标志位判断,称中断标志位)
(3)所以FlagStatus单纯判断标志位是否置位,即当事件发生时但是没有使能对应事件的中断时,标志位仍置位,但没有发生中断。而库函数ITStatus,不仅判断了标志位还判断了使能位,只有当中断发生(事件发生+中断使能)才返回SET。
综上知:
(1)
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
和
void EXTI_ClearFlag(uint32_t EXTI_Line);
用于普通函数。
(2)
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
和
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
用于中断函数中
哪些会产生标志位?(放在状态标志位中)
(1)外部中断来了,挂起寄存器置标志位。
(2)串口收到数据置标志位。
(3)定时器事件到也会置标志位。
配置外部中断EXTI的关于GPIOX选的AFIO函数
AFIO函数(注:ST公式设给AFIO分配专门的库函数,AFIO的库函数于GPIO在同一个文件中)
(1)void GPIO_AFIODeInit(void)
作用:用于复位AFIO外设,AFIO外设的配置会区别清除。
(2)void GPIO_PinLockConfig(GPIO_TypeDypeDef *GPIOx,uint16_t GPIO_Pin)
作用:锁定GPIO配置,被指定的引脚配置会被锁定,防止意外更改。
(3)void GPIO_EventOutputConfig(uint8_T GPIO_PortSource,uint8_t GPIO_PinSource)
(4)void GPIO_EventOutputCmd(FunctionlState NewState)
作用:用于配置AFIO事件输出功能的。;
(5)void GPIO_PinPemapConfig(uint32_t GPIO_Remap,FunctionalState Newstate)
作用:用于引脚重定义。
(6)void GPIO_EXTILineConfig(uint32_t GPIO_PortSource,uint8_t GPIO_PinSource)
作用:配置AFIO的数据选择器,来选择我们想要的中断引脚
(7)void GPIO_MediaInterface(uint32_t GPIO_ETH_MediaInterface)
作用:关于以太网有关。
AFIO复用IO口
(1)AFIO主要用于引脚复用功能的选择和重定义。
(2)在STM32中,AFIO主要完成:复用功能引脚重定义和中断引脚选择。
EXTI框图
理解:
(1)硬件触发(即上升沿,下降沿,双边沿)和软件中断寄存器的值接在”1“或门上(即任意一个为1,或门可输出1).
(2)或门有”兵分两路“,触发中断或事件。
(3)中断屏蔽寄存器:作用:开关控制,因为它与X一起通入一个与门,与门只有当两者都为1时,才为1,通,所以只有中断屏蔽寄存器置1,才有可能通过。