打印
[信息]

处理来自片外的外部中断/事件的片内硬件模块

[复制链接]
87|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

【EXTI】处理来自片外的外部中断/事件的片内硬件模块——在EXTI中断函数内执行手动清零PR挂起位的位置选择(该是首行还是尾行)


省流:不想看EXTI的基本概念介绍,就想获得PR挂起位清零位置选择该是首行还是尾行得答案得得请查看最末尾得加粗注意事项。

      STM32F103系列单片机最多有60个片上中断,包括了所有片上硬件模块中断源,其中专门为处理片外硬件的中断请求而设置了一个片内硬件模块,其被称为“外部中断/事件控制器”EXTI。也就是EXTI被认为是STM32这种SoC芯片与其片外硬件的中断请求"沟通的桥梁"。

       具体来说在STM32的世界里,外部中断主要用于处理那些来自片外的突发的的信号。比如,旋转编码器的输出信号,这种信号可能很久都不会出现,但一旦出现,就需要STM32立即响应。按键也是一个例子,虽然它也是来自片外的突发事件,但并不推荐用EXTI外部中断来读取按键,因为这样不好处理按键抖动和松手检测的问题。展开来说就是如果强行在EXTI中断函数里实现延时消抖或者松手检测,那么就会大大的延长EXTI中断函数的执行时间,这与中断函数设计的初衷相悖。

       STM32F103系列单片机中只集成了一个EXTI模块,这个模块能够管理19个外部中断请求,即EXTI0~EXTI18,其中EXTI0 ~ EXTI15可由用户自行连接来自片外的外部中断请求。EXTIn的中断在NVIC中的IRQn如下表所示。




     EXTI的中断屏蔽寄存器IMR中相应EXTI通道的对应的屏蔽位,可以单独的向NVIC开放(使能)EXTI中断或者单独的向NVIC屏蔽(禁止)EXTI中断。EXTI的IMR的中断屏蔽位的职能在这点上与其他外部设备的中断使能控制位是一样的。即是否向NVIC中断控制器提出中断请求。

      可EXTI的挂起寄存器PR中的挂起位PR0~PR15则不不同。虽然也属于一种状态位,但是反应的是片外硬件是否向单片机的片内外设EXTI的对应的外部中断通道EXTIn提出中断请求。在这点上与其他外部设备的中断标志状态位是不同的,其他外部设备的中断标志状态位是直接向NVIC反映本设备(片内外设)发生的中断事件,而EXTI的挂起寄存器PR中的挂起位PR0~PR15本质上向NVIC反映的是片外硬件发生的中断事件,只不过是借由芯片的管脚再通过片内外设EXTI作为“桥梁”以间接的方式“二次传达”给NVIC。

      另外EXTI片内外设与其他的片内外设的不同还有一处,那就是EXTI没有时钟控制部分,也就是说RCC模块不管EXTI,换句话说与使用其他的片内外设的模块不同的是使用EXTI模块时候无需先在RCC模块里开启时钟使能位。

以EXTI0外部中断的信号流向说明情况。



    初始化时可以按照信号流向的先后顺序依序完成4个模块的初始化工作。
(1)调用GPIO库函数,初始化EXTIx对应的IOx引脚。
(2)调用GPIO库函数,配置AFIO寄存器,设定IOx引脚作为EXTIx的输入引脚。
(3)调用EXTI库函数,配置EXTI的RTSR和FTSR寄存器,设定EXTIx的触发边沿。
(4)调用EXTI库函数,配置EXT的IMR寄存器,开放EXTIx中断。
现在片外硬件可以通过IOx引脚向EXTIx提出中断请求,而EXTIx接收到中断请求后,会向NVIC提出中断请求。
(5)调用NVIC库函数,完成中断源初始化,设置EXTIx中断源的优先级,并开放EXTIx中断源。
(6)实现EXTI中断处理函数,为外部硬件模块服务。中断处理函数中需要调用清除EXTI中断挂起库函数,即向PR寄存器对应位写1清0,以清除EXTIx中断请求。

注意:

(1)传统上和理论上应该在位于中断函数快要结束的地方调用清除EXTI中断挂起库函数,为的是CPU响应在整个EXTI中断处理函数期间避免EXTI再次识别到来自相同IO管脚上即EXTIn外部中断通道上的片外硬件设备发起的中断请求事件。这样可以经过一段中断函数的执行过程以及在执行中断函数过程中主动人为的添加延时函数,再清除相应的挂起位,以避免如按键抖动等误动作导致错误的反复进入EXTI中断函数的情况发生。

(2)但现实情况可能不保险因为编译器有可能把EXTI中断处理函数给优化了,尤其是把中断函数最后一个语句给优化没了,如何是那样就糟了不能清零EXTI中断挂起位了,所以现实有时候也会在EXTI中断处理函数的首行请写1清零EXTI中断挂起位。

(3)另外现实有些情况下(其实不常见),就是想要实现CPU响应在整个EXTI中断处理函数期间EXTI具备再次识别到来自相同IO管脚上即EXTIn外部中断通道上的片外硬件设备发起的中断请求事件的能力。在整个情况下那也是在EXTI中断处理函数的首行请写1清零EXTI中断挂起位。这种不常见的情况,却是在其他片内外设的中断处理函数中常常出现的“基操”,即一进中断处理函数就首先清零相应的中断标志位(相比之下EXTI这个片内外设反倒是个异类)。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/woshihonghonga/article/details/148521828

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

4252

帖子

0

粉丝