其他分享
首页 > 其他分享> > STM32F103ZET6外部中断

STM32F103ZET6外部中断

作者:互联网

1、EXTI功能

  外部中断/事件控制器EXTI管理了STM32的20个中断/事件线。

  EXTI的功能框图如下:

  在功能框图中,可以看到很多在信号线上打了一个斜杠并标注“20”的字样,这是表示在STM32内部类似的信号线路有20个,也就是EXTI的20个中断/事件线。

  EXTI可以分为两大部分功能:

  产生中断:如功能图中的红色线。

  产生事件:如功能图中的绿色线。

  EXTI中断功能说明:

  电路1:  

  在功能框图中,电路1是脚位输入线,EXTI有19个中断/事件输入线,这些输入线可以通过外部中断配置寄存器AFIO_EXTI1~AFIO_EXTI2设置为任意一个GPIO,也可以是一些外设的事件。输入线一般是电平变化的信号。

电路2:

  电路2是边沿检测电路。该边沿检测电路是根据EXTI_RTSR上升沿触发选择寄存器和EXTI_FTSR下降沿选择寄存器的设置来控制信号触发。

  如果检测到与EXTI_RTSR和EXTI_FTSR寄存器设置相对应的边沿跳变信号,就出输出有效信号到电路3。通过EXTI_RTSR和EXTI_FTSR寄存器,可以设置触发的信号为:上升沿触发、下降沿触发、电平变化触发(即上升沿和下降沿都可以触发)。 

电路3:

  电路3是一个或们电路,两路输入只要有一路输入有效信号,则输出有效信号。

  从功能图中可以看出,电路3的一路输入来自电路2的输出,另一路来自EXTI_SWIER软件中断事件寄存器。

  EXTI_SWIER寄存器可以通过程序控制启动中断/事件线,即只要在程序中将EXTI_SWIER寄存器的对应位设置为1,那么电路3就会输出有效信号,这样就可以实现软件模拟中断或事件。

电路4:

  电路4是一个门电路,只有当两路都输入有效信号时,电路4才会输出有效信号。

  电路4的输入一路来自电路3的输出,一路来自EXTI_IMR中断屏蔽寄存器。只有当电路3输出有效信号,而且EXTI_IMR寄存器的对应位使能,电路4才会输出有效信号。

  EXTI_IMR寄存器用来使能或屏蔽相应的中断线。

电路5:

  电路5是将EXTI_PR寄存器的内容输出到NVIC中,从而实现系统中断控制。 

  EXTI事件功能说明: 

  EXTI的事件产生线路,最终输出一个脉冲信号。 

  产生事件的线路是在电路3之后才与产生中断的线路有所不同,之前的电路都是共用的。

  电路6: 

  电路3产生的有效信号会被输入到电路6中。电路6是一个门控电路,电路3的输出和EXTI_EMR事件屏蔽寄存器作为电路6的输入。只有当电路3输出有效信号且EXTI_EMR寄存器的相应位使能,电路6才会输出有效信号。 

  EXTI_EMR寄存器用来使能或屏蔽相应的事件线。

电路7: 

  电路7是一个脉冲发生器电路,当电路6产生一个有效信号时将会输出到电路7当中,这时电路7就会产生一个脉冲。

电路8: 

  电路8是一个脉冲信号,这个脉冲信号就是电路7产生的脉冲信号。这个脉冲信号可以给其它外设电路使用,比如TIM定时器、ADC模拟数字转换器等等,这样的脉冲信号一般用来触发TIM或者开始ADC转换。 

  产生中断线路目的是运行相应的中断服务函数,实现功能。

  而产生事件的目的是传输一个脉冲信号给其它外设使用,而且产生事件的是电路级别的信号传输,属于硬件级。 

2、中断/事件线

  EXTI有20个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0和EXTI15,还有4个用于特点的外设事件。它们如下:

  从上面可以看出,EXTI0到EXTI15都是用GPIO口做为中断/事件线,需要通过AFIO_EXTICR1到AFIO_EXTICR4这几个寄存器来配置具体使用哪一个位来作为中断/事件线。

  比如AFIO_EXTICR1寄存器的bit3~bit0位用来选择EXTI0的中断/事件线的输入脚位,如下:

  其它EXTI也是一样的配置,不一样的只是它们的配置位在AFIO_EXTICR1~AFIO_EXITCR4寄存器中的位置不一样而已。

  AFIO_EXTICR寄存器只有低16位有效,每4个bit配置一个EXTI,一个AFIO_EXTICR可以配置4个EXTI,4个AFIO_EXTICR就可以配置16个EXTI,也就是说AFIO_EXTICR1~AFIO_EXITCR4寄存器刚好可以配置EXTI0~EXTI15的输入脚位。

  需要特别注意的是,每一个EXIT只能设置一个IO作为输入线,比如说,如果设置PA0作为EXTI0的输入线之后,PB0和其它P0口就不能作为EXTI0的输入线了。

3、EXTI的中断服务函数

  通过查询IRQn_Type结构体中的中断编号,会发现并不是每个外部中断都有一个对应中断编号。有一些外部中断的中断编号是组合在一起的,如下:

  从上面可以看到,EXTI5~EXTI9的中断编号是同一个,也就是说EXTI5~EXIT9是共用一个中断服务函数,如果要区分是哪一个EXTI产生中断,可以在中断服务函数内查询EXTI_PR。EXTI10~EXTI5的中断也是一样的。

4、EXTI配置流程

  初始化IO口:

  使能要相应IO的时钟。

  将IO口配置上拉或下拉或浮空输入。设置为浮空输入的时候,脚位外部最好接上拉电阻或下拉电阻,防止IO口状态不稳而定,而导致频繁触发中断。

  配置IO与中断线的映射关系:

  由于要配置AFIO_EXTICR1~AFIO_EXITCR4寄存器,所以需要开启复用功能的时钟。

  根据IO配置AFIO_EXTICR寄存器的相应位,使IO作为EXTI功能。

  开启与该IO相对应的中断/事件线并设置触发条件:

  通过EXTI_RTSR和EXTI_FTSR寄存器设置外部中断的触发条件,配置成上升沿触发或下降沿触发或电平变化触发。还需要通过EXTI_IMR寄存器使能相应的外部中断的中断使能位。

  需要注意的是,如果使用外部中单,并设置该中断的EMR事件使能位的话,会引起软件仿真不能跳到中断,而硬件上可以。如果不是这ERM事件使能位的话,软件仿真就可以进入中断服务函数,并且硬件上也可以。

  配置NVIC:

  通过NVIC配置EXTI的中断优先级,并使能中断。

  编写中断服务函数:

  中断服务函数是必不可少的,如果在代码里面开启了中断,但没有编写中断服务函数,就可以引起硬件错误,从而导致程序崩溃。

 

标签:中断,STM32F103ZET6,外部,电路,EXTI,寄存器,输入,事件
来源: https://www.cnblogs.com/h1019384803/p/10994672.html