STM32移植lwip之官方工程修改

更新时间:2023-06-20 08:53:47 阅读: 评论:0

STM32移植lwip之官⽅⼯程修改
本篇⽬标:在之前的硬件基础上,修改ST官⽅移植lwip的⼯程,使PC机能ping通stm32
材料准备:
double date
硬件基础:stm32f407+lan9303
官⽅资料:包含代码和移植⼿册()
修改代码:包含移植后的代码()
跟着⽂件路径打开其中⼀个⼯程,先选择不带操作系统的练习测试
⽂件路径:STM32F4x7_ETH_LwIP_V1.1.1 -> Project -> Standalone -> tcp_echo_rver -> MDK-ARM -> Project.uvproj
先编译⼀下,出现3个Warning,其中两个是变量定义未使⽤,不影响暂且不管,还有⼀个是ethernetif.c⽂件最后没有空⽩⾏,⼿动添加⼀⾏,再次编译~
消除所有错误警告~成功开始的第⼀步~
从main函数开始理解并修改(英⽂为官⽅注释,中⽂为修改注释):
int main(void)
{
/*!< At this stage the microcontroller clock tting is already configured to
webphone168 MHz, this is done through SystemInit() function which is called from
startup file (startup_stm32f4xx.s) before to branch to application main.
To reconfigure the default tting of SystemInit() function, refer to
system_stm32f4xx.c file
*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
#ifdef SERIAL_DEBUG
DebugComPort_Init();
#endif
/*Initialize LCD and Leds */
//LCD_LED_Init();    //硬件没有LCD,也暂时不⽤LED,将函数注释掉
/* configure ethernet (GPIOs, clocks, MAC, DMA) */
ETH_BSP_Config();    //MAC-PHY配置函数,主要理解修改函数
/* Initilaize the LwIP stack */
LwIP_Init();    //lwip初始化函数
/* tcp echo rver Init */
//tcp_echorver_init();    //tcp服务器建⽴函数,暂时只建⽴ping⼯程,将函数注释掉
/* Infinite loop */
while (1)
{
/* check if any packet received */
if (ETH_CheckFrameReceived())
{
/* process received ethernet packet*/
LwIP_Pkt_Handle();
}
/* handle periodic timers for LwIP*/
LwIP_Periodic_Handle(LocalTime);
}
}
main函数中有两个修改:
1. 注释 LCD_LED_Init() 函数,暂时⽤不到
2. 注释 tcp_echorver_init() 函数,暂时⽤不到
其次进⼊主要配置函数 ETH_BSP_Config() :
这个函数中修改的内容只有⼀个,找到 DP83848_PHY_ADDRESS 的宏定义(在 stm32f4x7_eth_bsp.h 的第52⾏),修改原先的 0x01 为 0x00 地址,那么这个地址是怎么来的,等到代码解析的时候再做解剖
函数中重点关注 ETH_GPIO_Config() 函数和 ETH_MACDMA_Config() ,这两个函数分别是配置RMII接⼝相关GPIO⼝的复⽤,配置MAC控制器和使能DMA
接着看 ETH_GPIO_Config() 函数:
由于官⽅移植lwip⽤的是MII接⼝,⽽之前搭建的硬件接⼝是RMII,所以需要修改相关宏定义和 GPIO⼝的复⽤
void ETH_GPIO_Config(void)
消极什么意思{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOs clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|
RCC_AHB1Periph_GPIOB|
RCC_AHB1Periph_GPIOC,
ENABLE);    //我们只⽤到了A,B,C三种引脚,所以修改成只使能A,B,C三个的时钟
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); //使能SYSCFG外设时钟
/* Configure MCO (PA8) */
/
/配置PA8(做为MCO功能)输出时钟信号
GPIO_InitStructure.GPIO_P in = GPIO_P in_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* MII/RMII Media interface lection --------------------------------------*/
#ifdef MII_MODE
#ifdef PHY_CLOCK_MCO
RCC_MCO1Config(RCC_MCO1Source_HSE, RCC_MCO1Div_1); //在PA8引脚上输出25MHZ的时钟信号
#endif /* PHY_CLOCK_MCO */
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_MII);  //与PHY芯⽚通讯选择MII模式
#elif defined RMII_MODE  //这⾥要修改宏定义,注释MII_MODE,取消注释RMII_MODE,选择RMII接⼝模式与PHY芯⽚进⾏通讯
RCC_MCO1Config(RCC_MCO1Source_PLLCLK,RCC_MCO1Div_2); //添加时钟函数,在PA8引脚上输出50MHZ时钟信号
SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); //与PHY芯⽚通讯选择RMII模式
#endif
/* Ethernet pins configuration ************************************************/
/*
ETH_MDIO -------------------------> PA2
minorityETH_MDC --------------------------> PC1
ETH_RMII_REF_CLK------------------> PA1
ETH_RMII_CRS_DV ------------------> PA7
ETH_RMII_CRS_DV ------------------> PA7
ETH_RMII_RXD0 --------------------> PC4
ETH_RMII_RXD1 --------------------> PC5
ETH_RMII_TX_EN -------------------> PB11
ETH_RMII_TXD0 --------------------> PB12
ETH_RMII_TXD1 --------------------> PB13
*/
//修改下⾯所有对GPIO的初始化为对应RMII接⼝GPIO的初始化,⽽RMII所⽤到的引脚在上⾯的列表中,共9个引脚
/* Configure PA1, PA2 and PA7 */
GPIO_InitStructure.GPIO_P in = GPIO_P in_1 | GPIO_P in_2 | GPIO_P in_7;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_P in AFConfig(GPIOA, GPIO_P in Source1, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOA, GPIO_P in Source2, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOA, GPIO_P in Source7, GPIO_AF_ETH);
/* Configure PB11,PB12 and PB13 */
英语教师课堂用语GPIO_InitStructure.GPIO_P in = GPIO_P in_11 | GPIO_P in_12 | GPIO_P in_13;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_P in AFConfig(GPIOB, GPIO_P in Source11, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOB, GPIO_P in Source12, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOB, GPIO_P in Source13, GPIO_AF_ETH);
/* Configure PC1, PC4 and PC5 */
GPIO_InitStructure.GPIO_P in = GPIO_P in_1 | GPIO_P in_4 | GPIO_P in_5;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_P in AFConfig(GPIOC, GPIO_P in Source1, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOC, GPIO_P in Source4, GPIO_AF_ETH);
GPIO_P in AFConfig(GPIOC, GPIO_P in Source5, GPIO_AF_ETH);
}
总结修改之前,先做⼀下RMII接⼝相关引脚的功课:
ETH_MDIO ————————> PA2
ETH_MDC ————————–> PC1
ETH_RMII_REF_CLK—————> PA1
ETH_RMII_CRS_DV —————> PA7
ETH_RMII_RXD0 ——————> PC4
ETH_RMII_RXD1 ——————> PC5
ETH_RMII_TX_EN —————–> PB11
ETH_RMII_TXD0 ——————> PB12
ETH_RMII_TXD1 ——————> PB13
修改总结:
1. 修改GPIO时钟使能函数 RCC_AHB1PeriphClockCmd() ,因为只⽤到了ABC三个引脚,所以修改成只对A,B,C三个引脚进⾏时钟使
2011年湖北高考分数线
2. 修改宏定义,因为⽤的是RMII接⼝,所以要注释掉MII_MODE的宏定义,取消注释RMII_MODE的宏定义,这两个宏定义在main.h⽂
件的79⾏和87⾏
3. 添加配置PHY时钟函数 RCC_MCO1Config() ,添加在 #elif defined RMII_MODE 的下⾯即可
4. 修改GPIO⼝初始化成RMII接⼝的GPIO,这⾥包括了对GPIOA,GPIOB,GPIOC的初始化以及将三个GPIO⼝的复⽤成RMII接⼝所⽤
接下来要来看 ETH_MACDMA_Config() 函数中的最后⼀个函数 ETH_Init() ,这个函数包含了所有MAC控制器相关初始化的配置,所以定位到这个函数
stm32f4xf_eth.c第416⾏开始:
/* Ret Timeout counter */
timeout = 0;
/* Read the result of the auto-negotiation */
/
/    RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR);
/* Configure the MAC with the Duplex Mode fixed by the auto-negotiation process */
//    if((RegValue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)
//    {
/* Set Ethernet duplex mode to Full-duplex following the auto-negotiation */
//注释掉其他所有内容,只留下下⾯两个函数:配置为全双⼯
ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex;
//    }
//    el
//    {
/* Set Ethernet duplex mode to Half-duplex following the auto-negotiation */
/
/      ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex;
//    }
/* Configure the MAC with the speed fixed by the auto-negotiation process */
//    if(RegValue & PHY_SPEED_STATUS)
//    {
/* Set Ethernet speed to 10M following the auto-negotiation */
//      ETH_InitStruct->ETH_Speed = ETH_Speed_10M;
//    }
//    elsoon
//    {
/* Set Ethernet speed to 100M following the auto-negotiation */
/
/注释掉其他所有内容,只留下下⾯两个函数:配置为100M以太⽹
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
//    }
修改内容:
1. 注释掉 stm32f4xf_eth.c 第416-441⾏的其他内容,只留下 ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; 和
ETH_InitStruct->ETH_Speed = ETH_Speed_100M;
freezer⾄此为⽌,代码修改结束,编译下载到板⼦上
如果想要修改ip地址,可以找到main.h⾥⾯的宏定义:
/*Static IP ADDRESS: IP_ADDR0.IP_ADDR1.IP_ADDR2.IP_ADDR3 */
france是什么意思#define IP_ADDR0  192
softrock#define IP_ADDR1  168
#define IP_ADDR2  0
#define IP_ADDR3  10
修改成⾃⼰想要的IP地址便可以了,接下来⽤pc机来ping⼀下
ping之前,要确定两件事:
1. ⾸先确定pc机连⼊的⽹络ip地址和stm32的ip地址是不是同⼀个⽹段:
这⾥192.168.0.1和192.168.0.10就处于同⼀个⽹段
2. 其次如果是将stm32⽤⽹线接⼊路由器,则要确定stm32所使⽤的ip地址没有被占⽤,检测⽅法就是接⼊stm32前,先ping设定的地
址,看能不能ping通,不能ping通表⽰没有被占⽤;这⾥是直接⽤⽹线连接stm32和pc机,所以不⽤担⼼这个问题
接下来可以⽤pc机ping下载好程序的stm32
win+R打开运⾏,输⼊cmd,回车
在命令⾏下输⼊ping 192.168.0.10
ping通成功,有图有真相
总结:
官⽅移植程序帮忙做了很多事情,可以⽅便使⽤,那么修改也不外乎这么⼏个地⽅,多多测试注意就可以成功,当能ping通,搭建好硬件软件环境之后就可以安⼼地⼀步步调⽤lwip的API接⼝函数建⽴服务器,客户端等等了。

本文发布于:2023-06-20 08:53:47,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/151308.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:修改   函数   时钟   代码   配置   确定   硬件   注释
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图