telegram的官网网站
近几年,项目需要,在多款单片机上使用了以太网外设。
本文为阶段知识整理,查缺补漏,方便以后再次遇到相关任务时,可以游刃有余的完成工作。
2023年5月6日创建本文。包含STM32的ETH外设。2023年5月9日修改本文。包含HHD32,GD32的ETH外设。
没有使用中断引脚,通过DMA的方式进行收发。RT-THREADLwIP
纸飞机的官网的下载的网址
根据STM32的型号,可以知道F107支持ETH外设。支持MII模式(25MHz时钟)和RMII模式(50MHz时钟)。
2.1.1 初始化函数 HAL_ETH_Init
函数声明:HAL_StatusTypeDef HAL_ETH_Init(ETH_HandleTypeDef *heth); 用于初始化MAC和DMA。
(1)初始化引脚
包括时钟,中断优先级
(2)选择MII或者RMII模式
(3)软件复位
等待复位完成,有超时机制
(4)初始化MAC
(5)PHY初始化和配置
让PHY芯片进行寄存器复位。
如果启用了“自协商”
如果禁用了“自协商” , 需要写入“双工模式”,“速度”。
配置MAC和DMA
2.1.2 模式配置修改
可以通过SMI总线,软件操作PHY的寄存器,配置PHY的工作模式PHY处于 MII到copper的模式PHY处于 MII到SGMII的模式
2.1.3 配置收发的缓冲区
链模式 Chain Mode
2.1.4 配置网口信息
硬件MAC地址最大传输单元接收广播和ARP
2.1.5 创建信号量
生成一个信号量,用于通知数据的到来
2.1.6 创建一个接收线程
接收线程,函数定义如下。通过等待信号量的方式进行线程的切换实现。
2.1.7 启动网卡
2.2.1 获取驱动发送缓冲区
2.2.2 检查 能否访问
驱动发送缓冲区描述块 DmaTxDescDmaTxDesc->Status 的 Bit 31 OWN: Own bit
1 – 置位时,该位指示描述符归 DMA 所有。(DMA占用中)
0 – 复位时,表示描述符归 CPU 所有。(CPU可控制)DMA 在完成帧传输或在描述符中分配的缓冲区被完全读取时清除该位。
2.2.3 转移数据
把数据从pbufs中,转移到驱动缓冲区中,用于发送。
2.2.4 传递给DMA
把驱动发送描述块 传递给DMA,DMA自动发送出数据
分配pbuf,将传入数据包的字节从接口传输到pbuf。
2.3.1 获取接收的帧数据
2.3.2 分配pbuftelegram的官方的下载地址在哪
如果收到了数据,需要创建接收存放数据的pbuf。用于在lwip协议栈里面流转。
2.3.3 获取驱动接收缓冲区
存放帧数据的驱动接收缓冲区
2.3.4 转移数据
分配pbuf成功后,开始转移数据。
2.3.5 释放接收描述块到DMA
1 – 置位时,该位指示描述符归 DMA 所有。(DMA占用中)0 – 复位时,表示描述符归 CPU 所有。(CPU可控制)
2.3.6 恢复DMA接收
2.3.7 返回pbuf数据
主线程 tcpip_thread接收线程 ethernetif_input
海威华芯未使用low_level 低级别驱动函数。使用“设备Device”模块化接口。因工程代码由多人接手,此处调用结构略微混乱。已做简化处理。
3.1.1 配置MAC地址
在函数rt_hw_hhd_eth_init中定义了MAC地址。
在调用rttelegram官方网站下载的方法是多少_stm32_eth_init时,会将MAC地址写入到相应的寄存器中。
3.1.2 初始化chain mode
初始化环形链表,并赋值关联到收发空间。参考目录的2.0小节。
(1)空间大小定义
(2)数组定义
(3)初始化纸飞机下载网站
(4)启用 DMA 接收描述块的 接收中断标志。
3.1.3 启动ETH外设
启动DMA相关的功能
3.2.1 获取当前发送缓冲区
3.2.2 转移数据
将pbuf数据复制到驱动缓冲区中。
3.2.3 使能发送
offset 表示数据长度
(1)检查能否访问
(2)控制发送缓冲区
设置待发送的数据的长度。同时设置帧头帧尾标志,表示一帧数据全在一个发送描述块中。
(3)启动发送
将描述块的访问权限还给DMA,用于DMA的发送。恢复DMA的发送。
(4)切换当前发送缓冲区
用于下一次获取。
3.3.1 检查能否访问
判断接收描述块,属于CPU还是属于DMA。当属于DMA是,不可以被访问。
3.3.2 接收数据
检测数据块完整性,是不是一个接收描述块 包含了帧头帧尾。ETH_DMARxDesc_FS,ETH_DMARxDesc_LS。检测是否发生错误。ETH_DMARxDesc_ES。获取驱动接收缓冲区的数据长度。分配pbuf空间。复制数据。
3.3.3 恢复DMA接收
将驱动描述块的访问权限,还给DMA。恢复DMA的接收功能。
3.3.4 切换当前接收描述块
用于下一次接收。如果是已经是最后一个环节,则需要切换到第一个描述块。
调用,参数为 stm32_eth_device.parent。下面提到的dev,都是指这里的stm32_eth_device.parent。
3.4.1 创建一个netif网络接口纸飞机下载方法是什么
传递给dev,作为dev的数据成员。
3.4.2 注册设备
函数rt_device_register。设备类型为“网络接口”。初始化信号量。
3.4.3 对netif进行部分赋值
函数rt_device_control,也就是rt_stm32_eth_control函数,用于将MAC硬件地址 stm32_eth_device.dev_addr,复制到 网络接口的硬件地址区 netif->hwaddr。
和HHD32一样使用device的框架。
4.1.1 配置MAC地址
参考3.1.1。
在调用rt_stm32_eth_init时,会将MAC地址写入到相应的寄存器中。
low_level_init();
4.1.2 初始化chain mode
参考3.1.2。
(1)初始化
(2)启用 DMA 接收描述块的 接收中断标志。
4.1.3 启动ETH外设
4.2.1 获取当前发送缓冲区
4.2.2 转移数据
4.2.3 使能发送
参考3.2.3。
4.3.1 获取接收缓冲区的数据
4.3.2 复制数据
创建pbuf,用于存放接收的数据。
4.3.3 恢复dma接收