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

STM32中断管理函数(3)

STM32中断管理函数(3)

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 就这样设计,
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~ EXTICR4。每个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<<EXTOFFSET;//EXTI.BITx映射到GPIOx.BITx
//自动设置
EXTI->IMR|=1<<BITx;//开启line BITx 上的中断
EXTI->EMR|=1<<BITx;//不屏蔽lineBITx 上的事件
if(TRIM&0x01)EXTI->FTSR|=1<<BITx;//lineBITx 上事件下降沿触发
if(TRIM&0x02)EXTI->RTSR|=1<<BITx;//lineBITx 上事件上升降沿触发
}
Ex_NVIC_Config 完全是按照我们之前的分析来编写的,首先根据GPIOx 的位得到中断寄
存器组的编号,即EXTICR 的编号,在EXTICR 里面配置中断线应该配置到GPIOx 的哪个位。
然后使能该位的中断及事件,最后配置触发方式。这样就完成了外部中断的的配置了。从代码
中可以看到该函数默认是开启中断和事件的。其次还要注意的一点就是该函数一次只能配置一
个IO 口,如果你有多个IO 口需要配置,则多次调用这个函数就可以了。
至此,我们对 STM32 的中断管理就介绍结束了。当然还有中断响应函数,我们这里没有
介绍,这个在后面的实例中会向各位讲述的。
继承事业,薪火相传
返回列表