0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RT-Thread在Lan8720a和 lwip基础上移植ntp流程

冬至子 来源:YZRD 作者:YZRD 2023-10-12 16:59 次阅读

开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以RT-Thread中Lan8720和lwip协议栈的使用文章创建的工程为基础。

新建ntptest.c测试文件,移植以上参考的ntp代码,整理后如下:

#include
#include
#define SERVER_IP "114.67.237.130"
#define SERVER_PORT 123
#define TIMEOUT 10
//宏定义
#define NTP_TIMESTAMP_DELTA 2208988800ull //number of seconds between 1900 and 1970,1900-1970的时间差
#define SEC_TIME_ZONE + (86060) //Beijing,GMT+8, 时区差
typedef struct
{
uint8_t li_vn_mode; // Eight bits. li, vn, and mode.
// li. Two bits. Leap indicator.
// vn. Three bits. Version number of the protocol.
// mode. Three bits. Client will pick mode 3 for client.
uint8_t stratum; // Eight bits. Stratum level of the local clock.
uint8_t poll; // Eight bits. Maximum interval between successive messages.
uint8_t precision; // Eight bits. Precision of the local clock.
uint32_t rootDelay; // 32 bits. Total round trip delay time.
uint32_t rootDispersion; // 32 bits. Max error aloud from primary clock source.
uint32_t refId; // 32 bits. Reference clock identifier.
uint32_t refTm_s; // 32 bits. Reference time-stamp seconds.
uint32_t refTm_f; // 32 bits. Reference time-stamp fraction of a second.
uint32_t origTm_s; // 32 bits. Originate time-stamp seconds.
uint32_t origTm_f; // 32 bits. Originate time-stamp fraction of a second.
uint32_t rxTm_s; // 32 bits. Received time-stamp seconds.
uint32_t rxTm_f; // 32 bits. Received time-stamp fraction of a second.
uint32_t txTm_s; // 32 bits and the most important field the client cares about. Transmit time-stamp seconds.
uint32_t txTm_f; // 32 bits. Transmit time-stamp fraction of a second.
} ntp_packet; // Total: 48 bytes.
int sockfd=-1;
int maxfd1;
fd_set readfds;
struct timeval timeout;
struct sockaddr_in servaddr;
int len;
int i;
uint8_t buf[48];
long local_timestamp;//uint32_t local_timestamp;
ntp_packet packet ;
struct tm * Net_time;
uint8_t NTP_Data[48]; //48字节的报文
int bsp_ntp_init(void)
{
NTP_Data[0]=0xa3;
//00100011, 0xa3,100 版本4
//00011011, 0x1b,011 版本3
//00010011, 0x13,010 版本2
//00001011, 0x0b,001 版本1
//后面分别发送了4个不同版本,都可以收到数据。
for(i=1;i<48;i++)NTP_Data[i]=0;//剩余的47字节为0
// servaddr.sin_family = AF_INET;
// servaddr.sin_port = htons(SERVER_PORT);
// servaddr.sin_addr.s_addr = inet_host(SERVER_IP);
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr.s_addr);
servaddr.sin_port = htons(SERVER_PORT);
if(sockfd>0)
{
//close(sockfd);
closesocket(sockfd);
sockfd=-1;
}
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
return -1;
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(struct sockaddr)) != 0)
{
//close(sockfd);
closesocket(sockfd);
sockfd=-1;
return -1;
}
return 0;
}
int bsp_read_ntp(void)
{
if(sockfd<0)
{
if(bsp_ntp_init()<0)
{
rt_kprintf("sockfd is errn");
return -1;
}
}
send(sockfd, NTP_Data, sizeof(NTP_Data), 0);
rt_kprintf("send n");
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
maxfd1 = sockfd + 1;
timeout.tv_sec = TIMEOUT;
timeout.tv_usec = 0;
if (select(maxfd1, &readfds, NULL, NULL, &timeout) > 0)
{
if (FD_ISSET(sockfd, &readfds))
{
if ((len = recv(sockfd, buf, sizeof(buf), 0)) < 0)
{
//close(sockfd);
closesocket(sockfd);
sockfd=-1;
return -1;
}
packet.txTm_s = buf[40]<<24 | buf[40+1]<<16|buf[40+2]<<8 |buf[40+3];//由于本文的时间精度要求不高,故自己用服务器返回的时间作为对时的时间,并未用公式:时间差offset=((T2-T1)+(T3-T4))/2。而是用T3作为对时基准时间。
local_timestamp = packet.txTm_s - NTP_TIMESTAMP_DELTA;//减去1970和1900的差值
rt_kprintf( "unix_timestamp=%ldn",local_timestamp);
local_timestamp +=SEC_TIME_ZONE; //加上北京的时间差,GMT+8
Net_time = localtime(&local_timestamp); //秒数转换位标准时间
rt_kprintf("%d-%d-%d %d:%d:%drn",(Net_time->tm_year)+1900, (Net_time->tm_mon)+1, Net_time->tm_mday, Net_time->tm_hour,Net_time->tm_min,Net_time->tm_sec); //打印出时间
}
}
return 0;
}

主函数调用,代码如下:

extern int bsp_ntp_init(void);
extern int bsp_read_ntp(void);
int main(void)
{
int count = 1;
rt_thread_mdelay(5000);
bsp_ntp_init();
while (count++)
{
LOG_D("Hello RT-Thread!");
rt_thread_mdelay(1000);
bsp_read_ntp();
}
return RT_EOK;
}

编译无报错,下载测试,测试结果如下:

1.jpg

选择其中一个时间戳,利用时间戳转换工具比对,结果如下:

1.jpg

结果正常。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • NTP
    NTP
    +关注

    关注

    1

    文章

    93

    浏览量

    13779
  • LwIP协议栈
    +关注

    关注

    0

    文章

    19

    浏览量

    7259
  • LAN8720
    +关注

    关注

    0

    文章

    4

    浏览量

    10961
  • STM32F407
    +关注

    关注

    15

    文章

    187

    浏览量

    28985
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38900
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(二、RT-Thread内核启动流程

    在前面我们RT-Thread Studio工程基础之上讲一讲RT-Thread内核启动流程.
    的头像 发表于 06-20 00:30 4422次阅读
    <b class='flag-5'>RT-Thread</b>记录(二、<b class='flag-5'>RT-Thread</b>内核启动<b class='flag-5'>流程</b>)

    LAN8742如何修改源文件和头文件,匹配LAN8720A芯片呢?

    板子的MCU芯片选择STM32H743和LAN8720A。我使用cubemx使能ETH和lwip,但是系统默认是LAN8742。软件生成的驱动代码low_level_init()函数中调用
    发表于 03-26 08:29

    请问stm32 lan8720a为什么ping不成功?

    stm32f407 lan8720a初始化成功,lwip初始化成功,怎么ping不成功电脑ip属性都设置了,,跑的是网络例程
    发表于 10-16 22:54

    LAN8720A的相关资料推荐

    只有24pin,仅支持RMII接口。由它组成的网络结构如下图。LAN8720A通过RMII接口与MAC连接。RJ45是网络插座,LAN8720A连接之间还需要一个变压器,所以一般使用带电压转换
    发表于 02-15 06:53

    怎样RT-Thread Studio上去开启MQTT示例呢

    怎样RT-Thread Studio上去移植LAN8720A驱动呢?怎样RT-Thread
    发表于 03-01 07:07

    如何在RT-Thread Studio移植LAN8720A驱动的基础上打开lwIP和SA呢

    如何在RT-Thread Studio移植LAN8720A驱动的基础上打开lwIP和SA呢?有哪些操作
    发表于 03-01 06:13

    ART-Pi调试LAN8720object初始化遇到断言报错的原因是什么?

    使用rt-thread stdio平台和ART-Pi开发LAN8720A。目前已经过了ETH的初始化,但是object.c的rt_object_init()初始化函数中断言报错。请教
    发表于 04-14 09:42

    RT-Thread系统移植eRPC并添加lwip的步骤

    还有 snprintf 变成 rt_snprintf,memset 变成 rt_memset 等验证有没有发现,我们可以设备跑 eRPC了。到目前为止,我们已经添加了
    发表于 09-05 16:43

    详解RT1052移植网卡LAN8720A的过程

    的网卡,所以要注意从SOC到PHY芯片之间用到的引脚。然后结合 LAN8720A 芯片手册来进行配置。这里我使用的野火提供的FreeRTOS中lwip例程,这个例程有LAN8720A 芯片的驱动代码
    发表于 09-09 16:17

    STM32H750开发板基于LAN8720A移植LWIP的详解

    移植环境:RT-THREAD Studio编译环境:MDK5系统版本:rt thread 4.0.3LWiP版本:2.0.2硬件环境:野火S
    发表于 11-22 16:50

    RT-Thread找不到网卡的PHY该如何解决呢?

    需要完成的任务是给STM32开发板烧录RT-Thread系统并添加网卡驱动我遇到的问题是1.找不到网卡的phy,board.h中支持LAN8720A,DM9161CEP,DP83848C 我测试
    发表于 02-15 10:32

    RT-ThreadLan8720alwip基础上移植ntp的步骤

    开发环境:野火的stm32f407,rt-thread studio版本是版本: 2.2.6,stm32f4的资源包为0.2.2。以RT-ThreadLan8720lwip协议栈的
    发表于 02-15 11:21

    RT-Thread移植使用webserver的流程

    ,stm32f4的资源包为0.2.2,rt-thread版本为4.0.3。以RT-ThreadLan8720lwip协议栈的使用文章创建的工程为基础。httpd(The Apach
    发表于 02-22 15:10

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 7次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与<b class='flag-5'>移植</b>

    RT-Thread中mymqtt软件包的使用方法

    在上一篇文章 RT-ThreadLan8720lwip协议栈的使用的工程基础上添加mymqtt软件包。 使能mqtt example和mqtt test,保存,等待下载更新软件包
    的头像 发表于 10-13 10:44 524次阅读
    <b class='flag-5'>RT-Thread</b>中mymqtt软件包的使用方法