欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

程序员文章站 2022-07-08 18:08:29
资源环境STM32F427–dp83848—STM32cubeMX–freeRTOS–LWIP具体步骤一STM32系统配置二内外时钟配置开启外部高速和低速时钟三ETH设置配置ETH,由于我的板子是DP83848芯片使能一下我把PB12,13映射到了PG13,14,这是由于开发板决定的你要根据自己看看原理图四FREERTOS设置直接启动就行无需配置五LWIP设置配置一下IPV4需要和自己本地IP的配置相对应六系统时钟配置我这里的外部高速是25M,低速时32.768...

资源环境STM32F427–dp83848—STM32cubeMX–freeRTOS–LWIP
具体步骤

一STM32系统配置

STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

二内外时钟配置

开启外部高速和低速时钟
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

三ETH设置

STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验
配置ETH,由于我的板子是DP83848芯片
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

使能一下
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验
我把PB12,13映射到了PG13,14,这是由于开发板决定的你要根据自己看看原理图
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

四FREERTOS设置

直接启动就行无需配置
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

五LWIP设置

配置一下IPV4需要和自己本地IP的配置相对应
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

六系统时钟配置

我这里的外部高速是25M,低速时32.768KHz
STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

七加入socketshever.c文件

代码如下:

#include <lwip/sockets.h>
#include <lwip/err.h>
#include <lwip/sys.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "gpio.h"
//#include "usart.h"
#define    SERVER_PORT            40080

uint8_t counter[100];
char socket_server_recbuff[300];        
char socket_server_sendbuff[300];
char tcp_server_recvbuf[300];					//定义数据处理Buff大小为300(为100也无所谓,只要大于等于100就好)

static void socket_server_thread(void *p_arg)
{
    struct sockaddr_in server_addr;                 //服务器地址
    struct sockaddr_in connect_addr;               //连接地址
    int socket;                    /* 定义 套接字*/
    int socket_connect;            /* 请求套接字 */
    socklen_t addr_len;                          //地址长度
    int err;
    int length;
    int count;
    
    
    socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//建立一个新的socket连接

    memset(&server_addr, 0, sizeof(server_addr));//将服务器地址清空
    server_addr.sin_family = AF_INET;             //地址家族
    server_addr.sin_addr.s_addr =htonl(INADDR_ANY);//注意转化为网络字节序
    server_addr.sin_port = htons(SERVER_PORT);      //使用SERVER_PORT指定为程序头设定的端口号
    
    err = bind(socket, (struct sockaddr *)&server_addr, sizeof(server_addr));//建立绑定
    if (err < 0) //如果绑定失败则关闭套接字
    {
            closesocket(socket); //关闭套接字
    }

    err = listen(socket, 1);//监听连接请求
    if (err < 0) 
    {
            closesocket(socket); //close the socket//如果监听失败则关闭套接字
    }
    addr_len = sizeof(struct sockaddr_in);
    
        socket_connect = accept(socket, (struct sockaddr *)&connect_addr, &addr_len);//对监听到的请求进行连接,状态赋值给sock_conn
    
        if(socket_connect<0)   //状态小于0代表连接故障,此时关闭套接字
        {
            closesocket(socket);
        }
        else send(socket_connect, "success to connect!\n\r", 20, 0);
    
    while (1) 
    {
        memset(counter, 0, sizeof(counter));
        
        length = recv(socket_connect, (unsigned int *)counter, 100, 0);//将接收数据放到counter中
        
        for(count=0;count<100;count++)//数据处理
        {
            //socket_server_recbuff[count]=counter[count];
            send(length, "success to accpet the data!\n\r", 20, 0);
            //send(socket_connect,(uint8_t *)&counter,sizeof(counter), 1);
          tcp_server_recvbuf[count]=counter[count];  
        } 
        
        
        
        if(tcp_server_recvbuf[0]=='L'&tcp_server_recvbuf[1]=='E'&tcp_server_recvbuf[2]=='D'&
	  tcp_server_recvbuf[3]=='1'&tcp_server_recvbuf[4]=='O'&tcp_server_recvbuf[5]=='N')
                                                         //判断收到的数据是否为LED1ON
		{
			HAL_GPIO_WritePin(GPIOG,  GPIO_PIN_5, GPIO_PIN_RESET);		//打开LED1黄灯


            
            
			send(socket_connect, "LED1已打开\n",strlen("LED1已打开\n"), 1);	//回复客户端LED1已打开


                 }
}
}
void socket_server_init(void)//TCP服务器、SOCKET初始化
{   
  //HAL_GPIO_WritePin(GPIOG, GPIO_PIN_5, GPIO_PIN_RESET);//灯亮
    sys_thread_new("socket_server_thread",  socket_server_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO - 1);
}

参考:基于STM32CUBE的LWIP+FREERTOS+Socket构成的TCP服务器

八配置GPIO.c文件

根据自己配置

void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();
  __HAL_RCC_GPIOG_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_4, GPIO_PIN_RESET);//初始化LED1
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_5, GPIO_PIN_SET);//初始化LED0
  /*Configure GPIO pin : PG12 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_5|GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

}

九配置FREERTOS.C文件

在任务函数中加入 socket_server_init();

void StartDefaultTask(void const * argument)
{
  /* init code for LWIP */
  MX_LWIP_Init();
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  for(;;)
  {
    socket_server_init();
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

十配置main.c

main函数中的ETHPHY_RST();复位网口

void ETHPHY_RST(void)
{

  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_Delay(50);
  HAL_GPIO_WritePin(GPIOG, GPIO_PIN_12, GPIO_PIN_SET);
  HAL_Delay(10);
}


int main(void)
{
 
  HAL_Init();

 
  SystemClock_Config();

 
  MX_GPIO_Init();
 
  ETHPHY_RST();

  
  MX_FREERTOS_Init(); 
  
  osKernelStart();
 
  
  while (1)
  {
    
  }
  
}

演示图

STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验

汉子出现乱码不用怕,以后尽量别用汉字就行

实验例程

本文地址:https://blog.csdn.net/qq_43497365/article/details/109007615