Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Network
也说STM32F207+DP83848+RT-T2.1.0实现网线拔插重连
发布于 2018-11-16 11:41:27 浏览:2953
订阅该版
之前用了RTT1.0.0到实际产品,中途荒废了一段时间,最近公司产品更新换代使用RTT2.1.0。 这个算是个小小问题的总结贴: **STM32F207+DP83848+RT-THREAD2.1.0实现网线拔插重连效果** 1、首先感谢CSDN网友bobbat的文章, [https://blog.csdn.net/bobbat/article/details/42876151?locationNum=2](https://blog.csdn.net/bobbat/article/details/42876151?locationNum=2) STM32F207+DP83848+RT-THREAD实现网线拔插重连试验 - 留马人 - CSDN博客.html 2、3-1.具体修改地方: 3-1-1.针对stm32f2x7_eth_conf.h文件需要添加如下代码:[D: t-thread-2.1.0\bsp\stm32f20x-201811151731\Libraries\STM32F2x7_ETH_Driver\inc\stm32f2x7_eth_conf.h]; //add by Rn 20181114 #define PHY_MICR_INT_EN ((uint16_t)0x0002) /*!< PHY Enable interrupts */ #define PHY_MICR_INT_OE ((uint16_t)0x0001) /*!< PHY Enable output interrupt events */ #define PHY_MISR_LINK_INT_EN ((uint16_t)0x0020) /*!< Enable Interrupt on change of link status */ #define PHY_LINK_INTERRUPT ((uint16_t)0x2000) /*!< PHY link status interrupt mask */ #define PHY_LINK_STATUS ((uint16_t)0x0020) /*!Eth_Link_PHYITConfig():Set_OK.
"); }else { rt_kprintf("
Eth_Link_PHYITConfig():Error!!!.
"); } /* Configure the EXTI for Ethernet link status. */ rt_kprintf("Configure the EXTI for Ethernet link status.
"); Eth_Link_EXTIConfig(); //-------------------- 3-1-3.针对stm32f2_eth.c文件需要添加如下代码: //add by Rn 20181114 /************************************************************ **配置DP83848芯片当网线状态变化时产生一个变化电平通知MCU。 *************************************************************/ uint32_t Eth_Link_PHYITConfig(uint16_t PHYAddress) { /* PHY registers */ uint32_t tmpreg = 0; tmpreg = ETH_ReadPHYRegister(PHYAddress, 2); tmpreg = ETH_ReadPHYRegister(PHYAddress, 3); /* Read MICR register */ tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_MICR); /* Enable output interrupt events to signal via the INT pin */ tmpreg |= (uint32_t)PHY_MICR_INT_EN | PHY_MICR_INT_OE; if(!(ETH_WritePHYRegister(PHYAddress, PHY_MICR, tmpreg))) { /* Return ERROR in case of write timeout */ return ETH_ERROR; } /* Read MISR register */ tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_MISR); /* Enable Interrupt on change of link status */ tmpreg |= (uint32_t)PHY_MISR_LINK_INT_EN; if(!(ETH_WritePHYRegister(PHYAddress, PHY_MISR, tmpreg))) { /* Return ERROR in case of write timeout */ return ETH_ERROR; } /* Return SUCCESS */ return ETH_SUCCESS; } /*********************************************************** ***配置GPIOA3为下降沿触发中断,通知MCU网线连接状态变化。(先使用的是网页原版写法) ***配置GPIOB7为下降沿触发中断,通知MCU网线连接状态变化。(Power_Box_STM,还未做相应修改) ************************************************************/ #define ETH_LINK_GPIO_PORT GPIOB #define ETH_LINK_GPIO_PIN GPIO_Pin_7 #define ETH_LINK_GPIO_CLK RCC_AHB1Periph_GPIOB #define ETH_LINK_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB #define ETH_LINK_EXTI_PIN_SOURCE EXTI_PinSource7 #define ETH_LINK_EXTI_LINE EXTI_Line7 void Eth_Link_EXTIConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* Enable the INT (PB7) Clock */ RCC_AHB1PeriphClockCmd(ETH_LINK_GPIO_CLK, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//打开要使用的外设时钟 /* Configure INT pin as input */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Pin = ETH_LINK_GPIO_PIN; GPIO_Init(ETH_LINK_GPIO_PORT, &GPIO_InitStructure); /* Connect EXTI Line to INT Pin 完成GPIO和外部中断的映射[配置PB7为中断输入源,需启用SYSCFG时钟] */ SYSCFG_EXTILineConfig(ETH_LINK_EXTI_PORT_SOURCE, ETH_LINK_EXTI_PIN_SOURCE); /* Configure EXTI line */ EXTI_InitStructure.EXTI_Line = ETH_LINK_EXTI_LINE; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable and set the EXTI interrupt to the highest priority;NVIC_PriorityGroup_2:代表有4个抢占优先级,4个响应优先级;即NVIC_IRQChannelPreemptionPriority可以为0~3,NVIC_IRQChannelSubPriority可以赋值为0~3 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } static rt_err_t rt_stm32_eth_init(rt_device_t dev); //初始化MAC和DMA相关参数 void init_dma_mac(void) { rt_device_t stm32_eth_device; ETH_MACDMA_Config(); stm32_eth_device = rt_device_find("e0"); rt_stm32_eth_init(stm32_eth_device); } /********************************************** **当网线连接状态判断是出于连接状态还是拔开状态, **若为连接状态就根据实际情况重新配置MAC和DMA。 **********************************************/ void Eth_Link_ITHandler(uint16_t PHYAddress) { /* Check whether the link interrupt has occurred or not */ if(((ETH_ReadPHYRegister(PHYAddress, PHY_MISR)) & PHY_LINK_STATUS) != 0) { uint16_t status = ETH_ReadPHYRegister(PHYAddress, PHY_BSR); if(status & (PHY_AutoNego_Complete | PHY_Linked_Status)){ init_dma_mac();//初始化MAC和DMA相关参数 rt_kprintf("Net_Link is Connected.
"); }else{ rt_kprintf("Net_Link is Not established,Network break off!!!
"); } } } /************************************************* **MCU外部中断入口函数,当STM32相应管教检测到下降沿 **变化则就会进入此中断函数。 *************************************************/ void EXTI9_5_IRQHandler(void) { //EXTI_GetITStatus检查指定外部中断线的状态是否有效 if(EXTI_GetITStatus(ETH_LINK_EXTI_LINE) != RESET) { Eth_Link_ITHandler(DP83848_PHY_ADDRESS); /* Clear interrupt pending bit */ EXTI_ClearITPendingBit(ETH_LINK_EXTI_LINE); } } //-----------------------------------------end of add by Rn 20181114 3、我的硬件设备情况: DP83848网卡7引脚PWR_DOWN<--->STM32F207芯片PB7; 最方便的方法是: 把附件提到的stm32f2x7_eth_conf.h和stm32f2_eth.c文件覆盖到对应项目录重新编译下即可。 下载附件 [stm32f2_eth.c](https://oss-club.rt-thread.org/uploads/201811/16/114100wt7j5c56jsa7sze6.attach) 下载附件 [stm32f2x7_eth_conf.h](https://oss-club.rt-thread.org/uploads/201811/16/114100z24x9z4vloggpoco.attach)
查看更多
4
个回答
默认排序
按发布时间排序
iwillbeback008
2018-11-16
这家伙很懒,什么也没写!
沙发,自己顶一下。
yqiu
2018-11-16
这家伙很懒,什么也没写!
支持分享。:)
hanlin
2018-11-16
这家伙很懒,什么也没写!
学习学习
whj467467222
认证专家
2018-11-17
开源,分享,交流,共同进步
谢谢楼主分享,获益匪浅
撰写答案
登录
注册新账号
关注者
0
被浏览
3k
关于作者
iwillbeback008
这家伙很懒,什么也没写!
提问
24
回答
147
被采纳
0
关注TA
发私信
相关问题
1
lwip1.4.1连接经常会断开无法连接上,可以ping通
2
LPC1768:RTT+LWIP+webserver用IE刷网页出现硬件中断错误(已经解决)
3
求一些LWIP开发的经验,目前ping一直不稳定。
4
stm32f207+dp83848无法ping通
5
RTT下的LWIP传递机制
6
rtt内lwip的socket是否是线程安全?
7
Lwip+enc28j60无法ping通
8
坑爹的rtconfig.h lwip关掉了checksum
9
花了一个晚上,把RT2.0的LWIP、网卡驱动、文件系统整合起来了,发现一点小问题
10
lwip例程中udp发送时如何指定源端口发送到指定目的地端口
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
在用clangd开发RTT吗,快来试试如何简单获得清晰干净的工作区
2
GD32F450 片内 flash驱动适配
3
STM32H7R7运行CherryUSB
4
RT-Smart首次线下培训,锁定2024 RT-Thread开发者大会!
5
使用RC522软件包驱动FM1722
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
6
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部