-
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在
C51
单片机时代,一共只有
5
< br>个中断,其中
2
个外部中断,
2
个定时
/
计数器中断和一个串口中断,
但是在
STM32
中,中
断数量大大增
加,而且中断的设置也更加复杂。今天就将来探讨一下关于
STM32
< br>中的中断
系统。
1
基本概念
ARM
< br>Coetex-M3
内核共支持
256
< br>个中断,其中
16
个内部中断,
240
个外部中断和可编程的
256
级
中断优先级的设置。
STM32
目前支持的中断共
84
个(
16
个内部
+68
个外部)
,还有
16
级可编程的中断优先级的设置,仅使用中断优先级设置
8
bit
中的高
4
位。
< br>
STM32
可支持
68
个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备
自己
的中断优先级控制字节
PRI_n(8
位,但是
STM32
中只使用
4<
/p>
位,高
4
位有效
)
,每
4
个通道
的
8
位中断优先级控制字构成一个
3
2
位的优先级寄存器。
68
个通道的优
先级控制字至少构
成
17
个
32
位的优先级寄存器。
4bit
的中断优先级可以分成
2
组
,从高位看,前面定义的是抢占式优先级,后面是响应优先
级。按照这种分组,
4bit
一共可以分成
5
组
第
0
组:所有
4bit
用于指定响应优先级
;
第
1
组:
最高
1
位用于指定抢占式优先级,后面
3
位用于指定响应优先级;
第
2
组:最高
2
位用于
指定抢占式优先级,后面
2
位用于指定响应优先级;
第
3
组:最高
3
位用于指定抢占式优先级,后面
1
位用于指定响应优先级;
第
4
组:所有
4
位用于指定抢占式优
先级。
所谓抢占式优先级和响应优
先级,
他们之间的关系是:
具有高抢占式优先级的中断可以在具
有低抢占式优先级的中断处理过程中被响应,即中断嵌套。
当两个中断源的抢占式优先级相同时,
这两个中断将没有嵌套关系,
当一个中断到来后,
如
果正在处理另一个中断,
这个后到来的中断就要等到前一个中断处理完之
后才能被处理。
如
果这两个中断同时到达,
则中断控制器根据他们的响应优先级高低来决定先处理哪一个;
如
< br>果他们的抢占式优先级和响应优先级都相等,
则根据他们在中断表中的排位顺序决
定先处理
哪一个。每一个中断源都必须定义
2
< br>个优先级。
有几点需要注意的是:
1
)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所
限定的范围,将
可能得到意想不到的结果;
< br>2
)抢占式优先级别相同的中断源之间没有嵌套关系;
3
)如果某个中断源被指定为某个抢占式优先级别,又没有其它
中断源处于同一个抢占式优
先级别,则可以为这个中断源指定任意有效的响应优先级别。
2
GPIO
外部中断
STM32
中,
每一个
GPIO
都可以触发一个外部中断,
但是,
GPIO
的中断是以组位一个单位的,
同组间的外部中断同一时间只能使用一个。比如说,<
/p>
PA0
,
PB0
,
PC0
,
PD0
,
PE0
,
PF0
,
PG0
这些为
1
组,
如果我们使用
PA0
作为外部中断源,
那么别的就不能够再使用了,
在此情况下,<
/p>
我们智能使用类似于
PB1
,
PC2
这种末端序号不同的外部中断源。每一组使用一个中断标志
EXTIx
。
EXTI0
–
EXTI4
这
5
个外部中断有着自己的单独的中断响应函数,
EXTI5-9
共用一个中
断响应函数,
EXTI10-15
共用一个中断响应函数。
对于中断的控制,
STM32
有一个专用的管理机构:
NVIC
。对于
p>
NVIC
的详细解释,可以参考
《
ARM Cortex-M3
权威指南》
,
p>
Joseph Yiu
著,宋岩译,北京航空航天大学出版社出版,
第
8
章
NVIC
与中断控制。中断的使能,挂起,优先级,活动等等部都是
NVIC
< br>在管理的。因为我
学习
STM32
重点在于如何开发程序,所以内部的一些东西,在此我就不详细说明了,有感
兴趣的可
以参看上面提到的那本数。
3
程序开发
其实上面那些基本概念和知
识只是对
STM32
的中断系统有一个大概的认识,用程序说话
将
会更能够加深如何使用中断。使用外部中断的基本步骤如下:
1.
设置好相应的时钟;
2.
设置相应的中断;
3. IO
口初始化;
4.
把相应的
IO
< br>口设置为中断线路(要在设置外部中断之前)并初始化;
5.
在选择的中断通道的响应函数中中断函数。
由于我用的奋斗开发板没有引出相应的芯片引脚,
所以只能用按键来触发相应的中断。
根据
原理图,
K1/K2/K3
连接的是
PC5/P
C2/PC3
,因此我将用
EXTI5/EXTI2/EXTI
3
三个外部中断。
PB5/PD6/PD3
分别连接了三个
LED
灯。中断的效果是按下按键,相应的
LED
灯将会被点亮。
1.
设置相应的时钟
< br>首先需要打开
GPIOB
、
GP
IOC
和
GPIOE
(因为按键另外一
端连接的是
PE
口)
。然后由于是要<
/p>
用于触发中断,所以还需要打开
GPIO
复用的时钟。相应的函数在
GPIO
的学习笔记中有了
详细了解释。详细代码如下:
void
RCC_cfg()
{
//
打开
PE PD PC
PB
端口时钟,并且打开复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE
|
RCC_APB2Periph_GPIOC
|
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,
ENABLE);
}
设置相应的时钟所需要的
RCC
函数在
stm32f10x_rcc.c
中,
所以要在工程中添加此文件。
2.
设置好相应的中断
设置相应的中断实际上就是设置
NV
IC
,
在
STM32
< br>的固件库中有一个结构体
NVIC_InitTypeDef
,
里面有相应的标志位设置,然后再用
NVIC_Init
()
函数进行初始化。详细代码如下:
void NVIC_cfg()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//
选择中断分组
2
/******************
使能
EXTI2*******************/
NVIC__IRQChannel = EXTI2_IRQChannel;
//
选择中断通道
2
-
-
-
-
-
-
-
-
-
上一篇:委外加工管理办法(外部)
下一篇:外部供方管理程序