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:MSP430FR5994

Guru**** 2049390 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/1167256/msp430fr5994-msp430fr5994

器件型号:MSP430FR5994

大家好!

我尝试使 MSP430FR5994开发板的 LED 闪烁一段时间、该时间必须通过使用 MSP430FR5994的 RTC 进行设置。 我已经编写了一些 IF 条件。 但我只获得 RTC 输出、但 LED 不闪烁。 我在 RTC 中断服务例程上写入了相同的 IF 条件、但输出仍然没有变化。 有人能告诉我我哪里失踪了吗? 我将共享下面的代码。

    

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <msp430.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <rtc.h>
unsigned char addr[30]="";
void pin_setup()
{
P1DIR |= 0x03;
__delay_cycles(8000000);
P1OUT &=~0X01;
PM5CTL0=LOCKLPM5;
}
void clk_setp()
{
CSCTL0_H = CSKEY_H;
CSCTL1 = DCOFSEL_6; //8MHz |DCOFSEL_0 -1MHz
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    >if (((hour==11)&&(mins==45))

    "小时"和"分钟"来自哪里? 在 BCD 模式中、RTCHOUR 永远不会=11 (0x0B)、而您的 sprintf()建议您不要转换它们。

    我怀疑您的意思是:

    >IF (((hours=0x11)&&(mins=0x45))// BCD 中的11:45?

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

    Sindhusha、您好!

    除了更正 Bruce 指出的条件之外。 您提到您曾尝试在 RTC ISR 内部执行此操作、您能否共享 ISR 代码?

    此致、
    Brandon Fisher

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

    您好、Brandon

    这是我尝试过的 RTC ISR

    #include
    #include
    #include

    volatile int rx_index=0;
    volatile unsigned int rx_key=0;
    volatile int Tx_index=0;
    volatile unsigned int Tx_key=0;
    int size=0;
    unsigned char Data[15]="";
    unsigned char RXData[5]="";
    int secs=0;
    int 小时=0;
    int mins=0;
    int Day = 0;
    int month=0;
    int yage=0;

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=RTC_C_Vector
    _interrupt void RTC_ISR (void)
    #Elif defined (_GNU_)
    void __attribute__((interrupt (RTC_C_vector)) RTC_ISR (void)
    其他
    错误编译器不受支持!
    #endif

    switch (__evo_in_range (RTCIV、RTCIV__RT1PSIFG))

    案例 RTCIV_none:中断;//无中断
    案例 RTCIV_RTCOFIFG:中断;// RTCOFIFG
    案例 RTCIV_RTCRDYIFG:// RTCRDYIFG
    P1OUT ^= 0x01;//每秒切换 P1.0
    小时= RTCHOUR;
    mins=RTCMIN;
    secs=RTCSEC;
    Day = RTCDAY;
    Month=RTCMON;
    YEAR = RTCYEAR;

    if ((小时=11)&&(分钟=45))

    P1OUT = 0x01;
    //__delay_cycles ((80000)*60);

    否则(((小时=11)&&(分钟=47))

    P1OUT = 0x02;
    //__delay_cycles ((80000)*60);

    其他
    中断;
    案例 RTCIV_RTCTEVIFG:// RTCEVIFG
    __no_operation();//每分钟中断一次-在此处设置断点
    中断;
    案例 RTCIV_RTCAIFG:中断;// RTCAIFG
    案例 RTCIV__RT0PSIFG:中断;// RT0PSIFG
    案例 RTCIV__RT1PSIFG:中断;// RT1PSIFG
    默认值:break;

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

    你好 Bruce

    我想通过 UART 模板来设置被称为 RTCHOUR、RTCMIN、RTCSEC 的时间。也就是说、我必须在终端中给出值、以便这些值应该存储在这些变量中。  我编写了我在这里共享的代码。 我无法找到我遗漏的位置、因此您能帮我从终端写入数据吗?

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <msp430.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <rtc.h>
    unsigned char addr[30]="";
    void pin_setup()
    {
    // P1DIR |= BIT0; //Set P1.0 (red LED) to output
    P1DIR = 0x03; //Set P1.0 to output direction
    //P1OUT &=~0X02;
    PM5CTL0=LOCKLPM5;
    }
    void clk_setp()
    {
    CSCTL0_H = CSKEY_H;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Sindhusha、您好!

    您可以使用代码块工具将格式化的代码插入您的帖子。 当您键入帖子/回复时、它位于"插入"选项下。 这使我们更容易查看您的代码。

    您的代码目前在做什么? 这将使我们了解在哪里查找问题。  

    在这里、您似乎希望 MSP430 坐下等待器件接收 UART 数据、但实际上您正在不断启用 SR 寄存器中的全局中断。  

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    print("ENTER HOURS: \r\n");
    ·__bis_SR_register(GIE);
    RTCHOUR = RXData;· · ·// Hour = 0x23
    print("ENTER MINITUS: \r\n");· ··// Minute = 0x00
    __bis_SR_register(GIE);
    RTCMIN = RXData;
    print("ENTER SECONDS: \r\n");·
    _bis_SR_register(GIE);
    RTCSEC = RXData;· · · · · · · · · // Seconds = 0x00
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    如果您的打印功能正常工作、那么我 希望您看到的只是在您的终端上输出全部三个提示、然后您才能做出反应并输入您的值。

    查看此示例、了解它们如何处理在主 while 环路中进入 LPM0以及在从中断返回时退出 LPM0:

    https://dev.ti.com/tirex/explore/node?devices=MSP430FR5994&devtools=MSP430FR5994&node=A__AOHOOwPzOj18DhYbBHMbzw__msp430ware__IOGqZri__LATEST

    此致、
    Brandon Fisher

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

    您好、Brandon、

    这是我已修改的代码块。 实际上、我必须使用 UART 设置 RTC 时间、即 RTCHOUR、RTCMIN、RTCSEC。  它允许在终端上输入数据、但数据不会进入我在终端中输入的接收缓冲区。 在终端中输入数据后、我会得到一些无用的 RTC 值。 当我调试代码时,它会在   _ bis_SR_register (LPM0_bits | GIE) interrupt of Hours 部分停止。 因此、请帮助我解决这个问题。   

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    print("ENTER HOURS: \r\n");
    UCA0IE |= UCRXIE | UCTXCPTIE;
    __bis_SR_register(LPM0_bits | GIE);
    RTCHOUR = RXData; // Hour = 0x23
    print("ENTER MINITUS: \r\n");
    UCA0IE |= UCRXIE | UCTXCPTIE;
    __bis_SR_register(LPM0_bits | GIE);
    RTCMIN = RXData;
    print("ENTER SECONDS: \r\n");
    UCA0IE |= UCRXIE | UCTXCPTIE;// Minute = 0x00
    __bis_SR_register(LPM0_bits | GIE);
    RTCSEC = RXData; // Seconds = 0x00
    RTCCTL13 &= ~(RTCHOLD); // Start RTC
    // __bis_SR_register(LPM3_bits | GIE); // Enter LPM3 mode w/ interrupts enabled
    __bis_SR_register(GIE); // Enter LPM3 mode w/ interrupts enabled
    __no_operation();
    return 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Sindhusha、您好!

    您应该确保已经在 ISR 中添加了对__BIC_SR_REGISTER_ON_EXIT (LPM0_Bits)的调用。 否则、您将在 ISR 之后跳回到代码并返回到 LPM0。

    此致、
    Brandon Fisher

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

    您好、Brandon、

    我试图通过从 UART 获取输入来设置 RTCHOUR、RTCMIN、RTCSEC。这意味着我必须将一个11 20 00之类的输入传递给  RTCHOUR、RTCMIN、RTCSEC 变量、该字符串必须被拆分并且应该分配给 RTCHOUR、RTCMIN、RTCSEC 变量。 我可以接收来自 UART 的输入。 但是、当我将数据传递到   RTCHOUR、RTCMIN 和 RTCSEC 的每个变量中时 、我将获得错误的输出、例如、如果我从 端子传递11 20 00、那么其他东西将作为输出来提供。 如果我作为这3个变量 RTCHOUR、RTCMIN 传递此格式为0x11 0x20 0x00、RTCSEC 将在 BCD 中接受此格式为11:20:00、但情况仍然相同。  我在这里传递了一段代码,因为我在这3行中遇到了问题 :RTCHOUR=HRS; 、RTCMIN=MIN;、 RTCSEC =sec;  其余部分执行正常、因此请帮助我。 一旦我们加载程序、RTC 应连续启动工作。 但是在这里、它的工作方式与此不同、当我按下 CCS 上的"播放"按钮以在调试模式下进入输入时、它将获得一些垃圾输出、并在我退出调试后停止。因此、请解决我的问题。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /////////////////// main.c ////////////////////////
    #include <msp430.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <rtc.h>
    unsigned char addr[30]="";
    unsigned char receive_data[50];
    unsigned char* hr;
    unsigned char* mi;
    unsigned char* se;
    void print(unsigned char *str)
    {
    strcpy(Data, str);
    size = strlen(Data);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      

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

    >int hrs=atoi (token1);
    >RTCHOUR =小时;

    atoi()不返回 BCD 值,而是"二进制"值,因此 atoi("11")返回0x0B,而不是0x11。

    一个简单的修复方法可能是在设置时钟时切换到二进制(十六进制)模式(设置 RTCBCD=0)、然后在最后切换回 BCD 模式

    还有 BIN2BCD 寄存器[参考用户指南(SLAU367P)第29.4.36节]、您可以执行以下操作:

    >BIN2BCD = HRS;  //二进制输入

    > RTCHOUR = BIN2BCD;// BCD 输出

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

    您好、Bruce、

    非常感谢、它确实帮助我现在获得了正确的输出。 但是、当我们在设置值后转储代码时、RTC 应持续运行。 我 通过进入调试模式来提供 TERA 项中的值、那么这些值的出现是完美的、这意味着 RTC 工作正常 、但当我退出调试时、当我检查 RTC 不工作时。那么、您能告诉我什么可能是原因吗?  

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

    Sindhusha、您好!

    由于您使用的是 sprintf(),我的第一个问题是堆栈大小或配置问题。 您可以增大堆栈大小吗? 转至项目属性-> MSP430链接器->基本选项。

    此外、请确保在 MSP430 Compiler -> Advanced Options -> Language Options 下、printf 支持级别至少设置为 minimal。

    此致、
    Brandon Fisher

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

    您好、Brandon、

    是的、我已经进行了所有这些设置。 我增加了堆栈大小和语言选项、级别仅为最小值、但仍然没有输出。当我检查调试时、我能够获得输出、但当我从终端提供输入时、它不会出现。 我无法知道当我从终端提供输入时为什么不接受它。 请帮帮我。

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

    我不使用 printf(),但据我所知(除非您编写一些我在这里看不到的代码),它依赖于调试器[Ref CC 用户指南(SLAU132X)第7.2.3节]。

    我不确定如果调试器("host")不在那里该怎么办--跳过输出? 是否挂起程序? (Brandon、您知道吗?)

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

    显然、它会跳过输出、至少在复位时没有主机时。  

    当我尝试它并在调试器运行时断开连接时、我停止看到 UART 输出(这可能仍是一个 printf 操作)。 但是、当我按下重置按钮时、它返回、接受了我的设置、并正常运行。

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

    您好 Bruce,

    是的、您说的是正确的、我也做了同样的事情。 当我按下按钮时、它开始工作。 现在、我想再次设置到达特定时间的时间。 在其他 IF 条件中。 这意味着 RTC 应停止运行、并允许我发送输入。如果条件正常、但对于其他情况、如果不允许我从 UART 输入输入、则会停止运行。 我想在不使用复位按钮的情况下获得输出。我在这里共享代码块、请提供帮助。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    while(1)
    {
    if((RTCHOUR==10)&&(RTCMIN==15))
    {
    P1OUT = 0x01;
    sprintf(addr, "TIME = %d:%d:%d DATE = %d / %d / %d\r\n", hours,mins,secs,day,month,year);
    print(addr);
    }
    else if((RTCHOUR==10)&&(RTCMIN==16))
    {
    print("ENTER THE TIME\r\n");
    // __bis_SR_register(CPUOFF | GIE);
    // __disable_interrupt();
    RTC_init();
    sprintf(addr, "TIME = %d:%d:%d DATE = %d / %d / %d\r\n", hours,mins,secs,day,month,year);
    print(addr);
    }
    else
    {
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    Sindhusha、您好!

    您的条件语句不会再次以十六进制表示、与 Bruce 对您帖子的初始响应类似。

    [引用 userid="47378" URL"~/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1167256/msp430fr5994-msp430fr5994/4391005 #4391005"]

    >if (((hour==11)&&(mins==45))

    "小时"和"分钟"来自哪里? 在 BCD 模式中、RTCHOUR 永远不会=11 (0x0B)、而您的 sprintf()建议您不要转换它们。

    我怀疑您的意思是:

    >IF (((hours=0x11)&&(mins=0x45))// BCD 中的11:45?

    [/报价]

    如果 RTC 处于 BCD 模式、请确保使用十六进制。  

    Fullscreen
    1
    if((RTCHOUR==10)&&(RTCMIN==15))
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    应该是:

    Fullscreen
    1
    if((RTCHOUR==0x10)&&(RTCMIN==0x15))
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致、
    Brandon Fisher

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

    您好、Bruce、Brandon。

    非常感谢您的支持。 问题与 RTC 无关。 我发现它是使用 UART 的、现在运行良好。 您能不能告诉我、这种 RTC 的工作时间是12小时制、而不是24小时制。 如果是、您能告诉我如何操作? 我已初始化为 RTCCTL13 = RTCHOLD | RTCMODE |RTCTEV_3;   12小时时钟、但未设置 AM、PM。 可以告诉我。

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

    Sindhusha、您好!

    看一下该器件的 RTC 寄存器、它在硬件中似乎不支持12小时时间格式。

    要在软件中实现此目的,您 可以检查小时值,如果大于12,则从打印出来的时间中减去12小时。  

    此致、
    Brandon Fisher