现在AI越来越广泛运用,在日常写代码的过程中也经常用到deepseek提问。总体感觉如果是完整的示例工程,AI是实现不了,写一段程序,基本可以或多或少参考

image.png

AI回复说明情况:

image.png

时钟配置上,基本按AI自己默认的时钟配置,也不会管你硬件晶振多少。

image.png

线程创建后一个while循环中只是一直延迟,未做任何通讯逻辑。实际开发中,lwip包默认socket个数上线,rtos动态内存大小,单片机实际内存大小情况,AI这部分基本考虑不进去

image.png

代码copy如下:

#include "FreeRTOS.h"

#include "task.h"

#include "lwip/tcp.h"

#include "lwip/init.h"

#include "lwip/netif.h"

#include "stm32h7xx_hal.h"


/* 网络接口配置 */

#define MAC_ADDR {0x00, 0x08, 0xDC, 0x01, 0x02, 0x03}

#define IP_ADDR    {192, 168, 1, 100}

#define NETMASK    {255, 255, 255, 0}

#define GATEWAY    {192, 168, 1, 1}


/* TCP服务器配置 */

#define SERVER_PORT_START 10000

#define SERVER_TASK_STACK_SIZE 1024

#define SERVER_TASK_PRIORITY 5


/* 客户端连接处理结构体 */

typedef struct {

    int port;

    struct tcp_pcb *pcb;

} tcp_server_context_t;


/* 数据接收回调函数 */

err_t data_recv_callback(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) {

    if (err == ERR_OK && p != NULL) {

        tcp_write(pcb, p->payload, p->len, TCP_WRITE_FLAG_COPY);

        pbuf_free(p);

    }

    return ERR_OK;

}


/* 连接回调函数 */

err_t connect_callback(void *arg, struct tcp_pcb *pcb, err_t err) {

    tcp_recv(pcb, data_recv_callback);

    return ERR_OK;

}


/* TCP服务器任务函数 */

void tcp_server_task(void *pvParameters) {

    tcp_server_context_t *context = (tcp_server_context_t *)pvParameters;

    struct tcp_pcb *pcb = tcp_new();


    if (pcb != NULL) {

        tcp_bind(pcb, IP_ADDR_ANY, context->port);

        pcb = tcp_listen(pcb);

        tcp_accept(pcb, connect_callback);


        while (1) {

            vTaskDelay(pdMS_TO_TICKS(100));

        }


        tcp_close(pcb);

        mem_free(context);

    }


    vTaskDelete(NULL);

}


/* 网络接口初始化 */

static void netif_init(void) {

    struct netif *netif = netif_add(&netif, &IP_ADDR, &NETMASK, &GATEWAY, NULL, NULL, NULL);

    netif_set_default(netif);

    netif_set_up(netif);

}


int main(void) {

    HAL_Init();

    SystemClock_Config();


    /* 初始化LWIP */

    lwip_init();

    netif_init();


    /* 创建10路TCP服务器任务 */

    for (int i = 0; i < 10; i++) {

        tcp_server_context_t *context = (tcp_server_context_t *)mem_malloc(sizeof(tcp_server_context_t));

        if (context != NULL) {

            context->port = SERVER_PORT_START + i;

            xTaskCreate(tcp_server_task, "TCPServer", SERVER_TASK_STACK_SIZE, context, SERVER_TASK_PRIORITY, NULL);

        }

    }


    /* 启动RTOS调度 */

    vTaskStartScheduler();


    while (1);

    return 0;

}


/* 系统时钟配置(需根据实际硬件调整) */

void SystemClock_Config(void) {

    RCC_OscInitTypeDef RCC_OscInitStruct = {0};

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};


    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

    RCC_OscInitStruct.HSEState = RCC_HSE_ON;

    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

    RCC_OscInitStruct.PLL.PLLM = 16;

    RCC_OscInitStruct.PLL.PLLN = 400;

    RCC_OscInitStruct.PLL.PLLP = 2;

    RCC_OscInitStruct.PLL.PLLQ = 8;

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {

        Error_Handler();

    }


    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;

    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {

        Error_Handler();

    }

}


void Error_Handler(void) {

    while(1);

}