3.1 STM32CubeMx+Clion+LWIP+获取DHCP


前言

因为暂时缺少焊接工具的原因,不能焊接STM32F407的开发板,为了实现LWIP的功能,在某宝买了一块STM32F407ZG最小系统开发板+一个LAN8720A模块。(购买的Lan8720A模块与其他教程有一点点需要注意的地方,那就是器件地址的选择以及模块没有引出RST引脚,内部上拉至了高电平)。

在这里插入图片描述

模块接线:

LAN8720STM32F407VGT6
VCC3.3V
GNDGND
MDIOPA2
MDCPC1
NINTPA1
CRSPA7
RXD0PC4
RXD1PC5
TX_ENPB11或PG11
TXD0PB12或PG13
TXD1PB13或PG14

一、实验目的

使用DHCP功能动态获取IP地址

二、使用步骤

1.创建工程,配置一般必要步骤(例如打开串口,设置为异步通信方式)

在这里插入图片描述

2.开启ETH,Mode选择为RMII,并配置以下选项,其余默认

在这里插入图片描述
尤其需要注意的就是以下器件地址的选择,这里选择为1,若选择错误,lan8720A模块不会正常工作。
在这里插入图片描述

3.打开LWIP,其余配置默认即可

在这里插入图片描述

4.时钟树的配置

在这里插入图片描述

5.生成代码,用Clion打开

在这里插入图片描述

6.在usart.c文件底部输入代码,以及在usart.h文件中引入头文件

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1, (uint8_t *) &ch, 1, 0xFFFF);
    return ch;
}
#include "stdio.h"

截图
在这里插入图片描述
截图
在这里插入图片描述

7.main.c文件中main函数下引入变量

    extern struct netif gnetif;
    struct dhcp *dhcp;

8.main函数while(1)中输入测试代码


        MX_LWIP_Process();      
        dhcp = netif_dhcp_data(&gnetif);
        printf("DHCP IP 地址: %s\r\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
        HAL_Delay(500);

截图
在这里插入图片描述


9.编译下载程序到开发板,DHCP获取成功

在这里插入图片描述

10.实现网线插拔

开启接口状态变化回调函数,开启GPIOG13、GPIOG14输出做LED显示
在这里插入图片描述

11.新建一对.C/.H文件源文件 ,命名为Display_ip_address

.c

#include "Display_ip_address.h"
#include <string.h>
#include "lwip.h"

uint8_t Display_IP_address() {
    uint16_t time_out = 0, response_time = 0;
    extern struct netif gnetif;
    struct dhcp *dhcp;
    while (1) {
        MX_LWIP_Process();
        dhcp = netif_dhcp_data(&gnetif);
        if (strlen(ip4addr_ntoa(&dhcp->offered_ip_addr)) > 7 && strlen(ip4addr_ntoa(&dhcp->offered_sn_mask)) > 7 &&
            strlen(ip4addr_ntoa(&dhcp->offered_gw_addr)) > 0) {
            printf("DHCP IP 地址获取成功\r\n");
            printf("DHCP IP地址: %s\r\n", ip4addr_ntoa(&dhcp->offered_ip_addr));
            printf("DHCP 子网掩码: %s\r\n", ip4addr_ntoa(&dhcp->offered_sn_mask));
            printf("DHCP 默认网关: %s\r\n", ip4addr_ntoa(&dhcp->offered_gw_addr));
            break;
        } else {
            HAL_Delay(100);
            time_out++;
            response_time++;
            if (response_time == 10) {
                response_time = 0;
                printf("...\r\n");
            }
            if (time_out == 100) {
                printf("DHCP IP 地址未获取\r\n");
            }
            if (time_out == 200) {
                printf("DHCP IP 地址未获取建议检查设备或重启\r\n");
                break;
            }
        }

    }
}

.h

#ifndef F407_LWIP_PING_DISPLAY_IP_ADDRESS_H
#define F407_LWIP_PING_DISPLAY_IP_ADDRESS_H

#include "stm32f4xx_hal.h"
uint8_t Display_IP_address();

#endif

ethernetif.c文件底部有一弱函数__weak void ethernetif_notify_conn_changed(struct netif *netif),在里输入

extern err_t dhcp_start(struct netif *netif);
#include "Display_ip_address.h"
__weak void ethernetif_notify_conn_changed(struct netif *netif) {
    /* NOTE : This is function could be implemented in user file
              when the callback is needed,
    */

    if (netif_is_link_up(netif)) {
        netif_set_up(netif);
        printf("网线插入\r\n");
        dhcp_start(netif);
        Display_IP_address();
    } else
        printf("网线拔出\r\n");
}

lwip.c文件中void MX_LWIP_Process(void){}函数内加入

ethernetif_set_link(&gnetif);

main.c文件中引入头文件

#include "Display_ip_address.h"

main函数中输入

int main(void) {
    /* USER CODE BEGIN 1 */

    /* USER CODE END 1 */

    /* MCU Configuration--------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */

    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_LWIP_Init();
    /* USER CODE BEGIN 2 */
    
    printf("LWIP测试\r\n");
    Display_IP_address();

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1) {
        /* USER CODE END WHILE */

        /* USER CODE BEGIN 3 */
        MX_LWIP_Process();
        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_13);
        HAL_Delay(500);
    }
    /* USER CODE END 3 */
}

结果

在这里插入图片描述

总结

使用LAN8720A模块时,尤其需要注意的就是器件地址的选择
资源下载

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32是一款32位的微控制器,而ESP-IDF是官方提供的用于开发ESP32的软件开发框架。Clion是一款集成开发环境(IDE),可以用于开发和调试ESP32项目。 在使用Clion进行ESP32开发之前,需要先搭建好ESP-IDF和Clion的开发环境。以下是搭建ESP32+Clion开发环境的步骤: 1. 安装ESP-IDF:根据官方文档的指引,下载并安装ESP-IDF。确保安装的是与你的ESP32兼容的版本。 2. 安装Clion:下载并安装Clion,确保安装的是最新版本。 3. 配置ESP-IDF路径:打开Clion,进入File -> Settings -> Build, Execution, Deployment -> CMake,将ESP-IDF的路径添加到"CMake Options"中。例如,如果ESP-IDF安装在`/path/to/esp-idf`,则添加以下内容: ``` -DCMAKE_TOOLCHAIN_FILE=/path/to/esp-idf/tools/cmake/toolchain-esp32.cmake ``` 4. 创建ESP32项目:在Clion中创建一个新的CMake项目,并将ESP-IDF的示例项目导入到Clion中。可以通过以下命令将示例项目复制到你的项目目录中: ``` cp -r /path/to/esp-idf/examples/get-started/hello_world /path/to/your/project ``` 5. 配置CMakeLists.txt:打开项目中的CMakeLists.txt文件,并根据你的项目需求进行配置。确保设置了正确的目标硬件和端口。 6. 构建和烧录:在Clion中点击Build按钮,Clion将自动构建项目并生成可执行文件。然后,使用ESP-IDF提供的烧录工具将可执行文件烧录到ESP32上。 7. 调试:在Clion中配置调试器,可以使用GDB进行调试。在调试过程中,可以设置断点、查看变量的值等。 请注意,以上步骤仅为搭建ESP32+Clion开发环境的基本步骤,具体的配置和操作可能会因个人需求和环境而有所不同。建议参考ESP-IDF和Clion的官方文档以获取更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值