学习目标

  1. 理解外部中断触发机制
  2. 掌握中断编写逻辑
  3. 了解PCB中断设计注意事项

    学习内容

    STC8H中断外部中断

    | 外部中断 | 引脚 | 备注 | | —- | —- | —- | | INT0 | P3.2 | 支持上升沿和下降沿中断 | | INT1 | P3.3 | 支持上升沿和下降沿中断 | | INT2 | P3.6 | 只支持下降沿中断 | | INT3 | P3.7 | 只支持下降沿中断 | | INT4 | P3.0 | 只支持下降沿中断 |

在数字电路中,信号的电平变化分为上升沿和下降沿。
上升沿指的是信号从低电平变为高电平的瞬间,下降沿指的是信号从高电平变为低电平的瞬间。
例如,当一个开关被按下时,电路中的信号从低电平变为高电平,此时发生了一个上升沿;当开关被松开时,信号从高电平变为低电平,此时发生了一个下降沿。在数字电路中,上升沿和下降沿往往会被用作时序控制和数据传输等方面的参考信号。
97.png

外部中断编写

  1. 引入外部中断库函数
    1. Exti.h``Exti.c``**Exti_Isr.c**
    2. NVIC.c NVIC.h
  2. 配置外部中断 ```c

    include “Exti.h”

    include “NVIC.h”

/** INT配置 **/ void Exti_config(void) { EXTI_InitTypeDef Exti_InitStructure; //结构定义

  1. Exti_InitStructure.EXTI_Mode = EXT_MODE_RiseFall;//中断模式, EXT_MODE_RiseFall,EXT_MODE_Fall
  2. Ext_Inilize(EXT_INT0,&Exti_InitStructure); //初始化
  3. NVIC_INT0_Init(ENABLE,Priority_0); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

} void ext_int0_call(void) { // 当中断触发时的实现逻辑 }

  1. 3. 调用中断触发函数
  2. ```c
  3. extern void ext_int0_call();
  4. //========================================================================
  5. // 函数: INT0_ISR_Handler
  6. // 描述: INT0中断函数.
  7. // 参数: none.
  8. // 返回: none.
  9. // 版本: V1.0, 2020-09-23
  10. //========================================================================
  11. void INT0_ISR_Handler (void) interrupt INT0_VECTOR //进中断时已经清除标志
  12. {
  13. ext_int0_call();
  14. }

外部中断测试

测试外部中断0

测试上升沿和下降沿中断
初始化EXT_INT0,并将P32设置为准双向或HighZ高阻输入模式(不设置默认也是HighZ)。
按下核心板上的P32按钮,编写中断函数,观察上升沿和下降沿对应日志

测试外部中断2、3或者4

案例设置:

  • 准备一个引脚(例如P53暂且叫做A引脚),初始化时为输出模式,并且为低电
  • 初始化中断引脚P3.6或者P3.7(暂且叫做B引脚),配置为下降沿触发,并且实现中断事件函数
  • 通过杜邦线将A引脚和B引脚连接
  • 准备串口,通过串口工具给串口发送指令
  • 串口接收到特定指令时,将A引脚拉高或拉低
  • 在中断事件函数中进行打印,观察打印结果

测试上升沿案例会发现无效,这个由芯片内部决定的。

PCB中断设计

要了解的一些情况:

  1. 芯片引脚支持触发类型,是上升沿触发还是下降沿触发。
  2. 外部中断发送者是否是可控的,是不是能控制高低电平。
    1. 能控制最好,芯片方的引脚只需要关注是不是外部中断引脚。
    2. 不能控制,要了解对方的触发方式,寻找芯片对应的触发类型引脚。
    3. 不能控制,芯片的外部中断引脚没有对应的触发方式了,电路设计时,做上拉或者下拉电阻。

练习题

  1. 模拟外部中断触发上升沿,通过串口进行中断事件触发打印
  2. 模拟外部中断触发下降沿,通过串口进行中断事件触发打印