赞
踩
NVIC属于内核设备,翻译为嵌套向量中断控制器,在stm32全系列中最多有256个中断由NVIC配置,并允许裁剪,因此每个型号的中断数与优先级数各不相同。
当外部中断响应时,通过第一层判断(是/否使能该中断)来判断是否让该中断进入NVIC,此后进入IPR来获取中断优先级,其中AIRCR是一个将IPR前4位标志位进行分组的寄存器(stm32只用到了IDR寄存器的前四位);如果是内核产生的中断,则进入SHPR寄存器进行获取优先级,再读取AIRCR判断分组。
ISER与ICER都是共32*8个位,每一个位控制一个中断,AIRCR的8-10位控制分组,IPR的240个寄存器对应着240个外部中断,但stm32只使用了前4位。
如图,当中断进入NVIC时会寻找对应的中断服务函数。
其中自然优先级是可以在中断向量表中查询的。
中断是一种发生了要进入NVIC的情况,则会将cpu调用,而事件是不进入NVIC的情况,会使硬件发生变化,通常也会伴随则是否使用中断的寄存器标志位。
20条EXTI线对应着20种事件与中断,其中图上缺乏以太网唤醒事件。
EXTI可以配置如上图所示,其中软件触发是通过软件更改寄存器的操作。只有将EXTI配置成功,对应的外部中断才能通过NVIC调用函数。
如果需要使用EXTI外部中断需要将GPIO的重映射功能开启,既AFIO。
使能AFIO的函数定义在HAL库中的GPIO.C中
开启复用功能后需要判断是哪一个EXTI线产生了外部中断,以上寄存器共有4个,可配置的EXTI线共有4*4个,每4位为1组,通过不同的位控制来自于哪组GPIO。
首先:使能GPIO的时钟
其次:通过GPIO初始化函数将GPIO模式,AFIO映射,时钟,屏蔽全部配置好
最后:设置NVIC的分组,中断优先级,并且使能
配置完毕后,要设置中断服务函数,终端服务函数的过程如下。
首先要设计一个中断服务函数(顾名思义,产生了何种中断,CPU会进入到终端服务函数中进行处理)
其次终端服务函数中要包含HAL库的中断共用处理函数(所谓公用,既例如所有的外部中断函数都适用于这个函数,函数的参数为GPIO_PINX,进入函数会检测是否该PIN产生了外部中断挂起位,挂起后,会执行回调函数,并软件清除中断标志位)
最后进入回调函数,回调函数在公用函数中被引用,并且是_weak弱定义,因此可以在使用它的地方将其内部重新定义为用户所需要的函数。并且可以设计多个中断服务函数,进入公用函数后进入回调函数,再在回调函数中进行逻辑判断,对应相应的中断,执行操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。