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 ); …

spring学习笔记六

一、构造器注入 1.1、BookDao接口和实现类 public interface BookDao {void save(); } public class BookDaoImpl implements BookDao {private int connectionNum;private String databaseName;public BookDaoImpl(int connectionNum, String databaseName) {this.connectio…

【Spring MVC】小文件下载的多种方法

文章目录 HTTP Header 之 Content-Disposition文件下载代码Servlet 实现方式 1Servlet 实现方式 2Spring 实现方式 1 Content-Disposition 指定 inline Win、JDK 17、 Spring Boot 3.1.2 HTTP Header 之 Content-Disposition 以下内容来自 mdn web docs 在常规的 HTTP 应答中&…

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…

tomcat调优2-具体实现

您好,可以通过修改Tomcat的配置文件来实现上述的Tomcat调优措施。 更改JVM内存配置 在Catalina服务的启动脚本catalina.sh中找到JAVA_OPTS变量,增加Java堆空间参数: JAVA_OPTS“-Xms512m -Xmx4096m” 调整线程池参数 在server.xml中的Connector标签中添加executor属性: &…

两个小封装电机驱动芯片: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;…

Etcd 节点为啥不能设置偶数

在etcd集群中&#xff0c;最好不要设置偶数数量的节点。这是因为etcd使用Raft一致性算法来确保数据的一致性和高可用性。Raft算法要求在进行Leader选举和数据复制时&#xff0c;节点数必须是奇数个&#xff0c;以保证算法的正确性和容错性。 主要原因如下&#xff1a; Leader选…

深度学习推理和训练

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

软考高级科目怎么选?这份秘籍请收好!

2023年软考下半年报名即将开启&#xff0c;软考高级含金量比较高&#xff0c;每年很多人报名&#xff0c;要考软考高级&#xff0c;选哪个科目比较好是每年大家关心的&#xff0c;2023年软考高级选哪个科目还得结合自身所学和工作所需去选择。看工作岗位的需求&#xff0c;工作…

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

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

在Springboot集成Activiti工作流引擎-任务分配 三种模式【基础讲解】

任务分配 三种模式 1. 固定分配 指定人去做 2. UEL表达式分配 activiti使用uel表达式&#xff0c;UEL是java EE6规范的一部分&#xff0c;UEL即统一表达式语言 activiti支持两个UEL表达式&#xff1a;UEL-value 和 UEL-method UEL-value 写法 ${变量} ${assignee1} 测试 //…