STM32F107 以太网 + RL-TCPnet

发布者:CW13236066525最新更新时间:2019-07-08 来源: eefocus关键字:STM32F107  以太网  RL-TCPnet 手机看文章 扫描二维码
随时随地手机看文章

介绍一下STM32F107以太网的配置和移植RL-TCPnet协议栈,官方所给的例程为lwip,这里介绍一下怎样使用RL-TCPnet。(需要包含stm32_eth.c和stm32_eth.h)


这里是描述符的定义,什么是描述符请看《STM32中文参考手册》以太网章节


/* 描述符数量和缓存大小定义 */

#define NUM_RX_BUF          4      //接收描述符数量和缓存数量

#define NUM_TX_BUF          2      //发送描述符数量和缓存数量

#define ETH_BUF_SIZE        1536   //每个缓存大小

/* 接收描述符和发送描述符结构体类型定义(含义请参考STM32中文参考手册) */

typedef struct {

  U32 volatile Stat;

  U32 Ctrl;

  U32 Addr;

  U32 Next;

} RX_Desc;


typedef struct {

  U32 volatile CtrlStat;

  U32 Size;

  U32 Addr;

  U32 Next;

} TX_Desc;


/* 当前使用的描述符序号 */

static U8 TxBufIndex;

static U8 RxBufIndex;


/* DMA描述符声明 */

static RX_Desc Rx_Desc[NUM_RX_BUF];

static TX_Desc Tx_Desc[NUM_TX_BUF];


/* 描述符所指向的内存 */

static U32 rx_buf[NUM_RX_BUF][ETH_BUF_SIZE>>2];

static U32 tx_buf[NUM_TX_BUF][ETH_BUF_SIZE>>2];


要使用RL-TCPnet协议栈需要为RL-TCPnet提供接口函数:

void init_ethernet (void);

void send_frame (OS_FRAME *frame);

void int_enable_eth (void);

void int_disable_eth (void);

以下为对应函数:


//以太网硬件初始化(提供给RL-TCPnet的接口)

void init_ethernet (void) {

NVIC_InitTypeDef   NVIC_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

ETH_InitTypeDef ETH_InitStructure;

#define TIME_OUT 0x0003FFFFul

uint32_t time = 0;

/* 使能时钟  */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ETH_MAC | RCC_AHBPeriph_ETH_MAC_Tx |

                      RCC_AHBPeriph_ETH_MAC_Rx, ENABLE);

/* 使能GPIO时钟 */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC |

                       RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO,

   ENABLE);

/* 选择中断向量表 */

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 

 

/* 使能以太网全局中断*/

NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure); 

/*

以太网引脚配置

当前使用RMII接口,无重映射

需要使用MII接口请自行参照手册修改

*/

/* AF Output Push Pull:

-ETH_RMII_MDIO: PA2

-ETH_RMII_MDC: PC1

-ETH_RMII_TX_EN: PB11

-ETH_RMII_TXD0: PB12

-ETH_RMII_TXD1: PB13

*/

/* Configure PA2 as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure PC1 as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* Configure PB5, PB8, PB11, PB12 and PB13 as alternate function push-pull */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);

/* Input:

-ETH_RMII_REF_CLK: PA1

-ETH_RMII_CRS_DV: PA7

-ETH_RMII_RXD0: PC4

-ETH_RMII_RXD1: PC5

*/

/* Configure PA1 and PA7 as input */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure PC4 and PC5 as input */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOC, &GPIO_InitStructure);

/* 选择配置为MII或者RMII,当前为RMII*/

GPIO_ETH_MediaInterfaceConfig(GPIO_ETH_MediaInterface_RMII);

/* 重置以太网 */

ETH_DeInit();

ETH_SoftwareReset();

/*等待重置完成*/

while (ETH_GetSoftwareResetStatus() == SET);

/* 以太网配置, 填充ETH_InitStructure结构体,最后调用 ETH_Init()配置以太网*/

ETH_StructInit(Ð_InitStructure);

/*------------------------   MAC   -----------------------------------*/

ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Enable  ;

ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable;

ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable;

ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable;

ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Disable;

ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Enable;

ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable;

ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect;

ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect;

#ifdef CHECKSUM_BY_HARDWARE

ETH_InitStructure.ETH_ChecksumOffload = ETH_ChecksumOffload_Enable;

#endif

/*------------------------   DMA   -----------------------------------*/  

ETH_InitStructure.ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Enable; 

ETH_InitStructure.ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable;         

ETH_InitStructure.ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable;     

ETH_InitStructure.ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable;       

ETH_InitStructure.ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable;   

ETH_InitStructure.ETH_SecondFrameOperate = ETH_SecondFrameOperate_Enable;                                                          

ETH_InitStructure.ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable;      

ETH_InitStructure.ETH_FixedBurst = ETH_FixedBurst_Enable;                

ETH_InitStructure.ETH_RxDMABurstLength = ETH_RxDMABurstLength_32Beat;          

ETH_InitStructure.ETH_TxDMABurstLength = ETH_TxDMABurstLength_32Beat;                                                                 

ETH_InitStructure.ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_2_1;

/*初始化以太网,第二个参数为PHY芯片地址*/

ETH_Init(Ð_InitStructure, LAN9303_VPHY_ADDR);

//接收描述符初始化

rx_descr_init();

//发送描述符初始化

tx_descr_init();

/* 使能正常总中断和接收中断*/

ETH_DMAITConfig(ETH_DMA_IT_NIS | ETH_DMA_IT_R, ENABLE);

//使能发送和接收

ETH->DMAOMR |= DOMR_ST | DOMR_SR;

ETH->MACCR |= MCR_RE | MCR_TE;

//配置MAC地址,否则只能收到广播数据

ETH_MACAddressConfig(ETH_MAC_Address0, own_hw_adr);

}


//使能和禁止以太网中断

void int_enable_eth (void) {

/* Ethernet Interrupt Enable function. */

NVIC->ISER[1] = 1 << 29;

}

void int_disable_eth (void) {

/* Ethernet Interrupt Disable function. */

NVIC->ICER[1] = 1 << 29;

}


//发送一帧数据(提供给RL-TCPnet的接口函数)

void send_frame (OS_FRAME *frame) {

U32 *sp,*dp;

U32 i,j;

j = TxBufIndex;

/* 等待之前数据发送完 */

while (Tx_Desc[j].CtrlStat & DMA_TX_OWN);

sp =** (U32 *)&frame->data[0];

dp = (U32 *)Tx_Desc[j].Addr;


/* 拷贝需要发送的数据到发送描述符指定的内存 */

for (i = (frame->length + 3) >> 2; i; i--) {

*dp++ = *sp++;

}


//发送数据量

Tx_Desc[j].Size = frame->length;

//修改发送描述符属于DMA

Tx_Desc[j].CtrlStat |= DMA_TX_OWN;

/* 往DMATPDR中写数据开始DMA传输 */

if((ETH->DMASR | DSR_TBUS) !*= 0)

{

ETH->DMASR = DSR_TBUS;

ETH->DMATPDR = 0;

}

if (++j == NUM_TX_BUF) j = 0;

TxBufIndex = j;

}


以上即为需要提供给RL-TCPnet的接口函数。


中断服务函数,用于接收以太网数据。


//以太网中断服务函数(用于接收以太网数据)

void ETH_IRQHandler (void) {

/* Ethernet Controller Interrupt function. */

OS_FRAME *frame;

U32 i,RxLen;

U32 *sp,*dp;

i = RxBufIndex;

do {

/* Valid frame has been received. */*

if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK) {

goto rel;

}

if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK) {

goto rel;

}

RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4;

if (RxLen > ETH_MTU) {

/* Packet too big, ignore it and free buffer. */

goto rel;

}

/* Flag 0x80000000 to skip sys_error() call when out of memory. */

frame = alloc_mem (RxLen | 0x80000000);

/* if 'alloc_mem()' has failed, ignore this packet. */

if (frame != NULL) {

sp = (U32 *)(Rx_Desc[i].Addr & ~3);

dp = (U32 *)&frame->data[0];

for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--) {

*dp++ = *sp++;

}

put_in_queue (frame);

}

/* Release this frame from ETH IO buffer. */

rel:

Rx_Desc[i].Stat = DMA_RX_OWN;

if (++i == NUM_RX_BUF) i = 0;

while ((Rx_Desc[i].Stat & DMA_RX_OWN) == 0);

RxBufIndex = i;


if (ETH->DMASR & INT_RBUIE) {

/* Rx DMA suspended, resume DMA reception. */

ETH->DMASR   = INT_RBUIE;

ETH->DMARPDR = 0;

}

/* Clear the interrupt pending bits. */

ETH->DMASR = INT_NISE | INT_RIE;

}


接收描述符初始化


//接收描述符初始化

static void rx_descr_init (void) {

/* Initialize Receive DMA Descriptor array. */

U32 i,next;

RxBufIndex = 0;

for (i = 0, next = 0; i < NUM_RX_BUF; i++) {

if (++next == NUM_RX_BUF) next = 0;

Rx_Desc[i].Stat = DMA_RX_OWN;

Rx_Desc[i].Ctrl = DMA_RX_RCH | ETH_BUF_SIZE;

Rx_Desc[i].Addr = (U32)&rx_buf[i];

Rx_Desc[i].Next = (U32)&Rx_Desc[next];

}

//指向第一个描述符

ETH->DMARDLAR = (U32)&Rx_Desc[0];

}


发送描述符初始化


//发送描述符初始化

static void tx_descr_init (void) {

/* Initialize Transmit DMA Descriptor array. */

U32 i,next;

TxBufIndex = 0;

for (i = 0, next = 0; i < NUM_TX_BUF; i++) {

if (++next == NUM_TX_BUF) next = 0;

Tx_Desc[i].CtrlStat = DMA_TX_TCH | DMA_TX_LS | DMA_TX_FS;

Tx_Desc[i].Addr     = (U32)&tx_buf[i];

Tx_Desc[i].Next     = (U32)&Tx_Desc[next];

}

//指向第一个描述符

ETH->DMATDLAR = (U32)&Tx_Desc[0];

}


到此,在工程中加入RL-TCPnet库和配置文件即可使用RL-TCPnet,使用方法请参照RL-arm帮助文档。


关键字:STM32F107  以太网  RL-TCPnet 引用地址:STM32F107 以太网 + RL-TCPnet

上一篇:stm32f4 SD卡调试日志
下一篇:STM32F103代码远程升级(二)基于串口IAP的简单实现

推荐阅读最新更新时间:2024-11-13 15:43

STM32F107的时钟设置由25M修改成8M
1.首先找到stm32f10x.h, system_stm32f10x.c这两个文件; 2. system_stm32f10x.c修改 #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) #define SYSCLK_FREQ_HSE HSE_Value /*#define SYSCLK_FREQ_24MHz 24000000 */ #else /* #define SYSCLK_FREQ_HSE HSE_Value */ /* #define SYSCLK_FREQ_24MHz 24000000 */ /* #define SYSCLK_FREQ_36MHz
[单片机]
Quantenna和Lantiq为以太网路由器提供系统解决方案
在CES2015上发布的世界首款AC2000系统解决方案为中档以太网零售路由器细分市场带来最高的Wi-Fi 4x4性能。 拉斯维加斯-2015年1月5日-国际消费电子展--超高性能Wi-Fi领域领导厂商宽腾达通讯有限公司(Quantenna Communications, Inc.)与芯片组供应商领特公司(Lantiq)日前宣布:其面向以太网零售路由器市场的一款联合系统解决方案现在开始供货。该解决方案结合了Quantenna的QSR1000 4x4 802.11ac芯片和Lantiq的GRX300通信处理器系列产品,为中档以太网零售路由器市场带来超高性能的Wi-Fi技术。目前的AC1750和AC1900中档路由器仅提供3
[焦点新闻]
浅谈车载以太网
写这篇帖子的现在我正在东北隔离,10月初因为有事从德国回国,到今天已经在一个房间待了半个多月了,足不能出户,就在某乎写Autosar相关的帖子,机缘巧合认识了网友徽州骆驼,向我推荐了这里,我正好也想了解下国内汽车软件行业的情况也想和志同道合的朋友多交流。 我的主要工作经历是在德国,毕业后先在一所德国大学工作了五年,主要从事车载总线CAN,LIN等相关的嵌入式系统的工作,后来离开大学进入了一家做车载信息娱乐系统的Tier1的研发中心工作了五年,开始做中间件Framework相关的研发,略了解了SOME/IP和CommonAPI相关的部分内容,后来公司改组,进入了以太网研发的部门,开始做AVB相关的工作,设计研发测试和协调管理都有
[汽车电子]
浅谈车载<font color='red'>以太网</font>
瑞萨电子R-IN32M3(RY9012A0)工业以太网模块介绍
近年来,随着工业自动化建设全面提速,工业控制领域对于网络性能的要求越来越高,在这种需求下,工业以太网正在以其优异的特性取代传统的总线(如RS-485),成为连接各主设备和从设备的主要通信网络。 在本篇文章中,瑞萨电子就为您介绍一款带工业以太网模块的工业自动化解决方案。该方案采用瑞萨电子的R-IN32M3模块,支持三大主流行业标准协议栈:PROFINET RT、Ethernet/IPTM和EtherCAT,并集成了RX66T/RA6M4 MCU与多种可用于环境质量监测的传感器模块,可使客户能够轻松开发工业以太网系统。 系统框图 瑞萨电子R-IN32M3(RY9012A0)工业以太网模块是经过认证的多协议双端口以太网模块,其配
[嵌入式]
瑞萨电子R-IN32M3(RY9012A0)工业<font color='red'>以太网</font>模块介绍
什么是以太网?在汽车上是如何应用的?
什么是以太网?在汽车上是如何应用的? 以太网是一种传输技术,用于在局域网(LAN)中传输数据。它是一种标准化的通信协议,用于将数据传输到互联网或其他局域网中的设备。以太网是由计算机科学家罗伯特·梅特卡夫(Robert Metcalfe)在20世纪70年代初提出的,它基于分组交换技术和CSMA/CD协议(载波监听多路访问/冲突检测)。 以太网使用双绞线、光纤或无线网络连接设备,如计算机、打印机、路由器等。它使用MAC(媒体访问控制)地址来标识设备,并通过以太帧(Ethernet frame)传输数据。每个以太帧包含源和目标MAC地址、数据和纠错校验等字段。 以太网在汽车领域中的应用日益广泛。它主要用于帮助实现车辆内部的通信和连接。以
[嵌入式]
使用重定时器和转接驱动器保持以太网信号完整性
本文作者:Lin Zhihong,是德州仪器(TI)接口业务的产品营销工程师。 互联网上视频和云应用的不断增加,正促使数据中心和云存储朝着400G以太网络发展,以满足带宽需求。随着数据使用量的增加,维护通信和数据中心设备中千兆以太网传输线上高速网络信号完整性的挑战也随之增加。 当信号通过PCB、连接器和电缆时,其数据传输速率可能会严重降低。这种信号失真将导致系统无法通过以太网标准符合性测试,并造成与其他网络设备的互操作性变差。设计者通常需要使用信号调节器,如转接驱动器或重定时器来保持信号质量和系统性能。 信号衰减的根本原因 信号衰减的方式因传输介质而异,包括PCB、铜缆或光缆、信号线上的无源元件和连接器。信号在时域
[网络通信]
使用重定时器和转接驱动器保持<font color='red'>以太网</font>信号完整性
10BASE-T1L MAC-PHY如何简化低功耗处理器以太网连接
简介 本文介绍如何利用10BASE-T1L MAC-PHY连接越来越多的低功耗现场设备和边缘设备。此外,本文还将详细说明何时使用MAC-PHY与10BASE-T1L PHY以及这些系统如何满足未来的以太网互联制造和楼宇安装要求。 背景信息 随着越来越多的设备需要接入以太网,流程、工厂和楼宇自动化应用中的单对以太网10BASE-T1L用例(包括以太网APL)不断扩展。随着互联设备增加,更高级别的管理系统可以使用更丰富的数据集,从而使生产效率得以显著提高,同时降低了运营成本和能耗。以太网至现场或边缘的愿景是将所有传感器和执行器连接到一个融合IT/OT网络。实现这一愿景存在系统工程方面的挑战,因为其中一些传感器受功率和空间的
[网络通信]
10BASE-T1L MAC-PHY如何简化低功耗处理器<font color='red'>以太网</font>连接
STM32开发笔记51:STM32F4+DP83848以太网通信指南系列(五)
本章为系列指南的第五章,讲述STM32F407上MAC层以及其DMA的配置。我们在第一章知识储备章节说到,STM32F407会在168MHz主频之外分配一定的时间释放总线数据用来处理DMA,这其中就包含MAC层的DMA,复习一下STM32F4的总线架构图,(图片来自RM0090ST中文STM32F4手册P50): 我们看到,在上图红框标注的的S6阶段,就是MAC层的DMA总线,CPU会在核心逻辑之外,有专门的时间片轮转周期处理这一阶段的DMA,所有的数据读写都是DMA来控制,不需要我们在核心逻辑中编写。 本章的要解决的任务只有一个:能编写一个自己构建的DP83848Init()函数,就像任何类似的UARTInit(),Dela
[单片机]
STM32开发笔记51:STM32F4+DP83848<font color='red'>以太网</font>通信指南系列(五)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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