基于RTT的ETH应用(一)
实现目的:通过ETH实现互联网访问
1.CubeMX配置相关参数
1.1配置时钟参数
1.2配置ETH
本文采用正点原子F4探索者,故相关配置引脚不能使用cubemx默认,根据原理图进行配置
1.3 Rt thread Studio设置
1.3.1进入board.h查看说明
那就跟着步骤来吧
1.3.2在board.c 加入Cubemx生成的代码
void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(ethHandle->Instance==ETH)
{
__HAL_RCC_ETH_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
}
}
#define RESET_IO GET_PIN(D, 3)
void phy_reset(void)
{
rt_pin_mode(RESET_IO, PIN_MODE_OUTPUT);
rt_pin_write(RESET_IO, PIN_HIGH);
rt_thread_mdelay(50);
rt_pin_write(RESET_IO, PIN_LOW);
rt_thread_mdelay(50);
rt_pin_write(RESET_IO, PIN_HIGH);
}
每走一步记得编译,在这里编译会出现HAL错误,不用担心,继续往下做
1.3.3 Hal_Config配置
在stm32f4xx_hal_conf.h中取消对ETH的注释。 继续编译,出现netif相关的报错,终于要好了
1.3.4 rt thread settings设置
在网络/轻量级TCP/IP堆栈中 开启lwip堆栈的使能
关闭DHCP分配地址,手动设置ipv4地址
再次编译后所有错误已经消失,接下来,继续设置才能保证绿色上网
1.4 测试
在MSH中输入ifconfig成功答应出IP地址
看看能不能ping通百度
1.5 TCP Client测试
虽然这不是我们的最后目标 在rt thread中的文档中copy下tcp客户端的代码
void tcpclient(int argc, char **argv)
{
int ret;
char *recv_data;
struct hostent *host;
int sock, bytes_received;
struct sockaddr_in server_addr;
const char *url;
int port;
if (argc < 3)
{
rt_kprintf("Usage: tcpclient URL PORT\n");
rt_kprintf("Like: tcpclient 192.168.12.44 5000\n");
return ;
}
url = argv[1];
port = strtoul(argv[2], 0, 10);
host = gethostbyname(url);
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
rt_kprintf("Socket error\n");
rt_free(recv_data);
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
rt_kprintf("Connect fail!\n");
closesocket(sock);
return;
}
return;
}
MSH_CMD_EXPORT(tcpclient, dac voltage convert sample);
编译报错的添加如下头文件
#include <sys/socket.h>
#include <netdb.h>
测试结果如下:
也可以找下网络上公开的TCP服务器测试一下
下期我们继续实现MQTT连接,最终完成的项目是一个低功耗的采集节点 求关注
|