聊聊STM32网络之中断

网络 通信技术
网络中断向量:一个用于正常的网络操作,另一个当它映射到EXIT线路19的时候,用于以太网唤醒事件(带有唤醒帧或魔术数据包检测)

[[380734]]

01简介

网络中断向量:一个用于正常的网络操作,另一个当它映射到EXIT线路19的时候,用于以太网唤醒事件(带有唤醒帧或魔术数据包检测)

第一个网络中断保留为MAC和DMA产生的中断,正如在MAC中断和DMA中断部分。

第二个中断保留为唤醒事件时PMT产生的中断。唤醒事件对EXIT线路19的映射是造成STM32F20X和STM32F21X退出低功耗模式,并且产生中断。

当映射到EXIT线路19的以太网唤醒事件发生和,MACPMT中断使能并且有一个上升沿的EXIT线路19中断也被使能,他们都能唤醒中断。

可使用看门狗定时器(请参见ETH_DMARSWTR 寄存器)灵活控制RS 位(ETH_DMASR寄存器)。当此看门狗定时器使用非零值编程时,看门狗定时器激活,只要RXDMA完成发送一个接收的数据帧到系统存储,在没有触发接收状态,因为它不是使能的在相应的接收描述符(RDES1[31])(也就是:未在相应接收描述符(RDES1[31])使能接收状态)。当定时器按照编程值运行时,RS位被置1并且中断发生,如果ETH_DMAIER寄存器中相应位使能。看门狗定时失效在运行前,当数据帧被发送到内存,并且RS置1,因为定时器被使能为描述符。

注意:

读取PMT 控制和状态寄存器会自动将接收的唤醒帧和接收的魔术数据包PMT 中断标志清零。但是,由于用于这些标志的寄存器位于 CLK_RX域,因此在固件能发现此更新前可能有显著的延迟。当 RX 时钟很慢(在10 Mbit 模式)和当AHB 总线为高频时,该延迟会特别长。

由于从PMT 到CPU 的中断请求基于CLK_RX 域中的相同寄存器,所以即使在读取PMT_CSR 之后,CPU也可能错误地第二次调用中断例程。因此,可能需要固件轮询接收的唤醒帧和接收的魔术数据包位,并仅在发现它们都为‘0’时退出中断服务程序。

02代码

STM32的网络中断,其实准确来说应该是网络专用的DMA的中断,网络中的数据包符合1518规则,也就是说是1460字节,MAC接收的数据包是2K字节,网络上每一个数据包MAC接收完都会产生中断。

官方代码是这样的

 

明显是使用查询的方式,没有使用到中断。

中断的使用方式如下:

配置网络中断

 

注释掉官方提供的查询部分的代码。

 

我们使用中断形式之后,代码是

 

这样的代码,我们在接收小于一个DMA描述符数据大小的数据没有问题,很流畅。

DMA描述符部分内容请看《STM32网络之DMA控制器》。

在接收大量数据的时候就会出现错误,接收的会缓慢,接收的过多会死机

解决办法是:

把if修改成while

 

 

这样就把整个数据包接收完之后再跳出中断,这样就解决了这个问题。

本文转载自微信公众号「知晓编程」,可以通过以下二维码关注。转载本文请联系知晓编程公众号。

 

责任编辑:武晓燕 来源: 知晓编程
相关推荐

2021-01-20 09:51:25

STM32网络接口

2021-02-03 13:04:24

STM32网络控制器

2021-05-06 08:54:39

串口DMASTM32

2021-05-20 07:26:22

DMASTM32数据

2021-08-26 06:29:47

STM32DWT数据观察点触发

2021-12-22 06:56:07

STM32C语言内存

2022-10-10 08:24:15

编程数据逻辑语句

2022-01-07 08:24:13

STM32枚举结构体

2021-08-31 08:01:40

STM32DSP指令

2022-07-25 14:31:55

LiteOS开发工具

2021-06-26 07:50:20

STM32串口开发环形缓冲区

2021-04-22 08:39:23

哈佛结构冯洛伊曼结构ARM架构

2021-02-26 08:46:46

PHY寄存器网络

2021-11-15 09:53:16

STM32PSPMSP

2020-12-22 14:03:07

网络安全物联网

2020-12-03 06:32:21

STM32单片机通信

2019-01-24 16:27:28

2011-12-07 15:24:11

英特尔万兆网卡数据中心

2011-08-19 11:50:56

IPv6网络

2020-08-06 08:15:02

网络安全新基建技术
点赞
收藏

51CTO技术栈公众号