145|2

174

帖子

0

资源

一粒金砂(高级)

【建筑施工监测与安防系统】十、Kaluga网络授时和定时器 [复制链接]

          依靠ESP32 IDF提供的SNTP案例(..\esp-idf-v4.4\examples\protocols\sntp)和定时器案例(..\esp-idf-v4.4\examples\system\esp_timer),本人继续进行参赛项目的功能开发,使得Kaluga板在启动并联网后获取网络时间,之后启动s级定时器——为了后续进行周期性监测作准备。依然是单独创建time.c源文件,时间相关代码编写于此。

 

#include "main.h"


/* Private macro -------------------------------------------------- */
#define TAG                                "AITA TIME"
#define CONFIG_SNTP_TIME_SYNC_METHOD_IMMED 1
#define AITA_SNTP_MAX_RETRY_TIMES          10


// SNTP related --------------------------------------------------- //
/* Private functions ---------------------------------------------- */
/*********************************************************************
 * FunctionName : sntp_notification_cb()
 * Description  : time synchronization callback
 * Parameters   : struct timeval *tv ——> epoch time struct pointer
 * Returns      : void
*********************************************************************/
void sntp_notification_cb(struct timeval *tv) {
    ESP_LOGI(TAG, "Epoch sec: %d, usec: %d", 
                (int)tv->tv_sec, (int)tv->tv_usec);
}
/*********************************************************************
 * FunctionName : initialize_sntp()
 * Description  : initialize sntp & synchronize system time
 * Parameters   : void
 * Returns      : void
*********************************************************************/
void initialize_sntp(void) {
    ESP_LOGI(TAG, "Initializing SNTP");
    sntp_setoperatingmode(SNTP_OPMODE_POLL);
// 0 - server number, "pool.ntp.org" - server url
    sntp_setservername(0, "pool.ntp.org");
    sntp_set_time_sync_notification_cb(sntp_notification_cb);
    sntp_init();
}
/*********************************************************************
 * FunctionName : obtain_time()
 * Description  : obtain system time
 * Parameters   : void
 * Returns      : void
*********************************************************************/
void obtain_time(void) {
    initialize_sntp();

// wait for time to be set
    int retry = 0;
    while(sntp_get_sync_status()==SNTP_SYNC_STATUS_RESET && 
                ++retry<AITA_SNTP_MAX_RETRY_TIMES) {
        ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", 
                    retry, AITA_SNTP_MAX_RETRY_TIMES);
        vTaskDelay(2000 / portTICK_PERIOD_MS);
    }
}
/* Exported functions --------------------------------------------- */
/*********************************************************************
 * FunctionName : aita_PrintCST8()
 * Description  : print cst-8 timezone time
 * Parameters   : time_t *now ——> sytem local time
 * Returns      : void
*********************************************************************/
void aita_PrintCST8(time_t *now) {
    char buf[64];
    struct tm timeinfo;
// set timezone to China standard time
    setenv("TZ", "CST-8", 1);
    tzset();
    localtime_r(now, &timeinfo);
    strftime(buf, sizeof(buf), "%c", &timeinfo);
    ESP_LOGI(TAG, "current date/time in Shanghai: %s", buf);
}
/*********************************************************************
 * FunctionName : aita_InitSNTP()
 * Description  : sntp & print cst-8 timezone time
 * Parameters   : void
 * Returns      : void
*********************************************************************/
void aita_InitSNTP(void) {
    time_t now;
    struct tm timeinfo;
    time(&now);
    localtime_r(&now, &timeinfo);

// If time is not set, tm_year will be (1970 - 1900).
    if(timeinfo.tm_year < (2016-1900)) {
        ESP_LOGI(TAG, "time is not set yet.");
        ESP_LOGI(TAG, "getting time over NTP.");
        obtain_time();
    // update 'now' variable with current time
        time(&now);
    }
// print China timezone time
    aita_PrintCST8(&now);
}


// timer related -------------------------------------------------- //
/* Private functions ---------------------------------------------- */
/*********************************************************************
 * FunctionName : periodic_timer_callback()
 * Description  : periodic timer callback function
 * Parameters   : void* arg ——> callback's argument
 * Returns      : void
*********************************************************************/
static void periodic_timer_callback(void* arg) {
    int64_t time_since_boot = esp_timer_get_time();
    ESP_LOGI(TAG, "periodic timer called, time since boot: %lld us", 
                    time_since_boot);
    aita_InitSNTP();
}
/* Exported functions --------------------------------------------- */
/*********************************************************************
 * FunctionName : aita_InitTimer()
 * Description  : initialize timer
 * Parameters   : void
 * Returns      : void
*********************************************************************/
void aita_InitTimer(void) {
    const esp_timer_create_args_t periodic_timer_args = {
            .callback = &periodic_timer_callback,
            .name = "periodic"
    };

    esp_timer_handle_t periodic_timer;
    ESP_ERROR_CHECK(
        esp_timer_create(&periodic_timer_args, &periodic_timer)
    );
    
    /* Start the timers */
    ESP_ERROR_CHECK(
        esp_timer_start_periodic(periodic_timer, 1000000)
    );
    ESP_LOGI(TAG, "started timers, time since boot: %lld us", 
                    esp_timer_get_time());
}


/*********** (C) COPYRIGHT AITA TCU ********** END OF FILE **********/

 

          项目入口app_main()中调用aita_InitSNTP()得到网络授时,调用aita_InitTimer()开启1s的周期性定时器。

 

image-20220921225821-1.png

 

image-20220921225821-2.png

图10-1 SNTP和定时器功能测试输出


回复

6990

帖子

0

资源

五彩晶圆(中级)

网络授时,调用aita_InitTimer()开启1s的周期性定时器这里应该没问题吧

点评

测试没问题,因为我的项目后面功能需要定时采集,还考虑记录本地log,发送心跳包等功能,需要有准确的时间,所以考虑先做授时,再开启定时器。 实际授时使用RTC,Timer使用通用定时器,互补影响的吧。  详情 回复 发表于 6 天前

回复

174

帖子

0

资源

一粒金砂(高级)

Jacktang 发表于 2022-9-22 07:20 网络授时,调用aita_InitTimer()开启1s的周期性定时器这里应该没问题吧

测试没问题,因为我的项目后面功能需要定时采集,还考虑记录本地log,发送心跳包等功能,需要有准确的时间,所以考虑先做授时,再开启定时器。

实际授时使用RTC,Timer使用通用定时器,互补影响的吧。


回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
    推荐帖子
    TI工业月第二季——技术方案深度学习

    TI工业月第二季——技术方案深度学习三次抽奖机会等您来~ >>点击进入活动 活动时间:即日起- 2019年06月5日 活动规则:Step1 ...

    Altium Designer单选和复先框比例失调

    Altium Designer单选和复先框比例失调 440610 440611 对话框右边也有缺失,拉多长都没用 440612 怀疑是 ...

    【实用工具】一键合并sof和NIOS的elf软件程序为jic文件

    文件分成两个版本, “合并sof和elf生产jic文件脚本.rar”为EP4CE10+EPCS16的版本,适用于小梅哥所有以EP4CE6、EP4CE ...

    Verilog的135个经典设计实例

    492236

    STM32 delay_ms函数中相关的ms值是如何计算的

    如下图 513110请问 1、nms<=0xffffff*8*1000/SYSCLK 这个计算中为什么要*8*1000 这个计算公式是怎么来的。

    你知道仪器如何进行出厂检测,有哪些注意事项吗?知识点都在这里啦~

    你知道仪器如何进行出厂检测,有哪些注意事项吗?知识点都在这里啦~

    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表