发 帖  
原厂入驻New

[经验] TI,Microchip和STMicro三种流行的微控制器的GPIO中断比较

2020-9-4 07:52:27  251 GPIO中断
分享
1
在这里,我们将比较三个MCU的中断:
  • 德州仪器(ti)的CC2544,用于Logitech M570无线鼠标的USB加密狗中。从技术上讲,这是片上系统,但是系统的一部分是微控制器,我们将重点关注它。
  • microchipatmega328pmicrochip收购了Atmel,后者曾生产该芯片),用于Arduino Uno。
  • STMicroelectronics 的STM32L151C6,用于Fitbit Charge中。
我之所以选择上述微控制器,是因为我可以展示它们所使用的熟悉产品,并为它们提供与现实世界相关的信息。
1.jpg
请记住,我所做的关于微控制器总体工作原理或特定微控制器工作原理的所有陈述都不是一成不变的事实。在一般性声明的情况下,我将讨论什么已成为惯例,但其中许多是特定人员根据各种因素针对其特定产品做出的设计决策。它们不必以这种方式存在,并且如果具有相似影响的另一组人做出不同的设计决策,则它们可以在以后的时间进行更改。因此,当我说一个特定的微控制器具有10个GPIO引脚时,我的真正意思是设计微控制器的团队决定为我所指代的当前版本提供10个GPIO引脚。将来的版本可能具有更多或更少的GPIO引脚。
为了帮助巩固我在本系列中提出的一些想法,我将展示三个示例微控制器中的每个微控制器如何实现GPIO中断,以及如何激活每个特定引脚上的中断。

1、德州仪器(TI)CC2544
我们要看的第一个微控制器是德州仪器(TI )的CC2544 SoC。
2.jpg
具有中断功能的GPIO引脚CC2544具有8个GPIO引脚,分为两个端口(PORT0和PORT1),每个端口具有四个引脚。所有引脚都具有中断功能,并且每个引脚都有单独的中断标志。

中断配置所有8个引脚均可独立配置。每个引脚可以配置为仅检测上升沿(从0变为1)或仅检测下降沿(从1变为0)。每个引脚的中断可以独立启用或禁用。引脚的中断标志总是在配置事件发生时置位,无论该中断是启用还是禁用。

中断向量,服务程序和优先级每个端口每个端口都有一个中断向量(PORT0为P0INT,PORT1为P1INT)。每个中断向量都可以单独启用或禁用。每个向量在中断控制器中都有一个中断标志,该标志在启用中断条件时置位。从文档中还不清楚,仅当启用GPIO中的引脚中断时,P0INT和P1INT标志才被置位。我认为是这种情况。但是,无论是否在中断控制器中启用了它们,中断控制器中的P0INT和P1INT标志都会置位。如果启用了中断,则CPU仅对中断做出响应。
由于端口存在中断向量,因此您必须检查ISR中的引脚标志,以找出该端口中的哪个引脚产生了中断。您还必须清除ISR中的引脚标志和中断向量标志。必须先将引脚标志清零,然后再中断矢量标志。
对于CC2544(通常),每个中断向量不一定具有可以直接设置的单独优先级。每个中断向量是一个组的一部分,最多包含两个其他中断向量。优先级已分配给组,您可以设置组优先级。但是,如果碰巧具有相同的优先级,则存在处理中断的预设顺序。P0INT和P1INT属于不同的中断优先级组,因此仅关注这两个组,就可以控制它们的处理顺序。
CC2544中的ISR可以被更高优先级的中断抢占。

2、芯片atmega328P
我们名单上的第二个是ATmega328P  8位AVR微控制器。
3.jpg
具有中断功能的GPIO引脚ATmega328P具有23个GPIO引脚,分为三个端口:PORTB(八个引脚),PORTC(七个引脚)和PORTD(八个引脚)。所有引脚都通过引脚更改中断具有中断功能。但是,没有单独的中断引脚标志。相反,每个端口都有一个中断标志,但PORTD上的两个引脚除外,可以将其配置为外部中断。它们具有单独的中断标志。

中断配置预设了23个引脚更改中断,以检测引脚值的逻辑更改(0到1或1到0)。但是,可以将两个外部中断配置为检测逻辑值,仅检测上升沿(从0变为1),仅检测下降沿(从1变为0)或稳定0值。每个引脚的引脚更改中断可以独立启用或禁用。另外,可以启用或禁用每个端口的中断。
当端口或任何外部引脚的配置事件发生时,始终将其设置为中断标志,而不管该中断是启用还是禁用。此外,无论引脚配置为输出还是输入,都将设置标志。

中断向量,服务程序和优先级每个端口每个端口都有一个中断向量(PORTB是PCINT0,PORTC是PCINT1,PORTD是PCINT2)。此外,每个外部中断引脚都有自己的独立向量(PORTD中的引脚2为INT0,PORTD中的引脚3为INT1)。每个中断向量都可以单独启用或禁用,但这是在GPIO外设中完成的,而不是在中断控制器中完成(即,中断控制器没有单独的中断向量使能功能,并且所有中断向量使能都在外设中完成)。
由于端口存在中断向量,因此对于引脚更改中断,您必须在ISR中找出触发中断的引脚和事件。这将需要读取端口的中断屏蔽(以找出启用了哪些引脚的中断)和该引脚的当前值,以找出发生了什么逻辑变化。但是,对于两个外部中断,您将已经知道是哪个引脚引起了中断,因为每个引脚都有一个单独的向量。硬件会自动清除外部中断的中断标志,尽管为了安全起见,您仍然可以通过代码清除它们。
对于ATmega328P,中断优先级是固定的,不能更改。复位中断后,在所有中断中,以INT0,INT1,PCINT0,PCINT1,PCINT2的顺序,引脚中断具有最高优先级。
较高优先级的中断可以抢占ATmega328P中的ISR,但这不会自动发生。ISR启动时,CPU禁用所有中断。您必须在ISR代码中手动启用中断才能允许抢占。此外,还有一个称为AVR状态寄存器的寄存器,它是CPU的一部分,在进入中断之前,CPU不会自动存储该值;在退出中断之后,该值不会自动恢复。您必须在ISR中存储和恢复值。这样做的原因是因为CPU必须以中断发生之前的状态恢复。您在ISR中执行的操作可能会修改此寄存器,因此,如果您不保留操作开始和恢复之前的值,

3、意法半导体STM32L151C6
我们将考虑的最终MCU是STM32L151C6  32位MCU。
4.jpg
具有中断功能的GPIO引脚STM32L151C6有37个GPIO引脚,但其中只有16个可以配置为在任何时间点生成中断(称为外部中断)。对于哪些引脚可以同时配置为中断也有一些限制。
37个引脚分为四个端口:
  • PA(16针)
  • PB(16针)
  • PC(3针)
  • PH(2针)
对于PA和PB,引脚从0到15进行标记。PC的引脚为13–15,PH的引脚为0和1。所有带有相同数字标签的引脚(例如PA0,PB0和PH0)共享一条外部中断线(外部中断0),因此在任何时间点只能将其中一个配置为中断。
与ATmege328P和CC2544不同,有一个独立的外部中断处理设备,该设备独立于处理引脚中断的GPIO外设。该设备也不同于微控制器的整体中断控制器。每个外部中断都有自己的标志。

中断配置必须将每个外部中断线配置到在该线上生成中断的GPIO引脚。可以将每个外部中断配置为检测逻辑变化(0到1或1到0),仅检测上升沿(从0变为1)或仅检测下降沿(从1变为0)。这是因为外设是设计好的,所以您可以独立打开或关闭上升沿和下降沿检测。每个中断可以独立启用和禁用。与CC2544和ATmege328P不同,仅当允许中断时才设置外部中断的中断标志。

中断向量,服务程序和优先级外部中断0到4每个都有各自独立的中断向量。外部中断5至9共享一个中断向量,中断10至15也共享一个中断向量。这意味着与GPIO中断相关的共有七个中断向量。这些向量中的每一个都可以独立启用或禁用。每个向量在中断控制器中也都有自己的标志。
ISR必须清除外部中断(GPIO)模块以及中断控制器中的中断标志。该文档没有明确说明执行的顺序,但是最有意义的是遵循CC2544的方法,在中断向量标志之前先清除GPIO标志。
STML151C6中的优先级在配置方式和如何允许抢占方面稍微复杂一些。有两种配置优先级的方法。最简单的方法是使用优先级。有16个不同的优先级。仅优先级用于确定抢占,因此优先级较高的中断可以抢占CPU当前正在处理的中断。每个中断向量都有一个唯一的中断号。如果有两个优先级相同的中断正在等待CPU,则CPU将在能够的情况下选择具有较低中断号的一个。但是,即使中断优先级相同,中断号较低的中​​断也不能抢占优先级较高的中断。
中断配置的第二种方法是使用组优先级和子优先级。不同组和子优先级的数量也是可配置的。不管特定的配置如何,组优先级都像优先级一样起作用。具有较高组优先级的中断可以抢占具有较低组优先级的中断。如果两个或多个具有相同组优先级的中断在CPU上等待,则子优先级和中断号用于确定运行哪个中断。首先使用子优先级。子优先级较高的优先级优先于子优先级较低的优先级。如果两个共享相同的子优先级,则首先处理具有较低中断号的子优先级。



至此,我们的关于并发和GPIO中断的系列文章结束了。如果您对此处介绍的信息有任何疑问,请在下面的评论中告诉我们。

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /9 下一条

快速回复 返回顶部 返回列表