ESE块11 INT 外部中断
在前面的练习中,我们使用了一个Timer定时器作为内部触发器。然而,在嵌入式系统中,外部触发器至少与定时器具有同等重要性。例如,在汽车中,我们可以找到门上的开关,后备箱盖或行李箱盖,安全带,照明系统,电动窗户,驾驶员区域和方向盘上的各种开关等等,所有这些开关元件已经不再简单地开启或关闭某些功能。这些系统模块的信号由微控制器处理。当然,我们可以通过不断轮询(polling)开关来完成这项任务。但是,在要处理的信号数量庞大时,轮询可能会消耗大量的计算时间,这样就无法为其他任务提供足够的时间。因此,检测信号输入的变化(上升沿或下降沿)以及触发和处理硬件事件,即中断,变得非常重要,因为基于事件的处理消耗的计算资源更少,而且还可以更好地考虑信号的优先级。
任务
要开发一个微控制器应用程序,其中外部信号的下降沿作为控制器活动的触发器。控制器对外部事件的响应应通过切换 LED 实现。
该解决方案应满足以下要求:
- 外部信号,由 A0 上的按钮引发下降沿
- LED连接引脚B0
- 没有持续的轮询(polling)按钮
- 直接在中断中处理事件
准备工作
进行以下准备工作:
- •创建一个新的类图
- •目标语言ARM C ++
- •目标平台STM32F042 mySTM32板灯HAL
- •基本框架应用程序的图模板
- 用于PEC应用程序(XMC,STM32,AVR)
- •为STM32F0分配驱动程序包
- •(可选)分配模板stm32F042_48Mhz
解决路径
任务是通过中断来评估功能键的激活,LED应根据对中断的响应而切换。PEC库提供了PecPinInterrupt库块,用于处理外部中断。
如果仔细看一下该模块,可以看到PecPinInterrupt具有PecPinInput的所有属性,以及如何与pinPullUp和pinLowActive结合使用。这些选项非常适合mySTM32板上指示灯上的按钮,因为按下时它们靠近地面。
对于LED指示灯我们可以使用PecPinOutput或PecLed。 我们已经很熟悉这些组件的处理,可以得出以下的设计草图。
该类模型可以用以下文字描述:
控制器(Controller)有功能键(Funktionstaste)。
功能键(Funktionstaste)是PecPinInterrupt。
功能键(Funktionstaste)有指示灯LED(IndicatorLED)。
指示器LED(IndicatorLED)是PecLed。
此设计的新特性是指示灯LED (IndicatorLED)类不在控制器中,而是聚合到FunctionKey类中。创建了一个结构,FunctionKey类隐藏在IndicatorLED类。否则我们总是将系统块连接到控制器。FunctionKey类现在是IndicatorLED的所有者,因此可以直接使用没有任何限制。此应用程序中没有其他组件使用IndicatorLED。现在FunctionKey和IndicatorLED组成了一个复合单元,控制器(Controller)将用作组件。复合系统组件称为系统组件。
注意:系统组件=来自多个系统组件的聚合
实现
实现应包括上述草图中描述的元素,还必须添加以下模型元素。
- 按钮和LED的特定引脚A0和B0
- 按钮的pinLowActive和pinPullUp
- 覆盖FunctionKey类的onPinInterrupt()虚拟操作
使用以上设计图完成必要的设计步骤。
对按键(信号变化:下降沿)的所需反应应在中断中进行,即在onPinInterrupt()操作中进行。写下切换LED的代码。
::onPinInterrupt():voidindicatorLED.toggle();
类控制器的操作onStart()和onWork保持为空。所有动作都在中断中发生。构建并测试该应用程序。
测试
总结
- 1.创建并打开类图
- 2.选择用于PEC应用程序的图模板,为STM32F0下载载并插入驱动程序包
- 3.在资源管理器中从库中搜索PEC模块
- 4.将所需的库块拖到图中
- 5. 连接类(聚合,实现)
- 6.从系统组件组装组件
- 7.在操作中创建必要的源代码
- 8.在类图中创建并烧录STM32应用程序
视频总结
练习9
扩展应用程序第二个带有UART终端的按钮。每次按下按钮,都以19200波特对计数器进行计数,然后发送到SiSy控制中心。