This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:如何使用内置的时间库初始化 RTC?

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430FR5994

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/770670/msp430fr5994-how-to-initialize-rtc-using-the-built-in-time-library

器件型号:MSP430FR5994

大家好

我正在尝试通过分配时间库中的值来初始化 MSP430FR5994 Launchpad 上的 RTC_C。

当我使用0x00格式的硬编码值时、下游编码的行为与我使用变量赋值时的行为不同

如下所示。 我认为问题是类型不匹配、并尝试转换、检查值等、但我无法解决  

问题-日历对变量赋值的解释方式与硬编码值不同。 RTC 初始化使用

二进制、因此这不是一个十六进制问题。 时间间隔字段(TM_sec、TM_min 等)是整数、而日历字段是 uint8_t

我们非常感谢您的任何帮助。

谢谢

Jim

 

void Init_rtc ()
{

struct tm *info;

time_t rawtime;//type 为 long。 用于保存编码的日历时间
Time (&rawtime);//函数获取相对于1/1/1970 (以秒为单位)的当前系统时间
info=localtime (&rawtime);//返回指向存储日期和时间的 TM 结构的指针
mktime (info);//normalize 值

//调试的分配很不一样
uint8_t sec =(uint8_t)(info->tm_sec);
uint8_t min=(uint8_t)(info->tm_min);
uint8_t hours =(uint8_t)(info->tm_hour);
uint8_t weekday =(uint8_t)(info->tm_wday);
uint8_t month=(uint8_t)(info->tm_mon);
uint8_t dayofmonth=(uint8_t)(info->tm_mday);
uint8_t 年=(uint8_t)(info->tm_year);

//设置日历的当前时间
calender.seconds = sec;//0x25;
calender.minutes = min;//0x05;
日历.小时数 =小时;//0x0C;//12
calender.DayOfWeek =工作日;//0x00;
calender.dayofmonth =月;//0x05;
日历月 =月+1;//0x02;
日历。年 = 0x07e3;//0x2019;


//使用上面指定的日历初始化 RTC
RTC_C_initCalendar (RTC_C_base、
日历(&A)、
RTC_C_FORMAT_BINARY);//使用 RTC_C_FORMAT_BCD 扰码文件时间戳

RTC_C_setCalendarEvent (RTC_C_base、
RTC_C_CALENDAREVENT_INTOTECHANGE
);

RTC_C_clearInterrupt (RTC_C_base、
RTC_C_TIME_EVENT_INTERRUPT
);

RTC_C_enableInterrupt (RTC_C_base、
RTC_C_TIME_EVENT_INTERRUPT
);

//启动 RTC 时钟
RTC_C_startClock (RTC_C_base);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    器件型号:MSP430FR5994

    工具/软件:TI C/C++编译器

    大家好、 

    我正在尝试通过分配时间库中的值来初始化 MSP430FR5994 Launchpad 上的 RTC_C。

    当我使用0x00格式的硬编码值时、下行代码的行为与使用分配时的行为不同

    当前如下所示。 我认为问题是类型不匹配*,并尝试转换、检查值等,但是

    仍然存在问题-日历字段对变量的解释与硬编码值不同。


    我的 RTC_C 初始化使用二进制格式、因此这不是一个十六进制问题。


    谢谢你
    Jim


    *时间库字段(即 TM_sec、TM_min 等)是整数,而日历字段需要 uint8_t
    
    
    void Init_rtc ()
    {
    
    struct tm *info;
    
    time_t rawtime;//type 为 long。 用于保存编码的日历时间
    Time (&rawtime);//函数获取相对于1/1/1970 (以秒为单位)的当前系统时间
    info=localtime (&rawtime);//返回指向存储日期和时间的 TM 结构的指针
    mktime (info);//normalize 值
    
    uint8_t sec =(uint8_t)(info->tm_sec);
    uint8_t min=(uint8_t)(info->tm_min);
    uint8_t hours =(uint8_t)(info->tm_hour);
    uint8_t weekday =(uint8_t)(info->tm_wday);
    uint8_t month=(uint8_t)(info->tm_mon);
    uint8_t dayofmonth=(uint8_t)(info->tm_mday);
    uint8_t 年=(uint8_t)(info->tm_year);
    
    //设置日历的当前时间
    calender.seconds = sec;//0x25;
    calender.minutes = min;//0x05;
    日历.小时数 =小时;//0x0C;//12
    calender.DayOfWeek =工作日;//0x00;
    calender.dayofmonth =月;//0x05;
    日历月 =月+1;//0x02;
    日历。年 = 0x07e3;//0x2019;
    
    
    //使用上面指定的日历初始化 RTC
    RTC_C_initCalendar (RTC_C_base、
    日历(&A)、
    RTC_C_FORMAT_BINARY);//使用 RTC_C_FORMAT_BCD 扰码文件时间戳
    
    RTC_C_setCalendarEvent (RTC_C_base、
    RTC_C_CALENDAREVENT_INTOTECHANGE
    );
    
    RTC_C_clearInterrupt (RTC_C_base、
    RTC_C_TIME_EVENT_INTERRUPT
    );
    
    RTC_C_enableInterrupt (RTC_C_base、
    RTC_C_TIME_EVENT_INTERRUPT
    );
    
    //启动 RTC 时钟
    RTC_C_startClock (RTC_C_base);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您没有告诉我们问题是什么。

    但我怀疑 TIME()不会返回任何有用的内容。 (它从哪里获得? 来自 RTC?)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好
    感谢您的回答。 Time 是基于 C 语言的内置库、它从系统时钟获取时间。 这应该是我所需的合理时间来源。 问题是 sdcard 上的文件丢失了 FatFs 创建日期。 硬编码时、会显示 FatFs 日期。 即使时间返回的日期不正确、我也不应丢失文件创建日期。 我已将问题追踪到日历的初始化方式。 硬编码有效、那么变量初始化为什么不起作用? 我唯一能想到的是变量的格式不正确...
    Jim
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    微控制器没有系统时钟。

    我不知道时间()返回了什么,但这肯定不是你所期望的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想我现在已经理解了。 您所说的是、内置库需要运行一个实时钟来在运行时返回合法值、这不是编译时选项。 是这样吗?

    谢谢

    Jim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道您使用的是哪个库(这取决于编译器)。

    但没有操作系统,也没有系统时钟,因此我想 TIME()不包含任何有用的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我认为它仍然包含一些有用的代码。 我用它来制作 epoch / UNIX 时间戳、它只需要一个静态日期(年份相对于1970年进行调整)。 非常感谢您的帮助。 现在我回退时就意识到我的问题是多么的差劲(离树木太近,看不到森林)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不是很差劲,只是圆形的。 库的源代码被嵌在 CCS 安装文件夹中,并且可能有一种方法(如 Clemens 所建议的)可以将 RTC 的内容插入到 time()函数中。


    但您仍然必须以某种方式为 RTC 种子。 据我所知、FR5994没有 RTC 的电池备份功能(标称为 VBAT)、因此您必须在每个循环通电后设置时间(从某个位置)。