STM32cubeMX--STM32F427--dp83848---freeRTOS--LWIP点灯实验
程序员文章站
2022-04-02 08:34:09
资源环境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系统配置
二内外时钟配置
开启外部高速和低速时钟
三ETH设置
配置ETH,由于我的板子是DP83848芯片
使能一下
我把PB12,13映射到了PG13,14,这是由于开发板决定的你要根据自己看看原理图
四FREERTOS设置
直接启动就行无需配置
五LWIP设置
配置一下IPV4需要和自己本地IP的配置相对应
六系统时钟配置
我这里的外部高速是25M,低速时32.768KHz
七加入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)
{
}
}
演示图
汉子出现乱码不用怕,以后尽量别用汉字就行
本文地址:https://blog.csdn.net/qq_43497365/article/details/109007615