工程师笔记|STM32H7 以太网的 MMC 中断

发布者:浅唱梦幻最新更新时间:2023-02-01 来源: zhihu关键字:STM32H7  以太网  MMC  中断 手机看文章 扫描二维码
随时随地手机看文章

1、前言

STM32H7 以太网的 MMC(MAC management counter)中断是个有点特别的中断。特殊之处在于它是默认使能。如果我们在代码里不针对 MMC 进行相关处理,就会造成一些异常现象。我们先来看一个真实的客户案例。

2、客户案例

客户使用 STM32H750 作为主控,与其他设备之间进行以太网通讯。

客户在压力测试中发现:

• 设备从第一次通讯开始,累计 7 到 8 天,就会发现 STM32H750 不再响应用户

的请求。

• 客户通过使用 IDE 和添加辅助代码可以发现,STM32H750 会不停地进入以太

网中断,导致所使用的操作系统无法进行有效的系统调度。

• 问题发生后,客户无论拔下网线或者再次连上网线,STM32H750 依然会不停

的进入以太网中断。

• 客户尝试使用 IDE 查看所有以太网寄存器,会发现有时侯能够让系统恢复正

常。

3、分析

系统不停的进入以太网中断,说明某个中断在被某种条件下被不停的触发,或者中断触发后没有被处理。进一步,当系统出现异常状况后,拔掉网线,中断依然不断的进入,说明该异常并不需要外界不停的输入,也就说明可能是中断没有被处理所导致。所以,客户首先想到的是补全所有使能的以太网中断的清除代码。然而,客户再次测试,却发现累计 7 到 8 天,问题再次发生。

在这种情况下,为了深刻了解该状况的原因,我们建议客户,抓取异常时的寄存器现场,然后和正常状态时的寄存器进行对比。我们在设备未发生异常前,抓取了以太网的三组寄存器 DMA、 MTL 和 MAC。同时,我们在发生异常后,在同一设备再次进行这三组寄存器的抓取。然后,我们使用文本比较工具,对两次的寄存器进行比较。我们很快就可以发现,MAC 寄存器存在值得关注的差异。MAC 寄存器对比如下:

我们可以看到在系统异常情况下下,MMCRXIS 和 MMCIS 被置位了。

我们从参考手册 RM0433 (STM32H742, STM32H743/753 and STM32H750 Value line advanced Arm®-based 32-bit MCUs)(直接搜索关键子 MMCRXIS)中可以看到 MMCRXIS 和 MMCIS 表示系统收到了 MMC 接收中断。


在两次三组寄存器的比较中,我们看到系统生成了 MMC 接收中断(MMC_RX_INTERRUPT 中 RXUCGPIS)。这个符合前文的 MMCRXIS 和 MMCIS 的状态。


从参考手册 RM0433 中我们可以看到,只要 MMC 选项使能,该中断标志就为有效。但是我们并没有使能 MMC 选项,甚至我们都没有使能 MMC 中断,为什么还是有中断产生呢?

4、MMC 中断的特点

MMC 选项其实是默认使能。我们可以从参考手册 RM0433 中看到这一点。

在 MMC 默认使能的情况下,什么情况下会产生中断呢?

让我们在 RM0433 里搜索下两次寄存器比较发现的 RXUCGPIS 寄存器:

综合这两点,我们可以认为,在长时间以太网收发包之后,MMC 中断几乎一定会发生。这符合客户案例的场景,例如,重现这个问题需要 7 到 8 天。当然从这里我们也可以推断出,我们如果加快测试数据包收发的发送,MMC 中断会发生更早。那么,如何避免在产品应用中这种问题发生呢?


5、解决方案

1.1. 使用 MMC 中断

MMC 中断是个有用的功能。如果我们要使用的话,可以参考 MMC Rx interrupt register (ETH_MMC_RX_INTERRUPT)和 MMC Tx interrupt register (ETH_MMC_TX_INTERRUPT)的描述。我们需要对 MMC 进行一个读的操作。




这也解释了,客户为什么发现,通过调试器一个一个去读取以太网寄存器,会在某个操作时让异常状态恢复到正常。


1.2. 关闭 MMC 中断

在很多情况下,MMC 中断对实际产品没有意义。例如,在这个案例中,我们可以选择关闭 MMC中断。这就需要用到 MMC 中断的 mask 寄存器:

• MMC Rx interrupt mask register (ETH_MMC_RX_INTERRUPT_MASK)

• MMC Tx interrupt mask register (ETH_MMC_TX_INTERRUPT_MASK)

我们可以添加以下代码到我们的应用代码里

客户反馈找不到 ETH 的定义。其实在 STM32H7 的例程里,我们可以很容易发现 ETH 定义在

STM32CubeRepositorySTM32Cube_FW_H7_V1.8.0DriversCMSISDeviceSTSTM32H7xxIncludestm32h750xx.h:

也就是说,如果你的工程代码源自 STM32Cube 例程,你应该能够加入以上代码并且能够成功运行。

在加入上述代码或者类似操作后,客户反馈,再次进行超过 7 天以上的压力测试,系统运行正常。


6、总结

STM32H7 的 MMC 中断需要加以注意,如果不使用 MMC,需要确保它已经关闭;否则在经过长时间网络收发后,系统会产生并非用户所期望的中断,导致系统假死。另外,我们也看到了调试STM32 以太网的常规方式,也就是借助工具而不需要写代码就可以进行寄存器的比较。这种方法值得使用 STM32 以太网的用户进行调试时参考。


关键字:STM32H7  以太网  MMC  中断 引用地址:工程师笔记|STM32H7 以太网的 MMC 中断

上一篇:工程师笔记|STM32G47x 双 Bank 模式下在线升级
下一篇:工程师笔记|如何开发与存储位置无关的 STM32 应用

推荐阅读最新更新时间:2024-11-17 06:03

以太网联盟宣布启动第2代以太网供电(PoE)认证计划
致力于以太网技术持续成功与进步的全球性联盟- 以太网联盟,,日前宣布启动第2代以太网供电(PoE)认证计划。为了满足业界及最终用户对无缝操作PoE产品和方案的日益增长的要求,该计划包含了认证测试、认证徽标以及认证产品的公示。随着第2代试点计划的顺利完成,第2代PoE认证产品测试将于2020年12月向公众开放。 “PoE近期取得了长足进步,其优势有目共睹。但是,新的调查结果表明,部署方面仍面临较大的挑战。与任何颠覆性技术一样,建立市场信心至关重要。这意味着要确保PoE设备之间的广泛互操作性,最大程度减少因PoE定义数量的增加引起的混淆,并明确区分标准方法与非标准方法。”以太网联盟PoE小组委员会主席David Tremblay
[网络通信]
STM32中断和异常
异常主要分为中断(如IO口,UART,等)和系统异常(如NMI,SYCTICK,等),注意区分中断和系统异常,下文异常为统称, 在CMSIS中,IRQn_Type为异常类型的枚举,系统异常一般为负数,中断则从0开始 常用的操作异常的CMSIS函数,为了可移植性,建议使用这些函数操作异常。中断相关寄存器主要在NVIC,系统异常相关寄存器主要在SCB中。 这些函数在core_cm4.h中定义 系统复位时,所有中断都是禁止的,并且优先级为0(最高优先级),所有系统初始化时要调用一次NVIC_PriorityGroupConfig来设置优先级分组情况。 异常优先级分为抢占优先级和子优先级,高抢占优先级的异常(优先
[单片机]
STM32<font color='red'>中断</font>和异常
300PLCmpi转以太网通过MPI-ETH-XD1.0在发食品发酵控制系统中的应用
摘要 西门子CPU313C 只有一个MPI通讯接口,借助兴达易控MPI-ETH-XD1.0产品,将MPI通讯协议转换成以太网通讯协议,以此实现上位机和触摸屏同时监控的要求。 关键词 发酵集散控制系统 项目名称 《计算机集散控制系统---生化过程控制》 应用行业 目前,计算机集散控制系统广泛应用于各种流程工业的生产过程控制。本方案具体针对生化反应中的发酵过程,可以广泛应用于微生物发酵行业的生产控制。 项目设计要求 本计算机集散控制系统包含控制系统和被控对象,控制系统由上位机(工程师站)及下位机(操作员站)组成,被控对象为25L 发酵罐。上位机是工控机和移动工作站组成可以实现本地及远程控制的监控,下位机由两台触摸屏及西门子
[嵌入式]
300PLCmpi转<font color='red'>以太网</font>通过MPI-ETH-XD1.0在发食品发酵控制系统中的应用
STM32 HAL库 串口DMA发送完成中断
近期使用STM32驱动MAX3485进行485通信,发现STM32F103C8并不自带硬件485首发功能,需要软件上控制IO高低来驱动MAX3485进行485接收、485发送。 根据MAX3485手册可得,进行485发送时给相应引脚高电平。其余时间为低电平进行485接收。因此需要找到串口DMA发送完成的回调函数,在发送完成后将引脚拉低。 在stm32f1xx_hal_uart.c中 /** @defgroup UART_Exported_Functions_Group2 IO operation functions * @brief UART Transmit and Receive functions * @verb
[单片机]
学51单片机-按键的中断检测
接着昨天,继续说按键的事。昨天说的是扫描检测,今个说一下中断检测。先插播一个小故事~~ 当年我和凯凯学单片机的时候,我用扫描检测的方法做的项目,他用中断检测的方法做的项目。当我俩坐一起交流按键检测的方式时,他火了,直接跳起来跟我吼:你不用中断怎么检测? 当时我就意识到他可能陷入了只能用中断的误区,然后就乐呵呵的说:用扫描啊~ 他继续吼,我继续乐,我俩就这样陷入了死循环。终于都累了,然后把程序和原理给他看,了解~ 在STC89C52单片机上,具有外部中断功能的引脚有两个:P3.2 –INT0 和 P3.3-INT1。上电默认的情况下,他们是普通IO引脚;当配置好相关寄存器之后,他们就变成
[单片机]
学51单片机-按键的<font color='red'>中断</font>检测
STM8S类型单片机UART一直进入接收中断问题解决方案
问题描述: 在一个项目中,下位机使用的是STM8S003F3为主芯片。在使用RS485进行与上位机通信时,会一直进入接收中断,根本未接收到上位机的正确数据。 解决过程: 一开始以为是485芯片R0引脚未上拉的缘故导致这个问题,经过将此引脚通过MCU内部上拉,问题得到缓解。程序工作也稳定了,运行了一周也没问题,所以一直以为问题解决了,结果在实地安装后,没过多久又出现了这个问题,按理说,如果是外部电磁干扰,应该是偶发,也不应该出现了就不会好起来,干扰源不可能一直都在。然后又是一个头疼的事啊。。继续找答案解决。 这时又跑去官网下载了stm8s类芯片的应用手册,重点就是它了。 原来stm8s类型芯片的UART使用时在接
[单片机]
Windows CE6.0中断实验过程
1.实验目的:通过本次试验学习Windows CE6.0的中断处理的过程以及熟悉在驱动程序中运行中断的编程。 2.我对Windows CE6.0中断的理解: Windows® CE将中断处理分成两个步骤:中断服务程序ISR和中断服务线程IST。如果中断被使能,则当中断产生时,内核将调用该中断注册的ISR,ISR执行完后将返回系统中断号,内核检查系统中断号并且设置相关的事件,内核设置相关事件后,相应的IST将开始执行。 3.Windows® CE的处理流程: (1)如果一个驱动程序要处理一个中断,那么驱动程序首先要建立一个事件(CreateEvent),然后调用InterruptInitialize将该事件与中断号绑定,这一步会
[单片机]
pic多路adc 中断方式
/* * File: main.c * Author: sm116 * * Created on June 12, 2017, 9:27 AM */ #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT enabled)ON #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)ON
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved