gzyueqian
13352868059

嵌入式开发:配置中断控制器的10个轻松步骤

更新时间: 2022-05-16 10:38:58来源: 粤嵌教育浏览量:7990

  在微控制器上正确设置中断并不容易,工程师在其职业生涯中设置中断的次数似乎并没有什么不同。配置中断总是隐藏一些问题,让嵌入式开发人员摸不着头脑,在晦涩难懂的数据表或在线代码片段中寻找答案。值得庆幸的是,可以遵循10个步骤来缓解这些痛苦,并允许开发人员在第一次尝试时配置中断。



  步骤 1 – 配置GPIO引脚

  在GPIO引脚上触发的外部中断始终是最糟糕的设置中断。外部中断和内部中断之间的唯一区别是需要设置GPIO。配置GPIO本身有许多步骤。首先,启用GPIO 时钟,其次,将GPIO配置为输入。根据硬件,这可能还需要在GPIO外设上配置内部上拉电阻。图1显示了如何在 STM32Nucleo 板上完成此操作的示例。


  图 1 – 配置GPIO引脚

  步骤 2 – 禁用中断

  一旦配置了GPIO引脚,就该开始关注实际的中断配置了。在做任何事情之前,开发人员应该首先禁用所有中断。这确保了在设置过程中,部分配置的中断不会意外触发并使系统陷入混乱和未知状态。

  步骤 3 – 清除中断标志

  现在禁用中断,开发人员不再需要担心设置过程被中断。但是,由于系统的启动状态,在设置过程之前可能存在未决的中断。清除中断标志可以确保一旦中断控制器被配置和启用,系统不会立即跳转到旧的和过期的中断请求。

  步骤 4 – 将引脚连接到中断线

  GPIO引脚配置为输入并准备就绪,但目前它没有在内部连接到任何东西。为了触发中断,嵌入式开发人员需要将该GPIO引脚连接到中断控制器。每个微控制器以略微不同的方式执行此操作。对于ARM微控制器,这是使用系统配置外设 EXTICFG 寄存器完成的。这需要额外的步骤来打开系统配置外设的时钟。图 4 显示了如何为STM32Nucleo板的GPIO C13上的按钮完成此操作的示例。


  图 2 – 将GPIO连接到中断控制器

  步骤 5 – 设置触发极性

  中断控制器现在已连接到GPIO引脚,但控制器不知道实际应该触发中断的内容。现代微控制器有许多不同的选择。中断可以是电平触发和边沿触发,例如上升或下降。触发设置将高度依赖于应用程序。对于STM32 Nucleo板,GPIO有一个上拉电阻,可将输入保持在逻辑1,除非按下按钮。中断控制器可以设置为在上升沿和下降沿触发。图3显示了如何禁用上升沿触发和启用下降沿触发。


  图 3 – 设置下降沿触发

  步骤 6 – 设置中断优先级

  现代中断控制器不是简单直接的外围设备。中断控制器提供了广泛的特性和功能,开发人员可以利用这些特性和功能并针对他们自己的特定应用进行调整。一个中断控制器可以有多达256个不同的中断!如果两个或多个中断同时触发,控制器需要知道应该首先处理哪个中断。设置中断优先级可以是一个简单的练习,只需设置中断控制器中的优先级位。图4中显示了一个使用ARM CMSIS规范的示例。



  图 4 – 设置中断优先级

  步骤 7 – 启用中断

  启用中断通常是一个两步过程。第一步是嵌入式开发人员可以检查中断寄存器并取消屏蔽系统将要使用的中断,取消屏蔽中断允许中断控制器在触发该特定中断时做出响应;第二步是启用实际中断,再次启用中断可能因微控制器而异,因此打开数据表并仔细检查非常重要。图5显示了如何通过首先取消屏蔽中断然后使用CMSIS启用与GPIO C13关联的中断线来启用STM32 Nucleo板上的GPIO C13的示例。


  图 5 – 启用中断

  步骤 8 – 创建中断处理程序

  中断控制器现已配置!只有一个问题,当中断发生时,没有中断处理程序来响应中断。下一个合乎逻辑的步骤是创建一个中断处理程序。有很多方法可以做到这一点,不仅取决于架构,还取决于编译器和IDE。将函数指定为中断通常使用#pragma或类似类型的编译器内在函数。在ARM平台上进行开发时,开发人员只需要查看中断列表并使用匹配的预先指定的处理程序创建一个函数。图6显示了中断处理程序如何查找GPIO C13的示例。


  图 6 – 空中断处理程序

  步骤 9 – 清除处理程序中的中断标志

  大多数微控制器要求开发人员在中断处理程序中手动清除中断标志。在特殊情况下,中断标志会自动清除,但应参考微控制器的数据表来确定哪些中断以这种方式运行。GPIO中断通常作为一个块触发,进入中断后,需要执行简单的检查以确定是哪条GPIO线导致了中断。然后可以清除相应的标志。图7显示了如何做到这一点。

  图 7 – 清除处理程序中的中断标志

  步骤 10 – 测试和调试

  最后,在完成所有这些步骤之后,嵌入式开发人员人员现在可以测试他们的代码了。固件在第一次尝试时不太可能正确运行,但是在密切遵循每个步骤之后,在中断启动并正确运行之前应该只需要进行微小的调整。

免费预约试听课