网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一、W5500
Niren_W5500
模块是一款基于WIZnet W5500
芯片的以太网模块,是泥人电子继Niren_W5100
模块后设计的一块性能更好、性价比更高的以太网模块。模块集成硬件化TCP/IP
协议:内部32K
字节存储器作TX/RX
修改main.c
代码如下:
修改以太网本地ip地址:
SPI
代码:
void SPI\_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);
/\* 初始化SCK、MISO、MOSI引脚 \*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO\_Init(GPIOA, &GPIO_InitStructure);
GPIO\_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
/\* 初始化CS引脚 \*/
GPIO_InitStructure.GPIO_Pin = W5500_SCS;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO\_Init(W5500_SCS_PORT, &GPIO_InitStructure);
GPIO\_SetBits(W5500_SCS_PORT, W5500_SCS);
/\* 初始化配置STM32 SPI1 \*/
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex; //SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b; //SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //时钟悬空低
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //数据捕获于第1个时钟沿
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //NSS由外部管脚管理
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_2; //波特率预分频值为2
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial=7; //CRC多项式为7
SPI\_Init(SPI1,&SPI_InitStructure); //根据SPI\_InitStruct中指定的参数初始化外设SPI1寄存器
SPI\_Cmd(SPI1,ENABLE); //STM32使能SPI1
}
运行程序后,修改默认ip,然后连接网线,并连接到设定网络,启动服务,测试tcp通信:
二、DHCP
device.c
:
void set\_network(void)
{
uint8 ip[4];
setSHAR(ConfigMsg.mac);/\*配置Mac地址\*/
setSUBR(ConfigMsg.sub);/\*配置子网掩码\*/
setGAR(ConfigMsg.gw);/\*配置默认网关\*/
setSIPR(ConfigMsg.lip);/\*配置Ip地址\*/
//Init. TX & RX Memory size of w5500
sysinit(txsize, rxsize); /\*初始化8个socket\*/
setRTR(2000);/\*设置溢出时间值\*/
setRCR(3);/\*设置最大重新发送次数\*/
getSIPR (ip);
printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
getSUBR(ip);
printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
getGAR(ip);
printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
}
运行结果:
三、modbus
main.c
:
int main(void)
{
unsigned char i;
/\* Initialize STM32F103 \*/
System\_Initialization();//系统配置
SysTick\_Init();//启动系统滴答定时器 SysTick
/\* Config W5500 \*/
W5500\_Configuration();//W5500配置
Delay\_ms(200);//延时等待
/\* Modbus-TCP Init \*/
eMBTCPInit(MB_TCP_PORT_USE_DEFAULT); //端口依赖事件模块初始化
Delay\_ms(200); //延时等待
/\* Enable Modbus-TCP Stack \*/
eMBEnable();//激活协议栈
printf("\r\nModbus-TCP Start!\r\n");
printf("IP:192.168.1.190\r\n");
while(1)
{
i=Read\_SOCK\_1\_Byte(0,Sn_SR); //读W5500状态
if(i==0)
{
do
{
Delay\_ms(100);//延时等待
}while(Socket\_Listen(0)==FALSE);//设置“Socket n”为“TCP服务器模式”
}
else if(i==SOCK_ESTABLISHED) //建立TCP连接
{
eMBPoll();//启动modbus侦听
BSP\_LED();//线圈控制LED灯
}
}
}
w5500参数配置:
/\* W5500 configuration \*/
void W5500\_Configuration()
{
unsigned char array[6];
GPIO\_SetBits(GPIO_W5500_RST_PORT, GPIO_W5500_RST_Pin);//上拉
Delay\_ms(100); /\*delay 100ms 使用systick 1ms时基的延时\*/
//等待以太网链路
while((Read\_1\_Byte(PHYCFGR)&LINK)==0); /\* Waiting for Ethernet Link \*/
Write\_1\_Byte(MR, RST);//写入W5500普通寄存器一个字节
Delay\_ms(20); /\*delay 20ms \*/
/\* Set Gateway IP as: 192.168.1.1 \*/
array[0]=192;
array[1]=168;
array[2]=1;
array[3]=1;
Write\_Bytes(GAR, array, 4);//设置网关IP
/\* Set Subnet Mask as: 255.255.255.0 \*/
array[0]=255;
array[1]=255;
array[2]=255;
array[3]=0;
Write\_Bytes(SUBR, array, 4);//设置子网掩码
/\* Set MAC Address as: 0x48,0x53,0x00,0x57,0x55,0x00 \*/
array[0]=0x48;
array[1]=0x53;
array[2]=0x00;
array[3]=0x57;
array[4]=0x55;
array[5]=0x00;
Write\_Bytes(SHAR, array, 6);//设置MAC地址
/\* Set W5500 IP as: 192.168.1.128 \*/
array[0]=192;
array[1]=168;
array[2]=1;
array[3]=190;
Write\_Bytes(SIPR, array, 4);//设置W5500的IP地址
}
运行结果:
四、实现web服务
void SPI1\_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC\_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1 | RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO\_Init(GPIOA, &GPIO_InitStructure);
GPIO\_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI\_Init(SPI1, &SPI_InitStructure);
SPI\_Cmd(SPI1, ENABLE); //ʹÄÜSPIÍâÉè
}
void SPI1\_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert\_param(IS\_SPI\_BAUDRATE\_PRESCALER(SPI_BaudRatePrescaler));
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SPI_BaudRatePrescaler;
SPI\_Cmd(SPI1,ENABLE);
}
w5500
参数:
#ifdef \_\_DEF\_IINCHIP\_PPP\_\_
#include "md5.h"
#endif
static uint8 I_STATUS[MAX_SOCK_NUM];
static uint16 SSIZE[MAX_SOCK_NUM]; /\*\*< Max Tx buffer size by each channel \*/
static uint16 RSIZE[MAX_SOCK_NUM]; /\*\*< Max Rx buffer size by each channel \*/
uint8 getISR(uint8 s)
{
return I_STATUS[s];
}
void putISR(uint8 s, uint8 val)
{
I_STATUS[s] = val;
}
uint16 getIINCHIP\_RxMAX(uint8 s)
{
return RSIZE[s];
}
uint16 getIINCHIP\_TxMAX(uint8 s)
{
return SSIZE[s];
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/4eaf4122c09b617fae6f029925b65542.png)
![img](https://img-blog.csdnimg.cn/img_convert/99b613a2b27d9a6c6ac5bfbec59d5c1c.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
[](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
[外链图片转存中...(img-KDyDnlNW-1715744030260)]
[外链图片转存中...(img-jS9vh6ix-1715744030260)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**