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_DHCPtry_cnt = 10;if (!w5500_dhcp_after_init(sn, try_cnt, 500)) {LOG_D("w5500_dhcp_after_init try cnt over:%d", try_cnt);return;}
#endifuint8_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_DNStry_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_NTPtry_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_DHCPstatic 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_DNSstatic 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_NTPstatic 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

测试结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生护眼台灯几瓦最舒适?2023全新五款护眼台灯推荐

每次经过学校&#xff0c;发现戴眼镜的小学生真的不少&#xff0c;通过近几年的儿童以及青少年的近视人数可看出&#xff0c;我国的近视人数中&#xff0c;儿童以及青少年占比53.5%&#xff0c;所以许多家长逐渐重视孩子用眼健康问题&#xff0c;会选择护眼台灯用于孩子写作业和…

第1章 获取数据库中的数据

CoreShop源程序是以数据库优先进行定义的&#xff0c;所以其本身不包含代码优先的定义&#xff0c;但本从更习惯于代码优先&#xff0c;所以为其定义了代码优先的定义。 1 CoreCms.Net.Model.Entities.SysRole using SqlSugar; using System.ComponentModel.DataAnnotations…

【JavaEE初阶】Tomcat安装与使用及初识Servlet

文章目录 1. Tomcat的安装与使用1.1 Tomcat安装1.2 Tomcat的启动1.3 Tomcat部署前端页面 2. Servlet2.1 Servlet是什么2.2 第一个Servlet程序2.3 常见错误 1. Tomcat的安装与使用 1.1 Tomcat安装 在浏览器中搜索Tomcat,打开官方网页.Tomcat官网 点击下载Tomcat8. 点击下载压…

PSP - 使用 MMseqs2 工具快速搜索蛋白质序列数据库 (GMGC)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131934642 MMseq2 是非常强大和高效的生物信息学软件&#xff0c;可以在极短的时间内对大规模的核苷酸和蛋白质序列进行搜索和聚类。主要特点有&a…

fpga_pwm呼吸灯(EP4CE6F17C8)

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化&#xff0c;使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …

c++网络编程:Boost.asio源码剖析

1、前言 Boost库是一个可移植、提供源代码的C库&#xff0c;作为标准库的后备&#xff0c;是C标准化进程的开发引擎之一。Boost库由C标准委员会库工作组成员发起&#xff0c;其中有些内容有望成为下一代C标准库内容。在C社区中影响甚大&#xff0c;是不折不扣的“准”标准库。…

未来行星探索希望:新型多脚机器人-团队版

机器人正在探索一个模拟的外星环境 即使一个机器人失败了&#xff0c;其余的团队成员也可以抵消它的损失。 背景 虽然探测器取得了令人难以置信的发现&#xff0c;但它们的轮子可能会拖慢它们的速度&#xff0c;而不稳定的地形可能会导致损坏。虽然没有东西可以取代“毅力号”…

Vue3输入框(Input)

APIs 参数说明类型默认值必传width输入框宽度string | number‘100%’falseaddonBefore设置前置标签string | slot‘’falseaddonAfter设置后置标签string | slot‘’falseallowClear可以点击清除图标删除内容booleanfalsefalsepassword是否启用密码框booleanfalsefalsedisabl…

两个小封装电机驱动芯片:MLX813XX、A4950

一&#xff0e;MLX813XX MELEXIS的微型电机驱动MLX813XX系列芯片集成MCU、预驱动以及功率模块等能够满足10W以下的电机驱动。 相对于普通分离器件的解决方案&#xff0c;MLX813XX系列电机驱动芯片是一款高集成度的驱动控制芯片&#xff0c;可以满足汽车系统高品质和低成本的要…

Spring Boot实践一

一、Spring Boot简介 Spring Boot是一个基于Spring框架的快速开发应用程序的工具。它提供了一种快速、方便的方式来创建基于Spring的应用程序&#xff0c;而无需繁琐的配置。Spring Boot通过自动配置和约定大于配置的方式&#xff0c;使得开发者可以更加专注于业务逻辑的实现&…

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

目录 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 1.2 鲸鱼优化 1.3 LSTM &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Python代码实现 &#x1f4a5;1 概述 1.1 完备集合经验模态分解原理 早期的 EMD 方法具有较强的自适应性&#xff0c;能够有…

【node.js】03-http模块

目录 一、什么是http模块 二、创建基本的WEB服务器 三、req请求对象 四、res响应对象 五、根据不同的url响应不同的JSON内容 一、什么是http模块 http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法&#xff0c;…

深度学习推理和训练

优化和泛化 深度学习的根本问题是优化和泛化之间的对立。 • 优化&#xff08;optimization&#xff09;是指调节模型以在 训练数据 上得到最佳性能&#xff08;即机器学习中的学习&#xff09;。 • 泛化&#xff08;generalization&#xff09;是指训练好的模型在 前所未…

Java的0xFFFF在赋值、比较时引起的困惑

Java中的0xFFFF是整型&#xff0c;在赋值、比较的时候容易引起混淆&#xff0c;涉及到符号位、数值大小&#xff0c;赋值给什么类型的变量。我今天在编码的时候就遇到了一些困惑。用代码样例的形式记录下来&#xff0c;加深理解&#xff1a; package com.thb;public class Tes…

RT-Thread快速入门-定时器管理

1时钟节拍 任何操作系统都需要提供一个时钟节拍&#xff0c;以供系统处理所有和时间有关的事件&#xff0c;如延时、线程的时间片轮转调度以及定时器超时等。时钟节拍&#xff08;OS Tick&#xff09;是操作系统中最小的时间单位。 时钟节拍是特定的周期性中断&#xff0c;这…

vue预览和下载txt、PDF、execl等在线文件

因为浏览器默认能直接打开TXT、PDF等文件索引默认就是点击链接打开文件。但是浏览器却又不能在线打开execl、world等文件。 现在我们可以统一的实现文件的预览以及下载。 下载文件 downloadfile方法 downloadfile(url,fileName){const newUrl url;const x new XMLHttpRequ…

【vue3】vue3的一般项目结构、成功显示自己的vue3页面

一、vue3的一般项目结构 Vue 3并没有规定特定的项目结构&#xff0c;因此您可以根据项目的需求和个人偏好来组织您的Vue 3项目。以下是一个常见的Vue 3项目结构示例&#xff0c;供参考&#xff1a; your-project/|- public/| |- index.html # 应用程序的入口HTML文件…

智慧井盖监测管理系统解决方案

一、方案概述 近年来&#xff0c;随着城市化的不断发展&#xff0c;城市地下管道设施的一步步完善&#xff0c;井盖作为城市基础设施中必不可少的一部分&#xff0c;其重要性也逐渐凸显。然而&#xff0c;在实际应用中&#xff0c;井盖监测和管理并不容易。如井盖地理位置分散&…

第一百一十四天学习记录:C++提高:类模板案例(黑马教学视频)

类模板案例 main.cpp代码&#xff1a; #include "myarray.hpp"void printIntArray(MyArray <int>& arr) {for (int i 0; i < arr.getSize(); i){cout << arr[i] << " ";}cout << endl; }void test01() {MyArray <int&…

史上最全,接口测试-Fiddler抓包常用功能总结(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Fiddler中常用的功…