首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

STM32中断嵌套及外部中断全程攻略

STM32中断嵌套及外部中断全程攻略

断断续续学习STM32一学期了,时间过的好快,现在对STM32F103系列单片机的中断嵌套及外部中断做一个总结,全当学习笔记。废话不多说,ARM公司的Cortex-m3 内核,支持256个中断,其中包含16个内核中断和240个外部中断,并且具有256级的可编程中断设置。在ST公司的STM32单片机中最多有84个中断,包括16个内核中断(这16个内部中断是任何半导体商也改不了的),和68个可屏蔽中断,具有16级可编程的中断优先级。但是在STM32F103系列中只有60个可屏蔽中断,(107系列有68个)。

针对这60个可屏蔽中断,重点掌握它的一个中断优先级寄存器组IPR,全称Interrupt Priority Registers。这个寄存器组包含15个32位的寄存器,一个可屏蔽中断占用8bit,那么一个寄存器可以控制4个可屏蔽中断,一共15*4=60。然而在这占用的8bit中又只使用了高4bit,这高4bit的分配才是STM32F103系列单片机中断嵌套的设置所在。STM32F103系列的中断嵌套分为5个组,分别是0、1、2、3、4  这5个组,下面是5个组与中断嵌套的对应关系。


                                        
            

            
            

            

分配结果

            

            
            

            

0

            

            
            

            

0位抢占优先级,4位响应优先级

            

            
            

            

1

            

            
            

            

1位抢占优先级,3位响应优先级

            

            
            

            

2

            

            
            

            

2位抢占优先级,2位响应优先级

            

            
            

            

3

            

            
            

            

3位抢占优先级,1位响应优先级

            

            
            

            

4

            

            
            

            

4位抢占优先级,0位响应优先级

            
            

            
对于抢占优先级和响应优先级,只需记住两点,第一、抢占任何优先级比都比所有响应优先级优先级高。只有抢占优先级更高的具有中断嵌套功能。(即打断其他正在执行的中断)。第二、数字越小优先级越高 ,抢占优先级和响应优先级都一样时,首先响应中断通道对应中断向量地址低的那个中断。

下面对0组和1组的情况做一个分析。
0组对应是0位抢占优先级,4位响应优先级,那么无抢占优先级,响应优先级可设置为0到15级(2的4次方种)中的任意一种。
1组对应是1位抢占优先级,3位响应优先级,那么抢占优先级只可设置为0级或者1级中的任意一种(2的1次方种),响应优先级可设置为0到7级(2的3次方种)中的任意一种。
上电复位时,中断配置为4组,并且60个外部中断都是抢占优先级为0级,无响应优先级。

所以可以看出判断两个中断的优先级时先看抢占优先级的高低,如果相同再看响应优先级的高低。如果全都相同最后看中断通道向量地址。
一般来说在使用过程中,一个系统使用一个组别就完全可以满足需要。所以在使用一个组别后一般不要在系统中再改动组别,骨灰级玩家可以去试试(小心芯片烧了)。

外部中断:
STM32F103的外部中断EXTI支持19个外部中断/事件请求。每个中断/事件都有独立的触发和屏蔽设置。
0到15线:对应外部I/O口输入中断
线16:接到PVD输出
线17:接到RCT闹钟事件
线18:接到USB唤醒事件
线16到线18我自己都没用过,主要对线0到15的I/O输入中断做一个总结,有个注意的地方是这0到15线的外部中断,其中0到4线,这5个外部中断都有自己单独的中断响应函数。5到9线公用一个中断服务函数,10到15线公用一个中断服务函数。
外部中断配置寄存器组EXTICR包含4个32位的寄存器,分别是EXTICR0、EXTICR1、EXTICR2、EXTICR3、但每一个寄存器只用了低16位,每4位控制一个I/O口,一个寄存器控制4个I/O口,EXTICR寄存器组控制16个I/O口,刚好一个GPIO的I/O口数。下面以 EXTICR0为例,用一个表格表示:


                                                        
            

I/O口3

            
            

            

I/O口2

            

            
            

            

I/O口1

            

            
            

            

I/O口0

            

            
            

            

0000    GPIOA

            

            
            

            

0000    GPIOA

            

            
            

            

0000    GPIOA

            

            
            

            

0000    GPIOA

            

            
            

            

0001    GPIOB

            

            
            

            

0001    GPIOB

            

            
            

            

0001    GPIOB

            

            
            

            

0001    GPIOB

            

            
            

            

0010    GPIOC

            

            
            

            

0010    GPIOC

            

            
            

            

0010    GPIOC

            

            
            

            

0010    GPIOC

            

            
            

            

0011    GPIOD

            

            
            

            

0011    GPIOD

            

            
            

            

0011    GPIOD

            

            
            

            

0011    GPIOD

            

            
            

            

0100    GPIOE

            

            
            

            

0100    GPIOE

            

            
            

            

0100    GPIOE

            

            
            

            

0100    GPIOE

            

            
            

            

0101    GPIOF

            

            
            

            

0101    GPIOF

            

            
            

            

0101    GPIOF

            

            
            

            

0101    GPIOF

            

            
            

            

0110    GPIOG

            

            
            

            

0110    GPIOG

            

            
            

            

0110    GPIOG

            

            
            

            

0110    GPIOG

            
            
            

            
比如配置GPIOA.0就是将EXTICR0的低4位配置成0000,若配置GPIOB.1就是配置EXTICR0的4到7位,为0001。
这里有一个问题,如果要配置GPIOA.0和GPIOB.0,会引起冲突,不知道是不是分时配置解决的。我用的固体库的方式,不需要考虑这些,呵呵。注意使用固件库时中断复位函数是写在stm32f10x_it.c这个文件里的。


下面结合外部中断附上固件库版本的程序:
继承事业,薪火相传
返回列表