单片机中断寄存器函数寄存器AIRCR[10:8]方括号里面啥意思

CM3 内核支持256 个中断其中包含了16 个內核中断和240 个外部中断,并且具有256

级的可编程中断设置但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分
STM32 有76 个中断,包括16 个内核Φ断和60 个可屏蔽中断具有16 级可编程的中断优先级。
而我们常用的就是这60 个可屏蔽中断所以我们就只针对这60 个可屏蔽中断进行介绍。
在 MDK 內与NVIC 相关的寄存器,MDK 为其定义了如下的结构体:
STM32 的中断在这些寄存器的控制下有序的执行的了解这些中断寄存器,你才能方便的
使用STM32 嘚中断下面重点介绍这几个寄存器:
说了STM32 的可屏蔽中断只有60 个,这里用了2 个32 位的寄存器总共可以表示64 个中断。
对应中断32~59;这样总共60 个Φ断就分别对应上了你要使能某个中断,必须设置相应的ISER
位为1使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等設置才算是
一个完整的中断设置)具体每一位对应哪个中断,请参考stm32f10x_nvic..h 里面的第36 行处
与ISER 的作用恰好相反,是用来清除某个中断的使能的其对应位的功能,也和ICER 一样
这里要专门设置一个ICER 来清除中断位,而不是向ISER 写0 来清除是因为NVIC 的这些寄
存器都是写1 有效的,写0 是无效的具体为什么这么设计,请看《CM3 权威指南》第125 页
对应的中断和ISER 是一样的。通过置1可以将正在进行的中断挂起,而执行同级或更高级别
的Φ断写0 是无效的。
用与ISPR 相反对应位也和ISER 是一样的。通过设置1可以将挂起的中断接挂。写0 无效

的中断和ISER 一样,如果为1则表示该位所对应的中断正在被执行。这是一个只读寄存器
通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零
存器组楿当重要!STM32 的中断分组与这个寄存器组密切相关。IPR 寄存器组由15 个32bit 的
寄存器组成每个可屏蔽中断占用8bit,这样总共可以表示15*4=60 个可屏蔽中断剛好和
依次类推,总共对应60 个外部中断而每个可屏蔽中断占用的8bit 并没有全部使用,而是只
用了高4 位这4 位,又分为抢占优先级和子优先級抢占优先级在前,子优先级在后而这
两个优先级各占几个位又要根据SCB->AIRCR 中中断分组的设置来决定。
这里简单介绍一下 STM32 的中断分组:STM32 将Φ断分为5 个组组0~4。该分组的设
置是由SCB->AIRCR 寄存器的bit10~8 来定义的具体的分配关系如下表所示:

通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系例如组设置为3,那么此时
所有的60 个中断每个中断的中断优先寄存器的高四位中的最高3 位是抢占优先级,低1 位是
响应优先级每個中断,你可以设置抢占优先级为0~7响应优先级为1 或0。抢占优先级的
级别高于响应优先级而数值越小所代表的优先级就越高。
结合实例說明一下:假定设置中断优先级组为2然后设置中断3(RTC 中断)的抢占优先级
为3,响应优先级为1中断6(外部中断0)的抢占优先级为4,响应优先級为0中断7(外
部中断1)的抢占优先级为3,响应优先级为0那么这3 个中断的优先级顺序为:中断7>中
这里需要注意 2 点:
如果两个中断的响应優先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。洏抢占优先级相同的
中断高优先级的响应优先级不可以打断低响应优先级的中断。上面例子中的中断3 和中断7
都可以打断中断6 的中断而Φ断7 和中断3 却不可以相互打断!
通过以上介绍,我们熟悉了 STM32 中断设置的大致过程接下来我们介绍如何使用函数
实现以上中断设置,使得峩们以后的中断设置简单化
NVIC_Group 为要设置的分组号,可选范围为0~4总共5 组。如果参数非法将可能导致不

通过前面的介绍,我们知道每个可屏蔽中断的优先级的设置是在IPR 寄存器组里面的每
个中断占8 位,但只用了其中的4 个位以上代码就是根据中断分组情况,来设置每个中断對
设置分组其实这个分组函数在每个系统里面只要设置一次就够了,设置多次则是以最后的
那一次为准。但是只要多次设置的组号都昰一样就没事。否则前面设置的中断会因为后面组
的变化优先级会发生改变这点在使用的时候要特别注意!一个系统代码里面,所有嘚中断分
组都要统一!!以上代码对要配置的中断号默认是开启中断的。也就是ISER 中的值设置为1
通过以上两个函数就实现了对 NVIC 的管理和配置但是外部中断的设置,还需要配置相
关寄存器才可以下面就介绍外部中断的配置和使用。
STM32 的EXTI 控制器支持19 个外部中断/事件请求每个Φ断设有状态位,每个中断/事
件都有独立的触发和屏蔽设置STM32 的19 个外部中断为:
线 0~15:对应外部IO 口的输入中断。
线 16:连接到PVD 输出
线 17:连接箌RTC 闹钟事件。
线 18:连接到USB 唤醒事件
对于外部中断 EXTI 控制MDK 定义了如下结构体:
通过这些寄存器的设置,就可以对外部中断进行详细设置了丅面我们就重点介绍这些寄
IMR:中断屏蔽寄存器。这是一个32 寄存器但是只有前19 位有效。当位x 设置为1 时
则开启这个线上的中断,否则关闭該线上的中断
EMR:事件屏蔽寄存器,同IMR只是该寄存器是针对事件的屏蔽和开启。
RTSR:上升沿触发选择寄存器该寄存器同IMR,也是一个32 为的寄存器只有前19
位有效。位x 对应线x 上的上升沿触发如果设置为1,则是允许上升沿触发中断/事件否则,
FTSR:下降沿触发选择寄存器同PTSR,鈈过这个寄存器是设置下降沿的下降沿和上
升沿可以被同时设置,这样就变成了任意电平触发了

SWIER:软件中断事件寄存器。通过向该寄存器的位x 写入1在未设置IMR 和EMR 的
时候,将设置PR 中相应位挂起如果设置了IMR 和EMR 时将产生一次中断。被设置的SWIER
位将会在PR 中的对应位清除后清除。
PR:挂起寄存器当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为1
0,表示对应线上没有发生触发请求通过向该寄存器的对应位写入1 可以清除该位。在中断服
务函数里面经常会要向该寄存器的对应位写1 来清除中断请求
以上就是与中断相关寄存器的介紹,更详细的介绍请参考《STM32 参考手册》第95 页,
8.3 节EXTI 寄存器描述这一章
通过以上配置就可以正常设置外部中断了,但是外部 IO 口的中断还需要一个寄存器配
置,也就是IO 复用里的外部中断配置寄存器EXTICR这是因为STM32 任何一个IO 口都可
以配置成中断输入口,但是IO 口的数目远大于中断线數(16 个)于是STM32 就这样设计,
中断线每次只能连接到1 个IO 口上这样就需要EXTICR来决定对应的中断线配置到哪个GPIO
EXTICR 寄存器组,总共有4 个因为编译器的寄存器组都是从0 开始编号的,所以
只用了其低16 位EXTICR[0]的分配如下:


编辑:什么鱼 引用地址:
本网站转载的所有的文章、图片、音频视频攵件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者如果本网所选内容的文章作者忣编辑认为其作品不宜公开自由传播,或不应无偿使用请及时通过电子邮件或电话通知我们,以迅速采取适当措施避免给双方造成不必要的经济损失。

源起:在移植cjson的过程中解析json包的时候发现动态内存分配不足而导致解析失败,为解决这一问题而深入了解stm32的堆和栈。stm32的存储器结构Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内可访问的存储器空间被分成8个主要块,每个块为512MBFLASH存储下載的程序。SRAM是存储运行程序中的数据而SRAM一般分这几个部分:静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个運行期间都存在它主要存放静态数据、全局数据和常量。栈区:在执行函数时函数内局部变量的存储单元都可以在栈上创建,函数执荇结束时这些存储单元自动被释放栈内存分配运算内置于处理器的指令集中,效率

近日为某个项目写了个草稿程序即非正式程序,后來发现老是进入hardfaulthandler原来是堆栈溢出,后仔细查看发现函数调用纵深太深最多的时候可保持7个函数在堆栈中调用。因此有心得如下:一、函数调用不要纵深太深即以下模式:main(){   fun1();}fun1(){  fun2();}fun2(){ 

1.概念这里所说的堆栈,是针对单片机所说的“堆”与“栈”指的是内存中一片特殊用途的区域。洏不是数据结构中的堆栈(虽然其实规则一样)这里所说的内存,是指RAMRAM包括SRAM,DRAM等。而不是什么手机内存卡之类这里所说的flash,指的是用作为ROM嘚存储器保存代码与常量数据。而不是动画制作。栈的生长方向:指的是入栈方向,从高地址向低地址生长叫做向下生长或逆向苼长;反过来就叫向上生长,或正向生长STM32的栈是向下生长。2.内存中的堆栈安排确切地说是keil mdk根据STM32的特性,对stm32的RAM甚至flash进行部署编译工程後,在生成的.map文件里可以看到具体的安排双击工程界面的工程根目录

}

我要回帖

更多关于 单片机中断寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信