本篇是基于上一篇 【ART-Pi与RT-Thread入门】⑥启用ART-Pi硬件RTC和Alarm组件的项目来进行
添加netutils组件
在项目的RT-Thread Settings
的软件包
点击+Add
搜索netutils
并添加
使能NTP 客户端
双击netutils
进入配置
选中使能NTP 客户端
NTP服务器设置
NTP服务器可以在两个地方指定:
- 在软件包的settings中设置
- 直接在代码中设定
ntp_sync_to_rtc("time1.cloud.tencent.com");
连接WIFI的几种方法
这里说一下快速连接wifi的几种方法
1. 使用finsh命令
在finsh命令行中使用 wifi join ssid password
即可。
2. 代码中直接设置ssid和密码
#define WLAN_SSID "ssid"
#define WLAN_PASSWORD "password"
...
rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);
然后在代码中添加如下语句可以下次自动重连:
/* init Wi-Fi auto connect feature */
wlan_autoconnect_init();
/* enable auto reconnect on WLAN device */
rt_wlan_config_autoreconnect(RT_TRUE);
设置wlan连接回调
ntp需要网络才能正确获得时间,所以我们需要注册一个wlan连接成功的回调函数,在此回调函数中执行ntp同步。
rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wlan_ready_handler, RT_NULL);
在回调函数中进行一次同步,并且打印10次时间,然后创建一个ntp线程,线程每隔2小时进行一次同步。
void wlan_ready_handler(int event, struct rt_wlan_buff *buff, void *parameter)
{
rt_kprintf("wlan ready, sync time to RTC...\r\n");
ntp_sync_to_rtc("time1.cloud.tencent.com");
time_t now;
struct tm *info;
char buffer[80];
for (int i = 0; i< 10; i++)
{
time(&now);
info = localtime(&now);
strftime(buffer,80,"%Y%m%d_%H%M%S\n", info);//以年月日_时分秒的形式表示当前时间
rt_kprintf("%s",buffer);
rt_thread_mdelay(1000);
}
ntp_tid = rt_thread_create("ntp_thread", ntp_thread_entry, RT_NULL, 2048, 25, 10);
if (ntp_tid != RT_NULL)
{
rt_thread_startup(ntp_tid);
}
}
完整代码
/*
* Copyright (c) 2006-2020, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2020-09-02 RT-Thread first version
*/
#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"
//#define WLAN_SSID "ssid"
//#define WLAN_PASSWORD "password"
#define LED_PIN GET_PIN(I, 8)
extern void wlan_autoconnect_init(void);
extern timer_t ntp_syn_to_rtc(const char* hostname);
static rt_thread_t ntp_tid;
static void ntp_thread_entry()
{
rt_kprintf("ntp_thread started.");
while(1)
{
ntp_sync_to_rtc("time1.cloud.tencent.com");
rt_thread_mdelay(2*60*60*1000);//2 hours interval
}
}
void wlan_ready_handler(int event, struct rt_wlan_buff *buff, void *parameter)
{
rt_kprintf("wlan ready, sync time to RTC...\r\n");
ntp_sync_to_rtc("time1.cloud.tencent.com");
time_t now;
struct tm *info;
char buffer[80];
for (int i = 0; i< 10; i++)
{
time(&now);
info = localtime(&now);
strftime(buffer,80,"%Y%m%d_%H%M%S\n", info);//以年月日_时分秒的形式表示当前时间
rt_kprintf("%s",buffer);
rt_thread_mdelay(1000);
}
ntp_tid = rt_thread_create("ntp_thread", ntp_thread_entry, RT_NULL, 2048, 25, 10);
if (ntp_tid != RT_NULL)
{
rt_thread_startup(ntp_tid);
}
}
int main(void)
{
rt_uint32_t count = 1;
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
/* register network ready event callback */
rt_wlan_register_event_handler(RT_WLAN_EVT_READY, wlan_ready_handler, RT_NULL);
//Connect waln
// rt_wlan_connect(WLAN_SSID, WLAN_PASSWORD);
/* init Wi-Fi auto connect feature */
wlan_autoconnect_init();
/* enable auto reconnect on WLAN device */
rt_wlan_config_autoreconnect(RT_TRUE);
while(count++)
{
rt_thread_mdelay(500);
rt_pin_write(LED_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_PIN, PIN_LOW);
}
return RT_EOK;
}
#include "stm32h7xx.h"
static int vtor_config(void)
{
/* Vector Table Relocation in Internal QSPI_FLASH */
SCB->VTOR = QSPI_BASE;
return 0;
}
INIT_BOARD_EXPORT(vtor_config);