桌面Mini时钟项目用来演示如何使用RT-Thread Stduio开发项目,整个项目的架构如下:
在前两篇博文中简单的介绍了RT-Thread Studio一站式工具,基于STM32L431RCT6这个芯片创建工程,并修改时钟为使用外部时钟,以及添加SHT3x软件包获取温湿度传感器数据。
使用RT-Thread Studio DIY 迷你桌面时钟(一)| 基于STM32芯片创建工程 使用RT-Thread Studio DIY 迷你桌面时钟(二)| 获取温湿度传感器数据(I2C设备驱动+SHT3x软件包)接下来添加at_device设备ESP8266用于连接网络,添加netutils软件包用于获取NTP时间。
2. 添加ESP8266设备驱动 2.1. 使能libc组件使用at_device软件包之前,需要先开启libc组件:
本项目中使用的是ESP8266设备,其基于AT框架的驱动示例代码在at_device软件包中提供。
点击添加软件包按钮,搜索at_device,添加该软件包:
添加到工程设置之后,右键单击进入该软件包配置页面:
配置实际信息:
保存设置,软件会自动添加at_device软件包到工程中。
在上一小节配置软件包的时候,设置的串口设备为lpuart1,但是目前系统中并没有设备lpuart1,需要手动在board.h
文件中开启,开启方法在该文件的注释中已经说明,如图:
按照图中注释的说明,首先添加使用lpuart1的宏定义,开启串口:
接下来修改具体lpuart1串口的引脚配置:
接下来为了后续方便操作控制台,将sht3x的测试线程先注释掉:
然后编译整个项目,下载,查看串口输出:
可以看到有一个警告,提示 RT_SERIAL_RB_BUFSZ 的值不够用了,解决方案就是在设置中加大该缓冲区的值:
重新编译,下载,在串口控制台中查看网络是否成功配置:
两条红色的日志打印暂且没有影响,是因为使用lpuart的原因,如果换为使用普通uart,在完全相同的配置下,没有这两条信息。
2.4. 测试网络再使用下面的命令进行进一步的测试,确保网络正常能访问外网:
ifconfig //使用该命令查看当前网卡配置
ping www.baidu.com //使用该命令测试外网是否可以ping通
测试结果如下:
netutils软件包中汇集了 RT-Thread 可用的全部网络小工具集合,包括NTP工具。
NTP 是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机时间的协议,RT-Thread 上的 NTP 客户端连接上网络后,可以获取当前 UTC 时间,并更新至 RTC 中。
打开配置文件,添加软件包,搜索NTP之后添加:
右击软件包,修改该软件包的配置:
开启NTP服务器配置即可:
因为NTP工具在获取到网络时间后,需要同步到本地RTC,所以需要开启本地模拟RTC功能:
开启之后保存配置,重新编译工程,下载,在串口控制台查看是否可以正常工作。
使用NTP工具包自带的命令进行测试:
ntp_sync //获取NTP时间并同步到本地
3.4. 编写上电自动同步时间代码
在本项目中,需要上电连接网络之后,自动获取NTP时间同步到本地,供后续显示使用,这段代码放在main函数中执行。
① 检测当前网络是否正常netdev(network interface device),即网络接口设备,又称网卡。每一个用于网络连接的设备都可以注册成网卡,为了适配更多的种类的网卡,避免系统中对单一网卡的依赖,RT-Thread 系统提供了 netdev 组件用于网卡管理和控制。
使用 netdev 网卡功能相关操作函数,需要包含如下头文件:
#include /* 包含 ip_addr_t 等地址相关的头文件 */
#include /* 包含全部的 netdev 相关操作接口函数 */
首先获取要操作的网卡对象,每个网卡中有唯一的网卡名称,可以通过网卡名称获取网卡对象::
struct netdev *netdev_get_by_name(const char *name);
netdev 网卡提供了一个宏定义用于判断网卡是否为 internet_up 状态,如下:
#define netdev_is_internet_up(netdev)
通过这个宏定义即可判断当前网络状态是否正常,在main函数中添加如下代码:
//获取网卡对象
struct netdev* net = netdev_get_by_name("esp0");
//阻塞判断当前网络是否正常连接
while(netdev_is_internet_up(net) != 1)
{
rt_thread_mdelay(200);
}
//提示当前网络已就绪
rt_kprintf("network is ok!\n");
编译,下载,效果如下:
要使用NTP工具提供的API,首先包含头文件:
#include
接着调用获取时间并同步的API,原型如下:
time_t ntp_sync_to_rtc(void);
在上面的代码之后继续添加NTP对时的代码:
//NTP自动对时
time_t cur_time;
cur_time = ntp_sync_to_rtc(NULL);
if (cur_time)
{
rt_kprintf("Cur Time: %s", ctime((const time_t*) &cur_time));
}
else
{
rt_kprintf("NTP sync fail.\n");
}
编译,下载,效果如下:
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。