Clion开发STM32之W5500系列(综合实验)

这篇具有很好参考价值的文章主要介绍了Clion开发STM32之W5500系列(综合实验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

  1. 此为w5500模块的综合实验测试模块,包含dhcp、dns、ntp
  2. 以上三个模块的驱动参考之前的文章,本篇不做说明.
  3. 使用的开发芯片 stm32f103vet6系列,外设接口使用的spi2

实验内容:

  1. 通过dhcp动态获取ip,
  2. 通过dns解析NTP服务域名的ip
  3. 通过NTP服务ip获取时间

w5500配置驱动

/*******************************************************************************
 *  Copyright (c) [scl]。保留所有权利。
 *     本文仅供个人学习和研究使用,禁止用于商业用途。
 ******************************************************************************/

#include "app_conf.h"
#include "w5500_config.h"


#if APP_CONFIG_W5500
#define  APP_CONFIG_W5500_DHCP      (1) /*W5500 应用层--DHCP*/
#define  APP_CONFIG_W5500_DNS       (1) /*W5500 应用层--DNS*/
#define  APP_CONFIG_W5500_NTP       (1) /*W5500 应用层--NTP*/

#define DBG_ENABLE
#define DBG_SECTION_NAME "w5500"
#define DBG_LEVEL W5500_DBG_LEVEL

#include "sys_dbg.h"
#include "w5500_dhcp.h"
#include "w5500_dns.h"
#include "w5500_ntp.h"

#define W5500_CS stm_port_define(B,12)
#define W5500_RST stm_port_define(C,7)


static SPI_HandleTypeDef *w5500_spi = NULL;

static void send_and_rec_bytes(uint8_t *in_dat, uint8_t *out_data, uint16_t len) {
    while (HAL_SPI_GetState(w5500_spi) != HAL_SPI_STATE_READY);
    HAL_SPI_TransmitReceive(w5500_spi, in_dat, out_data, len, 1000);
    while (HAL_SPI_GetState(w5500_spi) != HAL_SPI_STATE_READY);
}

static void send_only(uint8_t *in_data, uint16_t len) {
    HAL_SPI_Transmit(w5500_spi, in_data, len, 1000);
}

static void W5500_RST_HIGH(void) { stm_pin_high(W5500_RST); }

static void W5500_RST_LOW(void) { stm_pin_low(W5500_RST); }

static void W5500_CS_LOW(void) { stm_pin_low(W5500_CS); }

static void W5500_CS_HIGH(void) { stm_pin_high(W5500_CS); }

static bool w5500_dhcp_after_init(SOCKET s, uint8_t try_cnt, uint32_t wait_ms);

static bool w5500_dns_after_init(SOCKET s, uint8_t *domain, uint8_t try_cnt, uint32_t wait_ms);

static bool w5500_ntp_after_init(SOCKET s, uint8_t try_cnt, uint32_t wait_ms);

static void W5500_Driver_MspInit(void) {
    stm32_pin_mode(W5500_CS, pin_mode_output);  /*CS*/
    stm32_pin_mode(W5500_RST, pin_mode_output); /*RST*/
    stm_pin_low(W5500_RST);
    stm_pin_low(W5500_CS);
    /*初始化SPI外设*/
    /*W5500 支持 SPI 模式 0 及模式 3..MOSI 和 MISO 信号无论是接收或发送,均遵从从最高标志位(MSB)到最低标志位(LSB)的传输序列。*/
    bsp_SpiHandleInit(w5500_spi, SPI_BAUDRATEPRESCALER_2, spi_mode_3);
}

module_w5500_t w5500_conf = {
        .base_conf={
                .socket_num = 4,
                .rx_size={4, 4, 4, 4},
                .tx_size={4, 4, 4, 4},
        },
        .net_conf={
                .ip={192, 168, 199, 12},
                .gw={192, 168, 199, 1},
                .sub={255, 255, 255, 0},
        },
        .driver={
                .cs_high = W5500_CS_HIGH,
                .cs_low = W5500_CS_LOW,
                .rst_high= W5500_RST_HIGH,
                .rst_low=W5500_RST_LOW,
                .delay = HAL_Delay,
                .send_and_rec_bytes = send_and_rec_bytes,
                .send_only =send_only
        },
        .api = {
                .msp_init=W5500_Driver_MspInit,
        }
};
uint8_t ntp_domain[] = {"ntp.ntsc.ac.cn"}; /*ntp域名*/
static struct dns_conf net_dns_cnf = { /*dns服务配置*/
        .dns_server_ip={114, 114, 114, 114},
        .dns_port = 53,
        .delay_ms_cb = HAL_Delay
};
static struct ntp_conf net_ntp_conf = {
//        .ntp_server={114, 118, 7, 163},
        .ntp_port = 123,
        .delay_ms_cb = HAL_Delay
};


static void w5500_pre_init(void) {
    /*一般做数据加载,此时系统时钟使用的是内部时钟,如需要使用系统时钟的外设不在此进行初始化*/
    w5500_spi = conv_spi_handle_ptr(handle_get_by_id(spi2_id));
    /*初始化资源*/
    module_w5500_init(&w5500_conf);
    uint32_t uid0 = HAL_GetUIDw0();
    uint32_t uid1 = HAL_GetUIDw1();
    uint32_t uid2 = HAL_GetUIDw2();
    uint8_t mac[6] = {0, uid0 >> 8, uid1, uid1 >> 8, uid2, uid2 >> 8};
    memcpy(w5500_conf.net_conf.mac, mac, sizeof(mac));
#if APP_CONFIG_W5500_DHCP /*使用dhcp*/
    dhcp_config_registry(&w5500_conf);
    w5500_conf.net_conf_init = dhcp_init;/*使用dhcp init*/
#endif
}

static void w5500_init(void) {

    w5500_conf.api.msp_init();/*初始化*/
    w5500_conf.net_conf_init();

}


static void w5500_after_init(void) {
    uint8_t try_cnt;
    SOCKET sn = 1;/*使用的socket*/
#if APP_CONFIG_W5500_DHCP
    try_cnt = 10;
    if (!w5500_dhcp_after_init(sn, try_cnt, 500)) {
        LOG_D("w5500_dhcp_after_init try cnt over:%d", try_cnt);
        return;
    }
#endif
    uint8_t ip[4];
    w5500_reg_ip_read(ip);
    LOG_D("w5500_reg_ip_read:%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
    w5500_reg_gw_read(ip);
    LOG_D("w5500_reg_gw_read:%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
#if APP_CONFIG_W5500_DNS
    try_cnt = 5;
    dns_config_set(&net_dns_cnf);
    if (!w5500_dns_after_init(sn, ntp_domain, try_cnt, 500)) {
        LOG_D("w5500_dns_after_init try cnt over:%d", try_cnt);
        return;
    }

#endif

#if APP_CONFIG_W5500_NTP
    try_cnt = 5;
    ntp_config_set(&net_ntp_conf);
    if (!w5500_ntp_after_init(sn, try_cnt, 500)) {
        LOG_D("w5500_ntp_after_init try cnt over:%d", try_cnt);
        return;
    }
#endif
}

app_init_export(w5500_net_conf, w5500_pre_init, w5500_init, w5500_after_init);

#if APP_CONFIG_W5500_DHCP

static bool w5500_dhcp_after_init(SOCKET s, uint8_t try_cnt, uint32_t wait_ms) {
    for (uint8_t i = 0; i < try_cnt; ++i) {
        if (do_dhcp(s, wait_ms)) {
            return true;
        }
    }
    return false;
}

#endif
#if APP_CONFIG_W5500_DNS

static bool w5500_dns_after_init(SOCKET s, uint8_t *domain, uint8_t try_cnt, uint32_t wait_ms) {
    for (int i = 0; i < try_cnt; ++i) {
        if (do_dns(s, domain, net_ntp_conf.ntp_server, wait_ms)) {
            LOG_D("dns parse result ip:%d.%d.%d.%d",
                  net_ntp_conf.ntp_server[0], net_ntp_conf.ntp_server[1],
                  net_ntp_conf.ntp_server[2], net_ntp_conf.ntp_server[3]
            );
            return true;
        }
    }
    return false;
}

#endif

#if APP_CONFIG_W5500_NTP

static bool w5500_ntp_after_init(SOCKET s, uint8_t try_cnt, uint32_t wait_ms) {
    struct net_date_time *nt_tm = NULL;
    for (int i = 0; i < try_cnt; ++i) {
        nt_tm = ntp_date_time_get(s, wait_ms);
        if (nt_tm != NULL) {
            LOG_D("NTP TIME:%d-%02d-%02d %02d:%02d:%02d",
                  nt_tm->year, nt_tm->month, nt_tm->day,
                  nt_tm->hour, nt_tm->min, nt_tm->sec
            );
            HAL_TIM_Base_Start_IT(handle_get_by_id(tim6_id));
            return true;
        }
    }
    return false;
}

#endif
#endif





测试结果

Clion开发STM32之W5500系列(综合实验),STM32相关驱动,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-603948.html

到了这里,关于Clion开发STM32之W5500系列(综合实验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Clion开发STM32之ESP8266系列(四)

    上一篇: Clion开发STM32之ESP8266系列(三) 实现esp8266需要实现的函数 串口3中断函数的自定义(这里没有使用HAL提供的) 封装esp8266服务端的代码和测试 核心配置头文件(添加一些宏定义) sys_core_conf.h文件中 源码 对应的串口3中断函数的编写 头文件 源文件 本次设置esp8266模块的IP为

    2024年02月08日
    浏览(48)
  • 【正点原子STM32连载】第六十六章 综合测试实验摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html# 为了方便大家使用和验证综合例程,本章内容是综合例程的使用介绍。目的是展示STM32F1的强大处理

    2024年02月02日
    浏览(60)
  • STM32开发 | Clion搭建STM32开发环境

    做嵌入式开发的人对STM32这个平台应该都是非常熟悉的,在国内尤其流行,很多产品里面都是基于这个平台做的方案。多数人在开发STM32的时候用的都是 Keil 这个老牌IDE,很大一部分原因是因为大多数人最初是从51单片机学习过来的,51就是基于Keil去开发的,然后迁移到STM32的

    2023年04月12日
    浏览(48)
  • STM32+Clion多线程开发

    目录 创建多线程 freertos.c main.cpp main_app.h 二值信号量 相关API介绍 (1) osSemaphoreCreate (2)osSemaphoreDelete (3)osSemaphoreRelease (4)osSemaphoreWait 实际使用 创建信号量(freertos.c) 在头文件中外部引用(freertos_inc.h) main.c 关于clion使用printf,参考【教程】手把手教你用Clion进行STM32开

    2024年03月15日
    浏览(46)
  • 【使用W5500实现UDP、TCP通信】

    一、W5500介绍 W5500是一个集成的以太网模块,这个模块上携带TCP/IP协议,控制器只需要通过SPI协议读写其寄存器便可以以网络的方式进行数据交互。 W5500模块自带10个引脚,但由于使用其官方库,只需使用六个引脚便可以进行数据交互,这六个引脚分别为:VCC、GND、MISO、MOSI、

    2023年04月08日
    浏览(40)
  • STM32CubeMX联合CLion开发环境搭建

    1.1 STM32CubeMX STM32CubeMX是一种图形化配置工具,用于为STM32微控制器生成启动代码和初始化配置。它可以帮助简化STM32项目的初始化过程,并提供了一种可视化的方式来配置引脚、时钟、外设和中断等。HAL(Hardware Abstraction Layer)库是STMicroelectronics提供的一种高级API层,用于编写

    2024年02月11日
    浏览(47)
  • Clion开发STM32之驱动开发(ST7735S篇)

    ST7735S数据手册 字库头文件(module_st7735s_font.h) 头文件(module_st7735s.h) 源文件(module_st7735s.c) 实现对应的驱动接口 测试单元

    2024年02月07日
    浏览(52)
  • cubeMX+CLion开发STM32,添加DSP库

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、使用cubeMX创建工程并添加DSP库 二、修改Cmake配置 总结 前段时间看了改用CLion做STM32的开发,使用cubeMX添加DSP库,生成项目后编译报错undefined reference to `arm_sin_f32\\\',参考了很多文章都是

    2024年02月13日
    浏览(39)
  • 优雅的使用CLion开发STM32 2023最新版本~

    一共需要的资料如下 ✈代表需要魔法 没有标注可直接访问 Clion 下载链接 cubemx 下载链接 mingw 下载连接 ✈ 安装完直接解压到文件夹 并且把bin文件的路径存入path环境变量 gcc 下载链接✈ 安装完直接解压到文件夹 并且把bin文件的路径存入path环境变量 openocd 下载链接 安装完直接

    2024年02月16日
    浏览(48)
  • 从零开始教你使用Clion优雅开发STM32(三)Clion嵌入式开发必备插件

    (一)软件安装与环境配置 (二)移植工程文件到其他芯片 (三)Clion嵌入式开发必备插件 文章目录 前言 1)Chinese(simplified) 2)CodeGlance Pro 3)File Watchers  4)Key Promoter X 5)CodeGlance Pro 6)Monokai Pro Theme 7)Rainbow Brackets Lite 8)Serial Port  Monitor 总结 前段时间,稚晖君用 Cl

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包