中断:在程序执行过程中产生了一个必须执行的外部因素时,程序就去执行外部因素对应的中断服务函数,完了再回到正常程序,这就是简单的理解中断。
但是当程序在处理中断服务函数时又产生另一个中断时就需要一个机制来调解:NVIC.
NVIC 即嵌套向量中断控制器(Nested Vectored Interrupt Controller)。在stm32f103中总共有70个中断源,包括10个内核中断和60个可屏蔽中断,具有16级的可编程的中断优先级,我们通常使用这60个可屏蔽中断,在配置中断的时候我们一般只用 ISER、ICER 和 IP 这三个寄存器,ISER 用来使能中断,ICER 用来失能中断,IP 用来设置中断优先级。
一、使能。对于ISER中断使能寄存器组中,ISER[0]的 bit0~bit31 分别对应中断 0~31。ISER[1]的 bit0~27对应中断 32~59,所以ISER寄存器的其他寄存器组就没有实际作用,在使能中断的时候对应的bit需要设置为1.在ICER中断失能寄存器组中,对相应的中断位写1达到失能中断的作用。
ISPR[8]:是一个中断挂起控制寄存器组。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断
ICPR[8]:是一个中断解挂控制寄存器组。通过设置 1,可以将挂起的中断接挂。写 0 无效。
IABR[8]:是一个中断激活标志位寄存器组。通过设置 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
IP[240]:是一个中断优先级控制的寄存器组。STM32 的中断分组与这个寄存器组密切相关。IP寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而 STM32 只用到了其中的前 60 个。IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。
二、分组。STM32有抢占优先级和响应优先级。低优先级的中断在执行时遇到高优先级的中断可以被响应,即执行完高优先级的中断后再执行低优先级中断。同级优先级不同时遇到时得按顺序执行,若同时遇到则要比较其子优先级的高低决定执行顺序。优先级分组有0-4组,抢占优先级和响应优先级都有0-4的选择,且数字越小优先级越高
三、NVIC在HAL库中相关函数。
HAL_NVIC_SetPriorityGrouping 函数:设置中断优先级分组,该函数有一个形参对应5个结果。
HAL_NVIC_SetPriority函数:设置中断优先级,函数有三个形参,作用分别是选择中断源,抢占优先级,响应优先级
HAL_NVIC_EnableIRQ函数:使能中断,函数有一个形参,选定中断源。
HAL_NVIC_DisableIRQ函数:失能中断,参数作用同上。
HAL_NVIC_SystemReset函数:系统复位。
配置中断的步骤:
1、设置优先级分组。
2、设置中断并使能。
3、编写中断服务函数。
4、启动接收中断。
EXTI--外部中断/事件控制器
STM32F103ZET6有7个GPIO外设,每个外设对应0-15共16个GPIO引脚,对应16条外部中断线。每个输入线可以独立配置输入类型(脉冲或挂起)和对应的触发事件(上升沿,下降沿,双边沿)。注:同一条线不能被多组GPIO外设同时使用,互联性产品必须先使能AFIO时钟。
EXIT线16连接到PVD输出。
EXTI线17连接到RTC警告事件。
EXTI线18连接到USB唤醒事件。
前面三条线属于事件请求,使用外部中断需要开启AFIO中对应的中断功能。
总共19条外部中断线。
EXTI在功能上可分为产生中断及产生事件。
在成功触发外部中断时,HAL库中会执行外部中断回调函数HAL_GPIO_EXTI_Callback。而一般操作外设则放在回调函数中。
此上均为参考资料后做的一点笔记,若有冒犯愿作者告知。
上一篇:STM32中断和异常
下一篇:stm32学习笔记(八)中断服务函数与函数调用的区别
推荐阅读最新更新时间:2024-03-16 16:19