目录
一、中断概念
二、中断类型
三、NVIC
四、中断优先级
五 中断编程顺序
1.使能中断请求
2.中断优先级配置
3.初始化NVIC_InitTypeDef结构体
4.中断服务函数
六、总结
一、中断概念
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
二、中断类型
本文主要关于stm32f103ze系列中的关于中断的一些介绍和编程顺序。
1.系统中断
内核中的中断,其中复位的优先级最高
2外部中断
外设中的中断
在此只分大类,详细想要知道可以参考中文手册里面的中断向量表,在启动文件STARTUP中也可找到中断向量表。因为启动文件会初始化中断向量表。
三、NVIC
NVIC(嵌套向量中断控制器),属于内核外设,作用是管理内核和片上外设所有的中断相关的功能。关于更多的NVIC的信息,可以参考内核编程手册(如果你买了板子的话,或者可以找资料),或者在core_cm3.h中可以找到定义的结构体。如下图,其中最常用到是中断优先级寄存器。
一般内核中有个十个中断寄存器,外设有60个。但ARM公司给了240个。还有就有个值得注意的是ARM公司给了8位的寄存器,但ST公司只用了高四位。
在学习过程中,遇到关于内核相关的函数,通常要到core_cm3.h和misc.h中找。关于NVIC所有的固件库函数都在misc.h中
四、中断优先级
优先级的设定:NVIC->IPRx 即通过操作IPR这个寄存器
优先级分组:SCB->AIRCR:PRIGROUP
对于优先级,优先级数值越小,优先级别越高
原则1:组别优先级,Group0最大,然后以此类推。
原则2:组别优先级>抢占优先级>响应优先级。
原则3:当A和B中断都是Gruop0,且抢占优先级和响应优先级都一样,即软件优先级一样,那么就需要去中断向量表中比较他们硬件的中断编号,同样数值越小,优先级越高。
五 中断编程顺序
1.使能中断请求
就是指外设中的中断,那就要配置外设寄存器。
2.中断优先级配置
SCB->AIRCR:PRIGROUP 就是配置这个寄存器
但要通过固件库编程,就要去配置上述提到过的misc.h中的 NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)函数 。本质上是一致的,都是操作寄存器。
3.初始化NVIC_InitTypeDef结构体
同样在misc.h中可以找到这个结构体,如上图。
关于里面的参数,第一个中断源可以在stm32f10x.h中找到,寻找过程中要注意你所选用的是flash大小,是LD、MD还是HD。第二个是抢占优先级,这个是根据前面的优先级分组来配置的。第三个是响应优先级的配置。最后一个是使能,即大门。(前面说了使能中断请求时小门,即外设发送请求,这个使能时NVIS中的,也就是内核中的)。
上述配置完成后,需要调用misc.h中的NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)函数去完成初始化。
4.中断服务函数
启动文件中,将中断向量表中的函数名都是初始化好了,c语言中,函数的名称即函数的地址,也就是启动文件已经规定了这些中断服务函数的地址。也对这些函数名进行了弱定义,你可以在其他文件定义,并优先在定义的文件中使用,但要是名称编写错误,则进行启动文件中的中断服务函数。
中断服务函数需要写在stm32f10x_it.c文件中。
六、总结
比较重要的就是NVIC(嵌套向量中断控制器),属于内核外设,关于内核相关的可在core_cm3.h和misc.h中找。其次就是中断优先级,当软件优先级相同时,需要去查中断向量表,比较硬件编号的大小。最后就是中断编程顺序。首先要使能中断请求;随后配置中断优先级,先分组,再配置中断源(在stm32f10x.h中),然后配置抢占优先级和副优先级;最后NVIC使能、初始化。还有一点值得注意的就是编写中断服务函数时,启动文件中可以找到中断服务函数名,不要写错。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)