微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32外部中断操作

STM32外部中断操作

时间:11-17 来源:互联网 点击:

ef,

38.USART_TypeDef,

39.WWDG_TypeDef

而在stm32f10x_map.h中定义了34个类型,和stm32f10x.h基本相似。

EXTI_TypeDef

外部中断的设置,还需要配置相关寄存器才可以。下面就介绍外部中断的配置和使用。

STM32的EXTI控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32的19个外部中断为:

线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

对于外部中断EXTI控制MDK定义了如下结构体:

typedefstruct

{

vu32IMR;

vu32EMR;

vu32RTSR;

vu32FTSR;

vu32SWIER;

vu32PR;

}EXTI_TypeDef;

在新的标准外设库中,这个结构体的定义位于10x.h中。

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来清除中断请求。

IO复用里的外部中断配置寄存器EXTICR

EXTICR在AFIO的结构体中定义,如下:

typedefstruct

{

vu32EVCR;

vu32MAPR;

vu32EXTICR[4];

}AFIO_TypeDef;

在新的标准外设库中,这个结构体的定义位于10x.h中。

这个结构体存在的原因是STM32的每个IO都可以配置成中断输入口。但是线0~15:对应外部IO口的输入中断。只有16个。资源就不足了。为了确定是那一组IO的哪个口配置成中断,用到了EXTICR[4]。这虽然是一个32位的数组,但是只用到了16位,四位分成1组,这样就有了16组,从低到高,对应16个IO口,每组的四位数从0-6组成7种状态,对应A—G。

例如,我要设置PA3口为外部中断输入,EXTICR就要这样设置:首先PA3对应的是EXTICR[0],它管口0-3,口3对应的是EXTICR[0]的15-12位;要设置成PA,对应的就是xxxxxxxx(高16保留)00xxxxxx(xx表示4bit).

具体步骤是:

1.中断分组,确定系统要使用什么样的中断系统,为后面的整个设置定下基调。落实到寄存器就设置SCB-AIRCR.

2.设置中断优先级。分完组定下基调就是该设置优先级了。落实到寄存器级别就是设置vu32IPR[15]这个数组了。上面提到了,8bit表示一个中断设置,但是只用到了4个bit,而且从低到高是对应中断的从低到高。此时你要开启的中断Channel也基本就确定了。设置完成后就确定这个中断的抢占优先级和响应优先级。

3.开启对应的中断。落实到寄存器就是ISER[2]。60bit从低到高依次排开。至此,嵌套向量中断控制基本设置完成。但是中断还是不能用。因为还没有设置外部中断。

4.设置外部中断。STM32支持19个外部中断。外部中断占据整个中断系统的低19个位。落实到寄存器就是设置EXTI_TypeDef结构体中的IMR(负责开启事件中断),EMR(负责屏蔽时间中断)RTSR和FTSR(负责中断方式)。这样设置完后外部中断还是不能用。因为还没有映射到具体IO口。

5.映射到具体IO口。STM32的设计是每一个IO口都可以充当中断引脚,这一点和51内核的单片机有很大的区别。16个外部中断对应每个端口的16个IO,但是端口可能是A-G,如何确定映射到哪个IO就成了问题。CM3的解决方法是AFIO_TypeDef结构体中的EXTICR[4]数组来确定。具体思路就是用这个数组4个元素的低16位,每四位对应一个IO,从低到高一一对应,四位同时变换出7种状态对应端口的A-G。这样IO就确定下来了。

更为严谨步骤是设置完成最后开启中断。剩下的工作就是编写中断服务函数了。

设置完这四个结构体,外部中断就可以用了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top