现在AI越来越广泛运用,在日常写代码的过程中也经常用到deepseek提问。总体感觉如果是完整的示例工程,AI是实现不了,写一段程序,基本可以或多或少参考
AI回复说明情况:
时钟配置上,基本按AI自己默认的时钟配置,也不会管你硬件晶振多少。
线程创建后一个while循环中只是一直延迟,未做任何通讯逻辑。实际开发中,lwip包默认socket个数上线,rtos动态内存大小,单片机实际内存大小情况,AI这部分基本考虑不进去
代码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);
}