STM32中断管理函数
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 就这样设计,
GPIOA~GPIOG 的[15:0]分别对应中断线15~0。这样每个中断线对应了最多7 个IO 口,以线0
为例:它对应了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而
中断线每次只能连接到1 个IO 口上,这样就需要EXTICR来决定对应的中断线配置到哪个GPIO
上了。
EXTICR 在AFIO 的结构体中定义,如下:
typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
} AFIO_TypeDef;
EXTICR 寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以
EXTICR[0]~ EXTICR[3],对应《STM32 参考手册》里的EXTICR1~ EXTICR 4。每个EXTICR
只用了其低16 位。EXTICR[0]的分配如下:
比如如我要设置 GPIOB.1 映射到1,则只要设置EXTICR[0]的bit[7:4]为0001 即可。默认
都是0000 即映射到GPIOA。从图5.7 中可以看出,EXTICR[0]只管了GPIO 的0~3 端口,相应
的其他端口由EXTICR[1~3]管理。具体请参考《STM32 参考手册》第126~128 页。
通过对上面的分析我们就可以完成对外部中断的配置了。该函数为 Ex_NVIC_Config,该
函数有3 个参数:GPIOx 为GPIOA~G(0~6),在sys.h 里面有定义。代表要配置的IO 口。BITx
则代表这个IO 口的第几位。TRIM 为触发方式,低2 位有效(0x01 代表下降触发;0x02 代表
上升沿触发;0x03 代表任意电平触发)。其代码如下:
//外部中断配置函数
//只针对GPIOA~G;不包括PVD,RTC 和USB 唤醒这三个
//参数:GPIOx:0~6,代表GPIOA~G;BITx:需要使能的位;TRIM:触发模式,1,下升沿;2,上
降沿;3,任意电平触发
//该函数一次只能配置1 个IO 口,多个IO 口,需多次调用
//该函数会自动开启对应中断,以及屏蔽线
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
u8 EXTADDR;
u8 EXTOFFSET;
EXTADDR=BITx/4;//得到中断寄存器组的编号
EXTOFFSET=(BITx%4)*4;
RCC->APB2ENR|=0x01;//使能io 复用时钟
AFIO->EXTICR[EXTADDR]|=GPIOx
EXTI->IMR|=1
Ex_NVIC_Config 完全是按照我们之前的分析来编写的,首先根据GPIOx 的位得到中断寄
存器组的编号,即EXTICR 的编号,在EXTICR 里面配置中断线应该配置到GPIOx 的哪个位。
然后使能该位的中断及事件,最后配置触发方式。这样就完成了外部中断的的配置了。从代码
中可以看到该函数默认是开启中断和事件的。其次还要注意的一点就是该函数一次只能配置一
个IO 口,如果你有多个IO 口需要配置,则多次调用这个函数就可以了。
至此,我们对 STM32 的中断管理就介绍结束了。当然还有中断响应函数,我们这里没有
介绍,这个在后面的实例中会向各位讲述的。
STM32中断管理函 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)