STM32 + CubeMX + 硬件SPI + W5500 +UDP

  这篇文章记录一下STM32+W5500+UDP的调试过程,实现UDP数据的接收与发送。

目录

  • 一、W5500模块介绍
  • 二、Stm32CubeMx配置
  • 三、Keil代码编写
    • 1、添加W5500驱动代码到工程(添加方法不赘述,驱动代码可以在官网找)
    • 2、在工程中增加代码
      • (1)MyUDP.h
      • (2)MyUDP.c
    • 3、修改CubeMx已生成的代码
      • (1)main.c
  • 四、硬件连接
  • 五、运行效果

一、W5500模块介绍

(后面补上)

二、Stm32CubeMx配置

1、RCC开启外部高速时钟(略)
2、配置STLink调试口(略)
3、配置串口方便调试输出(略)
4、配置工程名、生成路径,之后生成工程(略)
(1-4步的基础配置可以参考前面的文章《STM32基础工程模板创建》)
5、SPI 配置,配置PA4为CS片选引脚
在这里插入图片描述
6、配置PB4为W5500的RST引脚,PB5为INT引脚
在这里插入图片描述

三、Keil代码编写

1、添加W5500驱动代码到工程(添加方法不赘述,驱动代码可以在官网找)

在这里插入图片描述

2、在工程中增加代码

(1)MyUDP.h

#ifndef MYUDP_H
#define MYUDP_H
#include "MyUDP.h"
#include "main.h"
#include "w5500.h"
#include "socket.h"
#include "wizchip_conf.h"
#include "spi.h"
#include <string.h>  // memcmp
#define SOCK_UDPS  2    //定义socket号
extern  uint8_t buff[128];   //定义缓冲区   
extern uint8_t UDP_send_buff[128];   //定义UDP发送缓冲区                                            
extern uint8_t remote_ip[4]; //远程IP地址
extern uint16_t remote_port; //远程端口号void UDPinit(void);
void do_udp(void);
void UDP_send(uint8_t* data,uint8_t len);
void Analysis(uint8_t *buf);
#endif // MYUDP_H

(2)MyUDP.c

#include "MyUDP.h"
#include "main.h"
#include "w5500.h"
#include "socket.h"
#include "wizchip_conf.h"
#include "spi.h"
#include <string.h>  // memcmpuint8_t buff[128];  
uint8_t UDP_send_buff[128]; uint8_t remote_ip[4] = {192, 168, 1, 2}; //远程IP地址
uint16_t remote_port = 5002; //远程端口号//片选
void W5500_Select(void) {HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_RESET);
}
void W5500_Unselect(void) {HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_SET);
}
void W5500_Restart(void) {HAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_RESET);HAL_Delay(1);  // delay 1msHAL_GPIO_WritePin(W5500_RST_GPIO_Port, W5500_RST_Pin, GPIO_PIN_SET);HAL_Delay(1600);  // delay 1600ms
}void W5500_ReadBuff(uint8_t* buff, uint16_t len) {HAL_SPI_Receive(&hspi1, buff, len, HAL_MAX_DELAY);
}void W5500_WriteBuff(uint8_t* buff, uint16_t len) {HAL_SPI_Transmit(&hspi1, buff, len, HAL_MAX_DELAY);
}uint8_t W5500_ReadByte(void) {uint8_t byte;W5500_ReadBuff(&byte, sizeof(byte));return byte;
}void W5500_WriteByte(uint8_t byte) {W5500_WriteBuff(&byte, sizeof(byte));
}//配置W5500网络信息
wiz_NetInfo gSetNetInfo = {.mac  = {0x00, 0x08, 0xdc, 0x11, 0x11, 0x11},.ip   = {192, 168, 1, 10},.sn   = {255, 255, 255, 0},.gw   = {192, 168, 1, 1},.dns  = {144, 144, 144, 144},.dhcp = NETINFO_STATIC};wiz_NetInfo gGetNetInfo;enum Status
{Failed = 0,Success = 1
};/*** @brief valid the result of set net info* @return 1: Success*         0: Failed
*/
uint8_t validSetNetInfoResult(wiz_NetInfo* _set, wiz_NetInfo* _get)
{return (!memcmp(_set, _get, sizeof(wiz_NetInfo)));  // if same, memcmp return 0
}void UDPinit(void)
{reg_wizchip_cs_cbfunc(W5500_Select, W5500_Unselect);reg_wizchip_spi_cbfunc(W5500_ReadByte, W5500_WriteByte);W5500_Restart();  // hardware restart through RESET pinctlnetwork(CN_SET_NETINFO, (void*)&gSetNetInfo);  // set net info// maybe need delayctlnetwork(CN_GET_NETINFO, (void*)&gGetNetInfo);  // get net info// W5500 has 8 channel, 32k buffer, 2 means 2KBytesuint8_t buffer_size_8channel_tx_rx[16] = {2, 2, 2, 2, 2, 2, 2, 2,  // 8 channel tx2, 2, 2, 2, 2, 2, 2, 2}; // 8 channel rxif(ctlwizchip(CW_INIT_WIZCHIP,(void*)buffer_size_8channel_tx_rx)){// failed}uint8_t sta = getSn_SR(SOCK_UDPS);if(sta == SOCK_CLOSED){socket(SOCK_UDPS, Sn_MR_UDP, 5001, 0);}HAL_Delay(100);}void do_udp(void)
{                                                              uint16_t len=0;	switch(getSn_SR(SOCK_UDPS))       /*获取socket的状态*/{case SOCK_CLOSED:                 /*socket处于关闭状态*/socket(SOCK_UDPS,Sn_MR_UDP,5001,0);    /*初始化socket*/break;case SOCK_UDP:      /*socket初始化完成*/HAL_Delay(10);  if(getSn_IR(SOCK_UDPS) & Sn_IR_RECV) //检查是否有接收中断{setSn_IR(SOCK_UDPS, Sn_IR_RECV);  /*清接收中断*/}if((len=getSn_RX_RSR(SOCK_UDPS))>0)  /*接收到数据*/{recvfrom(SOCK_UDPS,buff, len, remote_ip,&remote_port);               /*W5500接收计算机发送来的数据W5500接收计算机发送来的数据,并获取发送方的IP地址和端口号*/sendto(SOCK_UDPS,buff,len-8, remote_ip, remote_port);                /*W5500把接收到的数据发送*/Analysis(buff);//分析数据memset(buff, 0, sizeof(buff));}break;}}void UDP_send(uint8_t* data,uint8_t len)
{sendto(SOCK_UDPS, data, len, remote_ip, remote_port);memset(data, 0, len);
}//分析数据
void Analysis(uint8_t *buf)
{}

3、修改CubeMx已生成的代码

(1)main.c

#include <stdio.h>
#include "MyUDP.h"int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_SPI1_Init();UDPinit();while (1){do_udp();}
}

四、硬件连接

STM32开发板W5500模块
5V5V
GNDGND
PA4SCS
PA6MISO
PA5SCK
PA7MOSI
PB4RST
PB5INT

五、运行效果

(1)、将W5500和电脑通过网线直连
(2)、给电脑配置一个192.168.1.x网段的IP
(3)、ping 192.168.1.10(W5500的IP),能ping通。再使用网络调试助手给192.186.1.10的5001端口发送数据,之后网络调试助手能收到返回的数据。
在这里插入图片描述

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

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

相关文章

2023年SCRM系统排名分析及市场趋势解读

内容概要 当前&#xff0c;SCRM&#xff08;社交客户关系管理&#xff09;系统在企业运营中的重要性日益凸显&#xff0c;尤其是在快速发展的数字经济环境中。2023年的SCRM市场展现出多元化与专业化的趋势&#xff0c;不同企业在客户关系管理方面的需求各有不同&#xff0c;这…

显存占用 显存测试

目录 显存测试 显存占用示例 一个模型多卡占用 显存测试 import torch# 计算张量的大小&#xff08;例如&#xff1a;每个 float 占用 4 字节&#xff09; # 40GB 40 * 1024 * 1024 * 1024 字节 # 每个 float 4 字节&#xff0c;因此需要的 float 数量为 (40 * 1024 * 1024…

StableDiffusion-3.5 文生图模型本地部署尝鲜

文章目录 官方仓库ComfyUI 配置模型文件生成图片&#xff0c;观察日志生成样例 买了新的 4070TiS 显卡之后&#xff0c;终于有了个人的 16GB 显存&#xff0c;再也不用在关键时刻和实验室的其他人抢那两张 3080Ti 12G 了&#xff0c;所以想试试看干净的 Linux 环境下&#xff0…

规范:项目、目录、文件、样式、事件、变量、方法、url参数、注释、git提交 命名规范及考证

一、规范命名的重要性 易懂、通用、规范、标准、专业性、是经验积累的体现 1.1、常见命名方法 序号命名方法解释1全小写2全大写3驼峰&#xff1a;小驼峰命名法4驼峰&#xff1a;大驼峰命名法5烤串命名法 / 脊柱命名法6下划线分隔法 二、项目名 采用小写字母和中划线&#…

Navicat 连接远程腾讯云服务器的MySQL数据库

首先需要开放开放腾讯云安全端口&#xff0c;可以参考这个链接腾讯云服务器入站规则端口开放使用指南(CentOS系统)。 但是注意需要开放的是IPv6&#xff0c;这个可以通过netstat命令查看确认。 然后查看当前用户信息 select user, host from mysql.user一般看到的都是 localh…

第三十四篇:URL和URI的区别,HTTP系列一

前面我们讲到通过TCP协议通信双方建立可靠连接&#xff0c;那么此时双方进行通信&#xff0c;需要用人能理解的形式进行信息组织&#xff0c;也就是为各种特定需求服务&#xff0c;满足日常生活中的各种场景。 比如&#xff1a;网页浏览、电子邮件、远程登录、文件传输、网络管…

什么情况下,不推荐建立索引?

一般有以下几种情况不推荐建立索引&#xff1a; 1&#xff09;对于数据量很小的表 当表的数据量很小&#xff08;如几百条记录&#xff09;时&#xff0c;建立索引并不会显著提高查询性能&#xff0c;反而可能增加管理的复杂性&#xff1b; 2&#xff09;频繁更新的表 对于…

GitHub上传自己的项目

目录 一、安装Git插件 1&#xff09;下载 2&#xff09;安装 二、创建Gothub的创库 三、通过Git上传本地文件到Github 四、其他 1、部分指令 2、如果已经运行过git init并设置了[user]&#xff0c;下次可以直接用 一、安装Git插件 1&#xff09;下载 下载地址&#x…

你需要了解的Android主题相关知识

在 Android 开发中&#xff0c;主题&#xff08;Theme&#xff09;是用于定义应用的视觉风格的一组样式集合。主题决定了应用的配色、字体样式、控件外观等&#xff0c;是整个应用的一致性视觉体验的重要组成部分。以下是对 Android 主题的全面介绍&#xff0c;包括主题的基础概…

寻找符合要求的最长子串

题目描述 给定一个字符串 s s s &#xff0c;找出这样一个子串&#xff1a; 1&#xff09;该子串中的任意一个字符最多出现2次&#xff1b; 2&#xff09;该子串不包含指定某个字符&#xff1b; 请你找出满足该条件的最长子串的长度。 输入描述&#xff1a; 第一行为要求…

【Linux 从基础到进阶】 灾难恢复自动化工具与脚本

灾难恢复自动化工具与脚本 在现代企业中&#xff0c;自动化工具和脚本在灾难恢复&#xff08;Disaster Recovery, DR&#xff09;中扮演着至关重要的角色。它们不仅提高了恢复过程的效率和准确性&#xff0c;还减少了人为错误的风险。本文将介绍一些常用的灾难恢复自动化工具及…

「Mac畅玩鸿蒙与硬件26」UI互动应用篇3 - 倒计时和提醒功能实现

本篇将带领你实现一个倒计时和提醒功能的应用&#xff0c;用户可以设置倒计时时间并开始计时。当倒计时结束时&#xff0c;应用会显示提醒。该项目涉及时间控制、状态管理和用户交互&#xff0c;是学习鸿蒙应用开发的绝佳实践项目。 关键词 UI互动应用倒计时器状态管理用户交互…

重装系统后,把Anaconda从硬盘恢复方法(亲测可用)

1.首先保证安装目录文件完整 2.添加系统环境变量 E:\anaconda E:\anaconda\Scripts E:\anaconda\Library\bin E:\anaconda\Library\mingw-w643然后进入安装目录打开cmd命令窗口&#xff0c;输入一下如下命令 python .\Lib\_nsis.py mkmenus4.如果需要cuda恢复&#xff0c;只…

Linux动态库和静态库

1&#xff0c;手动制作静态库 1&#xff0c;如何形成静态库文件 做库时&#xff0c;头文件(.h)必须暴露&#xff0c;源文件(.c)必须隐藏。 操作&#xff1a;将需要形成库的文件编译成.o文件&#xff1a; 然后用指令&#xff1a;ar -rc libmy_stdio.a my_stdio.o my_string.o…

java基础之 String\StringBuffer\ StringBuilder

文章目录 String字符串的创建为什么说String是不可变的&#xff1f;创建后的字符串存储在哪里&#xff1f;字符串的拼接String类的常用方法 StringBuilder & StringBuffer使用方法验证StringBuffer和StringBuilder的线程安全问题 总结三者区别什么情况下用运算符进行字符串…

【计网不挂科】计算机网络期末考试中常见【选择题&填空题&判断题&简述题】题库(3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏&#xff01;…

告别繁琐统计,一键掌握微信数据

微信数据管理的挑战在数字时代&#xff0c;微信已成为我们日常沟通和商业活动的重要工具。然而&#xff0c;随着微信号数量的增加&#xff0c;手动统计每个账号的数据变得越来越繁琐。从好友数量到会话记录&#xff0c;再到转账和红包&#xff0c;每一项都需要耗费大量的时间和…

Oracle分区技术特性

Oracle 的分区是一种“分而治之”的技术&#xff0c;通过将大表、索引分成可以独立管理的、小的 Segment&#xff0c;从而避免了对每个对象作为一个大的、单独的 Segment 进行管理&#xff0c;为海量数据访问提供了可伸缩的性能。自从 Oracle 引入分区技术以来&#xff0c;Orac…

ArkTS常用数据处理:掌握核心技能与实践

在HarmonyOS应用开发中&#xff0c;ArkTS作为主要的开发语言&#xff0c;其数据处理能力是构建高效应用的关键。本文将详细介绍ArkTS中的常用数据处理方法&#xff0c;包括基本数据类型、数组、枚举、对象和XML解析与生成等&#xff0c;以及它们在实际开发中的应用和最佳实践。…

bert-base-chinese模型使用教程

向量编码和向量相似度展示 import torch from transformers import BertTokenizer, BertModel import numpy as npmodel_name "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences [春眠不觉晓, 大梦谁先觉, 浓睡…