2024年鸿蒙最新STM32之W5500网络通信_w5500 profinet(1),腾讯、网易必问的20道题HarmonyOS鸿蒙面试题

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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)**

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值