0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第六章 外部中断

W55MH32 ? 来源:W55MH32 ? 作者:W55MH32 ? 2025-05-26 16:27 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

单芯片解决方案,开启全新体验——W55MH32 高性能以太网单片机

W55MH32是WIZnet重磅推出的高性能以太网单片机,它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身,具体来说,一颗W55MH32内置高性能Arm? Cortex-M3核心,其主频最高可达216MHz;配备1024KB FLASH与96KB SRAM,满足存储与数据处理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP协议栈、内置MAC以及PHY,拥有独立的32KB以太网收发缓存,可供8个独立硬件socket使用。如此配置,真正实现了All-in-One解决方案,为开发者提供极大便利。

在封装规格上,W55MH32 提供了两种选择:QFN68和QFN100。

W55MH32Q采用QFN68封装版本,尺寸为8x8mm,它拥有36个GPIO、3个ADC、12通道DMA、17个定时器、2个I2C、3个串口、2个SPI接口(其中1个带I2S接口复用)、1个CAN以及1个USB2.0。在保持与同系列其他版本一致的核心性能基础上,仅减少了部分GPIO以及SDIO接口,其他参数保持一致,性价比优势显著,尤其适合网关模组等对空间布局要求较高的场景。紧凑的尺寸和精简化外设配置,使其能够在有限空间内实现高效的网络连接与数据交互,成为物联网网关、边缘计算节点等紧凑型设备的理想选择。 同系列还有QFN100封装的W55MH32L版本,该版本拥有更丰富的外设资源,适用于需要多接口扩展的复杂工控场景,软件使用方法一致。更多信息和资料请进入http://www.w5500.com/网站或者私信获取。

此外,本W55MH32支持硬件加密算法单元,WIZnet还推出TOE+SSL应用,涵盖TCP SSL、HTTP SSL以及MQTT SSL等,为网络通信安全再添保障。

为助力开发者快速上手与深入开发,基于W55MH32Q这颗芯片,WIZnet精心打造了配套开发板。开发板集成WIZ-Link芯片,借助一根USB C口数据线,就能轻松实现调试、下载以及串口打印日志等功能。开发板将所有外设全部引出,拓展功能也大幅提升,便于开发者全面评估芯片性能。

若您想获取芯片和开发板的更多详细信息,包括产品特性、技术参数以及价格等,欢迎访问官方网页:http://www.w5500.com/,我们期待与您共同探索W55MH32的无限可能。

wKgZO2gbOfaAVPzkACJSygzv-rI600.png

第六章 外部中断

在前面几章的学习中,我们掌握了 W55MH32 的 IO 口最基本的操作。本章我们将介绍如何把 W55MH32 的 IO 口作为外部中断输入来使用。

1 NVIC概述

1.1 NVIC简介

什么是 NVIC?NVIC 即嵌套向量中断控制器,全称 Nested vectored interrupt controller。它是内核的器件,所以它的更多描述可以看内核有关的资料《Cortex-M3 权威指南》。M3 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些资源全部用完,下面我们看看中断向量表-系统中断部分:

位置 优先级 优先级类型 名称 说明 地址
- - 保留 0x0000_0000
-3 固定 - Reset 复位 0x0000_0004
-2 固定 - NMI 不可屏蔽中断
RCC 时钟安全系统 (CSS) 联接到 NMI 向量
0x0000_0008
-1 固定 - 硬件失效 (HardFault) 所有类型的失效 0x0000_000C
0 可设置 - 存储管理 (MemManage) 存储器管理 0x0000_0010
1 可设置 - 总线错误 (BusFault) 预取指失败,存储器访问失败 0x0000_0014
2 可设置 - 错误应用 (UsageFault) 未定义的指令或非法状态 0x0000_0018
- - 保留 0x0000_001C~0x0000_002B
3 可设置 - SVCall 通过 SWI 指令的系统服务调用 0x0000_002C
4 可设置 - 调试监控 (DebugMonitor) 调试监控器 0x0000_0030
- - 保留 0x0000_0034
5 可设置 - PendSV 可挂起的系统服务 0x0000_0038
6 可设置 - SysTick 系统嘀嗒定时器 0x0000_003C

关于 60 个外部中断部分在《W55MH32参考手册_V1.0.0(中文版).pdf》有详细的列表,这里就不列出来了。

1.2 NVIC寄存器

NVIC 相关的寄存器定义了可以在 core_cm3.h 文件中找到。我们直接通过程序的定义来分NVIC 相关的寄存器,其定义如下:

typedef struct
{
 __IOM uint32_t ISER[8U]; /* 中断使能寄存器 */
uint32_t RESERVED0[24U];
 __IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */
 uint32_t RSERVED1[24U];
 __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */
 uint32_t RESERVED2[24U];
 __IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */
 uint32_t RESERVED3[24U];
 __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */
 uint32_t RESERVED4[56U];
 __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */
 uint32_t RESERVED5[644U];
 __OM uint32_t STIR; /* 软件触发中断寄存器 */
} NVIC_Type;

W55MH32 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能方便的使用 W55MH32 的中断。下面重点介绍这几个寄存器:

ISER[8]:ISER 全称是:Interrupt Set Enable Registers,这是一个中断使能寄存器组。上面说了 CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。但是W55MH32 的可屏蔽中断最多只有 60 个,所以对我们来说,有用的就是两个(ISER[0]和ISER[1]),总共可以表示 64 个中断。而 W55MH32 只用了其中的 60 个。ISER[0]的 bit0~31 分别对应中断 0~31;ISER[1]的 bit0~27 对应中断 32~59,这样总共 60 个中断就可以分别对应上了。你要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)。具体每一位对应哪个中断,请参考 W55MH32 xe.h 里面的第 69 行。

ICER[8]:全称是:Interrupt Clear Enable Registers,是一个中断除能寄存器组。该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。具体为什么是这样子,可以查看《Cortex-M3 权威指南》第 125 页,NVIC 章节。

ISPR[8]:全称是:Interrupt Set Pending Registers,是一个中断使能挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是无效的。

ICPR[8]:全称是:Interrupt Clear Pending Registers,是一个中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断解挂。写 0 无效。

IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!W55MH32 的中断分组与这个寄存器组密切相关。IP 寄存器组由 240 个8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。而W55MH32 只用到了其中的 60 个。IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

1.3 中断优先级

W55MH32中的中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。

在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的 8 位,所以就有了 240 个宽度为 8bit 的中断优先级控制寄存器,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌套,即 2^4=16。对于 NVCI 的中断优先级分组:W55MH32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表所示:

优先级分组 AIRCR[10:8] bit [7:4] 分配情况 分配结果
0 111 0:4 0 位抢占优先级,4 位响应优先级
1 110 1:3 1 位抢占优先级,3 位响应优先级
2 101 2:2 2 位抢占优先级,2 位响应优先级
3 100 3:1 3 位抢占优先级,1 位响应优先级
4 011 4:0 4 位抢占优先级,0 位响应优先级

通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如优先级分组设置为 3,那么此时所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。

结合实例说明一下:假定设置中断优先级分组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。

中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:

中断 7>中断 3>中断 6。上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!

1.4 NVIC 相关函数

下面列出我们较为常用的函数进行,想了解更多其他的函数请自行查阅。

1. HAL_NVIC_SetPriorityGrouping 函数

HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。其声明如下:

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

?函数描述:用于设置中断优先级分组。

?函数形参:形参 1 是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 组)。

?函数返回值:无

?注意事项:这个函数在一个工程里基本只调用一次,而且是在程序 HAL 库初始化函数里面已经被调用,后续就不会再调用了。因为当后续调用设置成不同的中断优先级分组时,有可能造成前面设置好的抢占优先级和响应优先级不匹配。

2. HAL_NVIC_SetPriority 函数

HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);

?函数描述:用于设置中断的抢占优先级和响应优先级(子优先级)。

?函数形参:

······形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 W55MH32 xe.h。

······形参 2 是抢占优先级,可以选择范围:0 到 15。

······形参 3 是响应优先级,可以选择范围:0 到 15。

?函数返回值:无

3. HAL_NVIC_EnableIRQ 函数

HAL_NVIC_EnableIRQ 是中断使能函数。其声明如下:

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

?函数描述:用于使能中断。

?函数形参:形 参 IRQn 是 中 断 号 , 可 以 选 择 范 围 : IRQn_Type 定 义 的 枚 举 类 型 , 定 义 在W55MH32 xe.h。

?函数返回值:无

4. HAL_NVIC_DisableIRQ 函数

HAL_NVIC_DisableIRQ 是中断除能函数。其声明如下:

void HAL_NVIC_disableIRQ(IRQn_Type IRQn);

? 函数描述:用于中断除能。

?函数形参:形参 IRQn 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 W55MH32 xe.h。

?函数返回值:无

5. HAL_NVIC_SystemReset 函数

HAL_NVIC_SystemReset 是系统复位函数。其声明如下:

void HAL_NVIC_SystemReset(void);

?函数描述:用于软件复位系统。

?函数形参:无形参

?函数返回值:无

其他的 NVIC 函数用得较少,我们就不一一列出来了。NVIC 的介绍就到这,下面介绍外部中断。

2 EXTI概述

2.1 EXTI简介

EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断求。EXTI 的功能框图是最直接把有关 EXTI 的知识点连接起来的图,掌握了该图的来龙去脉,就会对 EXTI 有了一个整体熟悉,编程时候可以得心应手。

2.2 EXTI功能框图解析

EXTI 的功能框图如下图所示:

wKgZPGg0JHKARQ7VAAFvPiloguQ794.png

从 EXTI 功能框图可以看到有两条主线,一条是由输入线到 NVIC 中断控制器,一条是由输入线到脉冲发生器。这就恰恰是 EXTI 的两大部分功能,产生中断与产生事件,两者从硬件上就存在不同。

下面让我们看一下 EXTI 功能框图的产生中断的线路,最终信号是流入 NVIC 控制器中。输入线是线路的信息输入端,它可以通过配置寄存器设置为任何一个 GPIO 口,或者是一些外设的事件。输入线一般都是存在电平变化的信号。

标号①是一个边沿检测电路,包括边沿检测电路,上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’到标号②部分电路,否则输入无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置。

标号②是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输入信号。或门电路只要输入端有信号‘1’,就会输出‘1’,所以就会输出‘1’到标号③电路和标号④电路。通过对软件中断事件寄存器的读写操作就可以启动中断/事件线,即相当于输出有效信号‘1’到或门电路输入端。

标号③是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,这样子的情况下,如果中断屏蔽寄存器(EXTI_IMR)设置为 0 时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是 0;假如中断屏蔽寄存器(EXTI_IMR)设置为 1 时,最终标号③电路输出的信号才由标号②电路输出信号决定,这样子就可以简单控制 EXTI_IMR 来实现中断的目的。标号④电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置 1。最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。接下来我们看看 EXTI 功能框图的产生事件的线路。产生事件线路是从标号②之后与中断线路有所不用,之前的线路都是共用的。

标号④是一个与门,输入端来自标号②电路以及来自于事件屏蔽寄存器(EXTI_EMR)。如果 EXTI_EMR 寄存器设置为 0,那不管标号②电路输出的信号是‘0’还是‘1’,最终标号④输出的是‘0’;如果 EXTI_EMR 寄存器设置为 1,最终标号④电路输出信号就由标号③电路输出的信号决定,这样子就可以简单的控制 EXTI_EMR 来实现是否产生事件的目的。标号④电路输出有效信号 1 就会使脉冲发生器电路产生一个脉冲,而无效信号就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。产生中断线路目的使把输入信号输入到 NVIC,进一步运行中断服务函数,实现功能。而产生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。EXTI 支持 19 个外部中断/事件请求,这些都是信息输入端,也就是上面提及到了输入线,具体如下:

?EXTI 线 0~15:对应外部 IO 口的输入中断

?EXTI 线 16:连接到 PVD 输出

?EXTI 线 17:连接到 RTC 闹钟事件

?EXTI 线 18:连接到 USB 唤醒事件

?EXTI 线 19:连接到以太网唤醒事件

从上面可以看出,W55MH32 供给 IO 口使用的中断线只有 16 个,但是 W55MH32 的 IO 口却远远不止 16 个,所以W55MH32把 GPIO 管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样子每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0 和 GPIOG.0。而中断线每次只能连接到 1个 IO 口上,这样就需要通过配置决定对应的中断线配置到哪个 GPIO 上了。GPIO 和外部中断线映射关系是在寄存器 AFIO_EXTICR1 ~ AFIO_EXTICR4 中配置的。

wKgZPGg0JHOATlTXAARKjgMvjOw550.png

AFIO_EXTICR1 寄存器配置 EXTI0 到 EXTI3 线,对应的外部中断引脚有 PAx 到 PGx,x=0 到 3。AFIO_EXTICR2 寄存器配置 EXTI4 到 EXTI7 线,对应的外部中断引脚有 PAx 到PGx,x=4 到 7。AFIO_EXTICR3 寄存器配置 EXTI8 到 EXTI11 线,对应的外部中断引脚有PAx 到 PGx,x=8 到 11。AFIO_EXTICR4 寄存器配置 EXTI12 到 EXTI15 线,对应的外部中断引脚有 PAx 到 PGx,x=12 到 15。另外要注意的是,我们配置 AFIO 相关寄存器前,还需要打开 AFIO 时钟。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5447

    浏览量

    125400
  • NVIC
    +关注

    关注

    0

    文章

    36

    浏览量

    12090
  • 外部中断
    +关注

    关注

    1

    文章

    133

    浏览量

    16267
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数据采集光盘实例第一第六章

    数据采集光盘实例第一第六章
    发表于 06-28 21:02

    数据采集光盘实例第六章至第十二

    数据采集光盘实例第六章至第十二
    发表于 06-28 21:17

    求王庆利《单片机设计标准教程》第六章的一个函数!!

    在做一个设计,急需《单片机设计标准教程》里第六章 的I2C总线函数 #include“IIClib.h” 谁有帮忙拍张图片传一下
    发表于 05-05 21:20

    《测控电路》习题完整参考答案(第六章

    《测控电路》习题完整参考答案(第六章
    发表于 05-07 11:36

    脉冲波形发生器与整形电路 第六章

    脉冲波形发生器与整形电路 第六章 555定时器及其应用集成和其它单稳态触发器集成施密特触发器其它多谐振荡器电路脉冲产生与整形电路的应用
    发表于 04-22 14:05 ?42次下载

    三相电路(第六章)

    三相电路(第六章) 一、 三相电源及其连接若三个电压源的电压uA,uB,uC的最大值相等,频率相同,相位互差120°,则此三个电压源的组合称为对称
    发表于 05-23 15:17 ?38次下载

    高频电子线路第六章答案

    高频电子线路第六章答案.
    发表于 06-05 10:41 ?41次下载

    PCB布线设计经验谈附原理图(第六章)

    PCB布线设计经验谈附原理图(第六章)   对于12位传感系统的布线,应用的电路是一负载单元电路,该电路可精确测量传感器上施加的
    发表于 10-28 09:30 ?1166次阅读
    PCB布线设计经验谈附原理图(<b class='flag-5'>第六章</b>)

    《测控电路》习题完整参考答案(第六章

    《测控电路》习题完整参考答案(第六章
    发表于 02-07 15:17 ?0次下载

    数字信号处理 第六章

    数字信号处理 第六章
    发表于 10-19 09:34 ?4次下载
    数字信号处理 <b class='flag-5'>第六章</b>

    静噪基础第六章_EMI静噪滤波器

    静噪基础第六章,EMI静噪滤波器
    发表于 01-24 16:25 ?4次下载

    STM8S BLDC电机第六章工程的stm8选项字节配置

    STM8S BLDC电机第六章工程的stm8选项字节配置
    发表于 03-05 15:07 ?8次下载

    电力系统继电保护第六章-变压器保护(课件)下载.ppt

    继电保护第六章-变压器保护(课件)
    发表于 04-28 09:45 ?0次下载
    电力系统继电保护<b class='flag-5'>第六章</b>-变压器保护(课件)下载.ppt

    计算机网络第六章应用层资源下载

    计算机网络第六章应用层资源下载
    发表于 05-17 10:25 ?0次下载

    HT合泰单片机入门教程(第六章 时基中断

    定时器第五 PWM第六章 时基中断前言当我们只是想固定频率的中断、或者想对整个系统运行进行计数和计时,又或者定时器不够用。那该怎么办呢?这一
    发表于 11-24 16:21 ?7次下载
    HT合泰单片机入门教程(<b class='flag-5'>第六章</b> 时基<b class='flag-5'>中断</b>)