第十一章 EXTI——外部中断/事件控制器

第十一章 EXTI——外部中断/事件控制器

目录

第十一章 EXTI——外部中断/事件控制器

1 EXTI简介

2 EXTI功能框图

3 中断/事件线

4 EXTI初始化结构体详解

5 补充说明


本章参考资料:《W55MH32-中文参考手册》中断和事件章节和7.4章节AFIO寄存器描述。

上一章节我们已经详细介绍了NVIC,对W55MH32系列中断管理系统有个全局的了解,我们这章的内容是NVIC的实例应用, 也是W55MH32控制器非常重要的一个资源。学习本章时,配合《W55MH32-参考手册》中断和事件章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。

特别说明,本书内容是以W55MH32系列控制器资源讲解。

1 EXTI简介

        EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的20个中断/事件线。 每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置, 可以单独配置为中断或者事件,以及触发事件的属性。

2 EXTI功能框图

        EXTI的功能框图包含了EXTI最核心内容,掌握了功能框图,对EXTI就有一个整体的把握,在编程时思路就非常清晰。EXTI功能框图见图 EXTI功能框图 。

        在图 EXTI功能框图 可以看到很多在信号线上打一个斜杠并标注“20”字样,这个表示在控制器内部类似的信号线路有20个, 这与EXTI总共有20个中断/事件线是吻合的。所以我们只要明白其中一个的原理,那其他19个线路原理也就知道了。

        EXTI可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。

        首先我们来看图 EXTI功能框图 中红色虚线指示的电路流程。它是一个产生中断的线路,最终信号流入到NVIC控制器内。

        编号1是输入线,EXTI控制器有19个中断/事件输入线,这些输入线可以通过寄存器设置为任意一个GPIO,也可以是一些外设的事件, 这部分内容我们将在后面专门讲解。输入线一般是存在电平变化的信号。

        编号2是一个边沿检测电路,它会根据上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)对应位的设置来控制信号触发。 边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号1给编号3电路,否则输出无效信号0。 而EXTI_RTSR和EXTI_FTSR两个寄存器可以控制需要检测哪些类型的电平跳变过程,可以是只有上升沿触发、只有下降沿触发或者上升沿和下降沿都触发。

        编号3电路实际就是一个或门电路,它的一个输入来自编号2电路,另外一个输入来自软件中断事件寄存器(EXTI_SWIER)。EXTI_SWIER允许我们通过程序控制就可以启动中断/事件线, 这在某些地方非常有用。我们知道或门的作用就是有1就为1,所以这两个输入随便一个有有效信号1就可以输出1给编号4和编号6电路。

        编号4电路是一个与门电路,它的一个输入是编号3电路,另外一个输入来自中断屏蔽寄存器(EXTI_IMR)。与门电路要求输入都为1才输出1, 导致的结果是如果EXTI_IMR设置为0时,那不管编号3电路的输出信号是1还是0,最终编号4电路输出的信号都为0;如果EXTI_IMR设置为1时, 最终编号4电路输出的信号才由编号3电路的输出信号决定,这样我们可以简单的控制EXTI_IMR来实现是否产生中断的目的。 编号4电路输出的信号会被保存到挂起寄存器(EXTI_PR)内,如果确定编号4电路输出为1就会把EXTI_PR对应位置1。

        编号5是将EXTI_PR寄存器内容输出到NVIC内,从而实现系统中断事件控制。

        接下来我们来看看绿色虚线指示的电路流程。它是一个产生事件的线路,最终输出一个脉冲信号。

        产生事件线路是在编号3电路之后与中断线路有所不同,之前电路都是共用的。编号6电路是一个与门,它的一个输入来自编号3电路, 另外一个输入来自事件屏蔽寄存器(EXTI_EMR)。如果EXTI_EMR设置为0时,那不管编号3电路的输出信号是1还是0,最终编号6电路输出的信号都为0; 如果EXTI_EMR设置为1时,最终编号6电路输出的信号才由编号3电路的输出信号决定,这样我们可以简单的控制EXTI_EMR来实现是否产生事件的目的。

        编号7是一个脉冲发生器电路,当它的输入端,即编号6电路的输出端,是一个有效信号1时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。

        编号8是一个脉冲信号,就是产生事件的线路最终的产物,这个脉冲信号可以给其他外设电路使用,比如定时器TIM、模拟数字转换器ADC等等,这样的脉冲信号一般用来触发TIM或者ADC开始转换。

        产生中断线路目的是把输入信号输入到NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用, 并且是电路级别的信号传输,属于硬件级的。

        另外,EXTI是在APB2总线上的,在编程时候需要注意到这点。

3 中断/事件线

        EXTI有20个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0至EXTI15, 还有另外七根用于特定的外设事件,见表 EXTI中断_事件线 。

        4根特定外设中断/事件线由外设触发,具体用法参考《W55MH32参考手册》中对外设的具体说明。

中断 / 事件线

输入源

EXTI0

PX0(X 可为 A, B, C, D, E, F, G, H, I)

EXTI1

PX1(X 可为 A, B, C, D, E, F, G, H, I)

EXTI2

PX2(X 可为 A, B, C, D, E, F, G, H, I)

EXTI3

PX3(X 可为 A, B, C, D, E, F, G, H, I)

EXTI4

PX4(X 可为 A, B, C, D, E, F, G, H, I)

EXTI5

PX5(X 可为 A, B, C, D, E, F, G, H, I)

EXTI6

PX6(X 可为 A, B, C, D, E, F, G, H, I)

EXTI7

PX7(X 可为 A, B, C, D, E, F, G, H, I)

EXTI8

PX8(X 可为 A, B, C, D, E, F, G, H, I)

EXTI9

PX9(X 可为 A, B, C, D, E, F, G, H, I)

EXTI10

PX10(X 可为 A, B, C, D, E, F, G, H, I)

EXTI11

PX11(X 可为 A, B, C, D, E, F, G, H, I)

EXTI12

PX12(X 可为 A, B, C, D, E, F, G, H, I)

EXTI13

PX13(X 可为 A, B, C, D, E, F, G, H, I)

EXTI14

PX14(X 可为 A, B, C, D, E, F, G, H, I)

EXTI15

PX15(X 可为 A, B, C, D, E, F, G, H, I)

EXTI16

PVD 输出

EXTI17

RTC 闹钟事件

EXTI18

USB 唤醒事件

EXTI19

以太网唤醒事件(只适用互联型)

        EXTI0至EXTI15用于GPIO,通过编程控制可以实现任意一个GPIO作为EXTI的输入源。由表 EXTI中断_事件线 可知, EXTI0可以通过AFIO的外部中断配置寄存器1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为PA0、 PB0、PC0、PD0、PE0、PF0、PG0、PH0或者PI0,见图 EXTI0输入源选择 。其他EXTI线(EXTI中断/事件线)使用配置都是类似的。

4 EXTI初始化结构体详解

        标准库函数对每个外设都建立了一个初始化结构体,比如EXTI_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数, 比如EXTI_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

        初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。 初始化结构体定义在w55mh32_exti.h文件中,初始化库函数定义在w55mh32_exti.c文件中,编程时我们可以结合这两个文件内注释使用。

代码清单:EXTI-1 EXTI初始化结构体

typedef struct {
    uint32_t EXTI_Line;                 // 中断/事件线
    EXTIMode_TypeDef EXTI_Mode;         // EXTI模式
    EXTITrigger_TypeDef EXTI_Trigger;   // 触发类型
    FunctionalState EXTI_LineCmd;       // EXTI使能
} EXTI_InitTypeDef;
  1. EXTI_Line:EXTI中断/事件线选择,可选EXTI0至EXTI19,可参考表 EXTI中断_事件线 选择。
  2. EXTI_Mode:EXTI模式选择,可选为产生中断(EXTI_Mode_Interrupt)或者产生事件(EXTI_Mode_Event)。
  3. EXTI_Trigger:EXTI边沿触发事件,可选上升沿触发(EXTI_Trigger_Rising)、 下降沿触发( EXTI_Trigger_Falling)或者上升沿和下降沿都触发( EXTI_Trigger_Rising_Falling)。
  4. EXTI_LineCmd:控制是否使能EXTI线,可选使能EXTI线(ENABLE)或禁用(DISABLE)。

5 补充说明

        关于使用外部按键中断的理解补充,按教程与参考手册的中断/事件线与输入源的表格看,可以使用EXTI0至15线路对应到使用16个GPIO做外部中断, 需要注意的是这16个线路并非都有单独的中断源,从w55mh32.h查看对应芯片型号有EXTI0_IRQn、EXTI1_IRQn、EXTI2_IRQn、EXTI3_IRQn、EXTI4_IRQn、EXTI9_5_IRQn、EXTI15_10_IRQn, 再查看启动文件那边定义的中断函数同样也是EXTI0_IRQHandler、EXTI1_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler、EXTI4_IRQHandler、EXTI9_5_IRQHandler、EXTI15_10_IRQHandler。

        这里再次强调一下关于W55MH32中断应用概览章节的补充说明内容, NVIC_PriorityGroupConfig是整个程序中只需要设置一次 ,当设置好了中断优先级分组,其他各种外设对应的中断向量的中断优先级既是基于目前设置分组来解读。

        在其他例程中很多将NVIC_PriorityGroupConfig写在了每个外设自己的中断配置函数里面,有些可能多个外设配置函数下重复了NVIC_PriorityGroupConfig()这句, 这里提醒用户后续编写自己程序时只需要调用一次即可,并且从代码布局逻辑来说适合放在main()函数中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值