2024年鸿蒙最全STM32之W5500网络通信_w5500 profinet,2024年最新面试总结范文大全

img
img

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

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在这里插入图片描述


三、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];
}
void IINCHIP\_CSoff(void)
{
  WIZ\_CS(LOW);
}
void IINCHIP\_CSon(void)
{
   WIZ\_CS(HIGH);
}
u8  IINCHIP\_SpiSendData(uint8 dat)
{
   return(SPI2\_SendByte(dat));
}

void IINCHIP\_WRITE( uint32 addrbsb,  uint8 data)
{
   IINCHIP\_ISR\_DISABLE();                        // Interrupt Service Routine Disable
   IINCHIP\_CSoff();                              // CS=0, SPI start
   IINCHIP\_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
   IINCHIP\_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
   IINCHIP\_SpiSendData( (addrbsb & 0x000000F8) + 4);    // Data write command and Write data length 1
   IINCHIP\_SpiSendData(data);                    // Data write (write 1byte data)
   IINCHIP\_CSon();                               // CS=1, SPI end
   IINCHIP\_ISR\_ENABLE();                         // Interrupt Service Routine Enable
}

uint8 IINCHIP\_READ(uint32 addrbsb)
{
   uint8 data = 0;
   IINCHIP\_ISR\_DISABLE();                        // Interrupt Service Routine Disable
   IINCHIP\_CSoff();                              // CS=0, SPI start
   IINCHIP\_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
   IINCHIP\_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
   IINCHIP\_SpiSendData( (addrbsb & 0x000000F8))    ;// Data read command and Read data length 1
   data = IINCHIP\_SpiSendData(0x00);             // Data read (read 1byte data)
   IINCHIP\_CSon();                               // CS=1, SPI end
   IINCHIP\_ISR\_ENABLE();                         // Interrupt Service Routine Enable
   return data;    
}

uint16 wiz\_write\_buf(uint32 addrbsb,uint8\* buf,uint16 len)
{
   uint16 idx = 0;
   if(len == 0) printf("Unexpected2 length 0\r\n");

   IINCHIP\_ISR\_DISABLE();
   IINCHIP\_CSoff();                              // CS=0, SPI start
   IINCHIP\_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
   IINCHIP\_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
   IINCHIP\_SpiSendData( (addrbsb & 0x000000F8) + 4);    // Data write command and Write data length 1
   for(idx = 0; idx < len; idx++)                // Write data in loop
   {
     IINCHIP\_SpiSendData(buf[idx]);
   }
   IINCHIP\_CSon();                               // CS=1, SPI end
   IINCHIP\_ISR\_ENABLE();                         // Interrupt Service Routine Enable 

   return len;  
}

uint16 wiz\_read\_buf(uint32 addrbsb, uint8\* buf,uint16 len)
{
  uint16 idx = 0;
  if(len == 0)
  {
    printf("Unexpected2 length 0\r\n");
  }

  IINCHIP\_ISR\_DISABLE();
  //SPI MODE I/F
  IINCHIP\_CSoff();                                  // CS=0, SPI start
  IINCHIP\_SpiSendData( (addrbsb & 0x00FF0000)>>16);// Address byte 1
  IINCHIP\_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// Address byte 2
  IINCHIP\_SpiSendData( (addrbsb & 0x000000F8));    // Data write command and Write data length 1
  for(idx = 0; idx < len; idx++)                    // Write data in loop
  {
    buf[idx] = IINCHIP\_SpiSendData(0x00);
  }
  IINCHIP\_CSon();                                   // CS=1, SPI end
  IINCHIP\_ISR\_ENABLE();                             // Interrupt Service Routine Enable
  
  return len;
}

http请求

void do\_http(void)
{
  uint8 ch=SOCK_HTTP;
  uint16 len;

  st_http_request \*http_request;
  memset(rx_buf,0x00,MAX_URI_SIZE);
  http_request = (st_http_request\*)rx_buf;		// struct of http request 
  /\* http service start \*/
  switch(getSn\_SR(ch))
  {
    case SOCK_INIT:
      listen(ch);
      break;
    case SOCK_LISTEN:
      break;
    case SOCK_ESTABLISHED:
    //case SOCK\_CLOSE\_WAIT:
      if(getSn\_IR(ch) & Sn_IR_CON)
      {
        setSn\_IR(ch, Sn_IR_CON);
      }
      if ((len = getSn\_RX\_RSR(ch)) > 0)		
      {
        len = recv(ch, (uint8\*)http_request, len); 
        \*(((uint8\*)http_request)+len) = 0;
        proc\_http(ch, (uint8\*)http_request); // request is processed
        disconnect(ch);
      }
      break;
    case SOCK_CLOSE_WAIT:   
      if ((len = getSn\_RX\_RSR(ch)) > 0)
      {
        //printf("close wait: %d\r\n",len);
        len = recv(ch, (uint8\*)http_request, len);       
        \*(((uint8\*)http_request)+len) = 0;
        proc\_http(ch, (uint8\*)http_request); // request is processed
      }
      disconnect(ch);
      break;
    case SOCK_CLOSED:
      socket(ch, Sn_MR_TCP, 80, 0x00);    /\* reinitialize the socket \*/
      break;
    default:
    break;
  }// end of switch
}


void JTXD\_do\_http(void)
{
  uint8 ch=SOCK_HTTP;
  uint16 len;


![img](https://img-blog.csdnimg.cn/img_convert/d899d2c65bf04ff9bbd8ada8120f0fe5.png)
![img](https://img-blog.csdnimg.cn/img_convert/4cb6a7979df823db5054f9968a0b8cbe.png)

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

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

)
{
  uint8 ch=SOCK_HTTP;
  uint16 len;


[外链图片转存中...(img-XgTwlgXl-1715728144259)]
[外链图片转存中...(img-En3usEKB-1715728144260)]

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

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值