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**** 2378650 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 条件、但输出仍然没有变化。 有人能告诉我我哪里失踪了吗? 我将共享下面的代码。

    

#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
    CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO
    CSCTL3 = DIVA_1|DIVS__1|DIVM__1;
    CSCTL0_H = 0;
}

void RTC_clk_setup()
{
    /* P1DIR |= BIT0;
    P1OUT &= ~BIT0;// Set P1.0 as output*/
    PJSEL0 = BIT4 | BIT5; // Initialize LFXT pins
    // Disable the GPIO power-on default high-impedance mode to activate
    // previously configured port settings
    PM5CTL0 &= ~LOCKLPM5;
    
    // Configure LFXT 32kHz crystal
    CSCTL0_H = CSKEY_H; // Unlock CS registers
    CSCTL4 &= ~LFXTOFF; // Enable LFXT
    do
    {
        CSCTL5 &= ~LFXTOFFG; // Clear LFXT fault flag
        SFRIFG1 &= ~OFIFG;
    } while (SFRIFG1 & OFIFG); // Test oscillator fault flag
    CSCTL0_H = 0; // Lock CS registers*/
}



void uart_config()
{
    P2SEL0 &= ~(BIT0 | BIT1);
    P2SEL1 |= (BIT0 | BIT1); 
    PM5CTL0 &= ~LOCKLPM5;
    UCA0CTLW0=UCSWRST;
    UCA0CTLW0 |=UCSSEL__SMCLK;
    UCA0BRW = 52;
    UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x49;
    UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
    UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}

void print(unsigned char *str)
{
    strcpy(Data, str);
    size = strlen(Data);
    Tx_index=0;
    UCA0IE |= UCTXIE | UCTXCPTIE;
    UCA0TXBUF=Data[Tx_index];
    Tx_index++;
    __bis_SR_register(LPM0_bits|GIE);
}

void RTC_init()
{
    RTC_clk_setup();
    RTCCTL0_H = RTCKEY_H; // Unlock RTC
    RTCCTL0_L = RTCTEVIE_L | RTCRDYIE_L; // enable RTC read ready interrupt
    // enable RTC time event interrupt
    RTCCTL13 = RTCBCD | RTCHOLD | RTCMODE; // RTC enable, BCD mode, RTC hold
    RTCYEAR = 0x2022; // Year = 0x2022
    RTCMON = 0x11; // Month = 0x10 = nov
    RTCDAY = 0x02; // Day = 0x26 = 26th
    RTCDOW = 0x03; // Day of week = 0x04 = thurs
    RTCHOUR = 0x11; // Hour = 0x23
    RTCMIN = 0x44; // Minute = 0x00
    RTCSEC = 0x00; // Seconds = 0x00
    RTCCTL13 &= ~(RTCHOLD); // Start RTC
    __bis_SR_register(GIE); // Enter LPM3 mode w/ interrupts enabled
    __no_operation();
    return 0;
}



int main(void)
{
    WDTCTL = WDTPW | WDTHOLD; // Stop Watchdog Timer
    clk_setp();
    uart_config();
    RTC_init();
    pin_setup();
    while(1)
    {
        if((hours==11)&&(mins==45))
        {
            P1OUT |= 0x01;
            __delay_cycles((8000000)*60);
            P1OUT &= ~0x01;
        }
        else if((hours==11)&&(mins==47))
        {
            P1OUT |= 0x02;
            __delay_cycles((8000000)*60);
            P1OUT &= ~0x02;
        }
        else
        {
            sprintf(addr, "TIME = %x:%x:%x DATE=%x-%x-%x\r\n", hours,mins,secs,day,month,year);
            print(addr);
            __delay_cycles(8000000);
        }   


}

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

    >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 的时间。也就是说、我必须在终端中给出值、以便这些值应该存储在这些变量中。  我编写了我在这里共享的代码。 我无法找到我遗漏的位置、因此您能帮我从终端写入数据吗?

    #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;
            CSCTL1 = DCOFSEL_6; //8MHz |DCOFSEL_0 -1MHz
            CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK; // Set SMCLK = MCLK = DCO
            CSCTL3 = DIVA_1|DIVS__1|DIVM__1;
            CSCTL0_H = 0;
        }
        
        void RTC_clk_setup()
        {
        /* P1DIR |= BIT0;
        P1OUT &= ~BIT0;// Set P1.0 as output*/
        PJSEL0 = BIT4 | BIT5; // Initialize LFXT pins
        // Disable the GPIO power-on default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
        
        // Configure LFXT 32kHz crystal
        CSCTL0_H = CSKEY_H; // Unlock CS registers
        CSCTL4 &= ~LFXTOFF; // Enable LFXT
        do
        {
            CSCTL5 &= ~LFXTOFFG; // Clear LFXT fault flag
            SFRIFG1 &= ~OFIFG;
        } while (SFRIFG1 & OFIFG); // Test oscillator fault flag
        CSCTL0_H = 0; // Lock CS registers*/
    }
    
    
    
    void uart_config()
    {
        P2SEL0 &= ~(BIT0 | BIT1);
        P2SEL1 |= (BIT0 | BIT1); // USCI_A0 UART operation
        PM5CTL0 &= ~LOCKLPM5;
        UCA0CTLW0=UCSWRST;
        UCA0CTLW0 |=UCSSEL__SMCLK;
        UCA0BRW = 52;
        UCA0MCTLW |= UCOS16 | UCBRF_1 | 0x49;
        UCA0CTLW0 &= ~UCSWRST; // Initialize eUSCI
        UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
    }
    
    void print(unsigned char *str)
    {
        strcpy(Data, str);
        size = strlen(Data);
        Tx_index=0;
        UCA0IE |= UCTXIE | UCTXCPTIE;
        UCA0TXBUF=Data[Tx_index];
        Tx_index++;
        __bis_SR_register(LPM0_bits|GIE);
    }
    
    
    void RTC_init()
    {
        print("SET TIME\r\n");
        RTC_clk_setup();
        RTCCTL0_H = RTCKEY_H; // Unlock RTC
        RTCCTL0_L = RTCTEVIE_L | RTCRDYIE_L; // enable RTC read ready interrupt
        // enable RTC time event interrupt
        RTCCTL13 = RTCBCD | RTCHOLD | RTCMODE; // RTC enable, BCD mode, RTC hold
    
    
        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
    
    
        RTCCTL13 &= ~(RTCHOLD); // Start RTC
        __bis_SR_register(GIE); // Enter LPM3 mode w/ interrupts enabled
        __no_operation();
        return 0;
    }
    
    
    
    int main(void)
    
    {
        WDTCTL = WDTPW | WDTHOLD; // Stop Watchdog Timer
        clk_setp();
        uart_config();
        RTC_init();
        pin_setup();
        while(1)
        {
            sprintf(addr, "%x:%x:%x\r\n", hours,mins,secs);
            print(addr);
        
            __delay_cycles(8000000);
        }
    }
    
    
    
    
    
    ////////////////////////////////////////////////////////////////////////////////      rtc.h      /////////////////////////////////////////////////////////////////////////////////////////
    
    #include <msp430.h>
    #include <stdint.h>
    #include <stdbool.h>
    
    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]="";
    unsigned char time_1[]="11:45:00";
    unsigned char time_2[]="11:47:00";
    unsigned int hr=11;
    unsigned int min1=45;
    unsigned int min2=47;
    int secs=0;
    int hours=0;
    int mins=0;
    int day=0;
    int month=0;
    int year=0;
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=RTC_C_VECTOR
    __interrupt void RTC_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(RTC_C_VECTOR))) RTC_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(RTCIV, RTCIV__RT1PSIFG))
        {
        case RTCIV__NONE: break; // No interrupts
        case RTCIV__RTCOFIFG: break; // RTCOFIFG
        case RTCIV__RTCRDYIFG: // RTCRDYIFG
            P1OUT ^= 0x01;// Toggles P1.0 every second
            hours=RTCHOUR;
            mins=RTCMIN;
            secs=RTCSEC;
            break;
        case RTCIV__RTCTEVIFG: // RTCEVIFG
            __no_operation(); // Interrupts every minute - SET BREAKPOINT HERE
            break;
        case RTCIV__RTCAIFG: break; // RTCAIFG
        case RTCIV__RT0PSIFG: break; // RT0PSIFG
        case RTCIV__RT1PSIFG: break; // RT1PSIFG
        default: break;
        }
    }
    
    
    
    
    #pragma vector = EUSCI_A0_VECTOR
    __interrupt void USCI_A0_ISR(void)
    {
        switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
        {
        case USCI_NONE: break;
        case USCI_UART_UCRXIFG:
            Rx_key=0;
            RXData[Rx_index]=UCA0RXBUF;
            if((RXData[Rx_index] == '\x0d'/*'\r'*/) || (RXData[Rx_index] == '\n')||(RXData[Rx_index] == '\r'))
            {
                __bic_SR_register_on_exit(CPUOFF|GIE);
                UCA0IE &= ~UCRXIE;
                Rx_index=0;
                Rx_key=0;
                break;
            }
            Rx_index++;
            break;
        case USCI_UART_UCTXIFG:
            if(Tx_key==1)
            {
                if(Tx_index>size)
                {
                    __bic_SR_register_on_exit(CPUOFF|GIE);
                    UCA0IE &= ~UCTXIE;
                    UCA0IE &= ~UCTXCPTIE;
                    Tx_key=0;
                    break;
                }
                UCA0TXBUF = Data[Tx_index];
                Tx_index++;
                Tx_key=0;
            }
            break;
        case USCI_UART_UCSTTIFG: break;
        case USCI_UART_UCTXCPTIFG:
            Tx_key=1;
            UCA0IFG|=UCTXIFG;
            break;
        default: break;
        }
    }

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

    Sindhusha、您好!

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

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

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

    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

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

    查看此示例、了解它们如何处理在主 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 部分停止。 因此、请帮助我解决这个问题。   

     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;

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

    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 上的"播放"按钮以在调试模式下进入输入时、它将获得一些垃圾输出、并在我退出调试后停止。因此、请解决我的问题。

    ///////////////////   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);
        Tx_index=0;
        UCA0IE |= UCTXIE | UCTXCPTIE;
        UCA0TXBUF=Data[Tx_index];
        Tx_index++;
        __bis_SR_register(LPM0_bits|GIE);
    }
    
    
    char* RXdata()
      {
          int i=0;
          UCA0IE |= UCRXIE;
          __bis_SR_register(LPM0_bits | GIE);
          strcpy(receive_data,RXData);
          printf("receive_data=%s\n",receive_data);
          return receive_data;
      }
    
    
    
    void RTC_init()
    {
           RTC_clk_setup();
           RTCCTL0_H = RTCKEY_H;                   // Unlock RTC
           RTCCTL0_L = RTCTEVIE_L | RTCRDYIE_L;    // enable RTC read ready interrupt
                                                   // enable RTC time event interrupt
           RTCCTL13 = RTCBCD | RTCHOLD | RTCMODE;  // RTC enable, BCD mode, RTC hold
         
    
           hr=RXdata();
    
           printf("hr=%s\r\n",hr);
           char * token1 = strtok(hr, " ");
           printf("token1 = %s\r\n",token1);
           int hrs=atoi(token1);
           printf("hrs = %d\r\n",hrs);
           RTCHOUR =hrs;
    
    
       
           char * token2 = strtok(NULL, " ");
           printf("token2 = %s\r\n",token2);
           int min=atoi(token2);
           printf("min = %d\r\n",min);
           RTCMIN=min;
          
    
    
           char * token3 = strtok(NULL, " ");
           printf("token3 = %s\r\n",token3);
           int sec=atoi(token3);
           printf("sec = %d\r\n",sec);
           RTCSEC =sec;
    
    
           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;
    }
    
    
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;               // Stop Watchdog Timer
        clk_setp();
        uart_config();
        RTC_init();
    
        while(1)
        {
            sprintf(addr, "TIME = %x:%x:%x\r\n", hours,mins,secs);
            print(addr);
            __delay_cycles(8000000);
        }
    
    }
    
    
    /////////////////  rtc.h ////////////////////////
    
    #include <msp430.h>
    #include <stdint.h>
    #include <stdbool.h>
    
    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[50]="";
    int secs=0;
    int hours=0;
    int mins=0;
    int day=0;
    int month=0;
    int year=0;
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=RTC_C_VECTOR
    __interrupt void RTC_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(RTC_C_VECTOR))) RTC_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(RTCIV, RTCIV__RT1PSIFG))
        {
            case RTCIV__NONE:      break;       // No interrupts
            case RTCIV__RTCOFIFG:  break;       // RTCOFIFG
            case RTCIV__RTCRDYIFG:              // RTCRDYIFG
                P1OUT ^= 0x01;// Toggles P1.0 every second
                hours=RTCHOUR;
                mins=RTCMIN;
                secs=RTCSEC;
                /*day=RTCDAY;
                month=RTCMON;
                year=RTCYEAR;*/
                break;
            case RTCIV__RTCTEVIFG:              // RTCEVIFG
                __no_operation();               // Interrupts every minute - SET BREAKPOINT HERE
                break;
            case RTCIV__RTCAIFG:   break;       // RTCAIFG
            case RTCIV__RT0PSIFG:  break;       // RT0PSIFG
            case RTCIV__RT1PSIFG:  break;       // RT1PSIFG
            default: break;
        }
    }
    
    
    
    
    #pragma vector = EUSCI_A0_VECTOR
    __interrupt void USCI_A0_ISR(void)
    {
        switch(__even_in_range(UCA0IV, USCI_UART_UCTXCPTIFG))
        {
            case USCI_NONE: break;
            case USCI_UART_UCRXIFG:
                Rx_key=0;
                RXData[Rx_index]=UCA0RXBUF;
                if((RXData[Rx_index] == '\x0d'/*'\r'*/) || (RXData[Rx_index] ==  '\n')||(RXData[Rx_index] == '\r'))
                {
                    __bic_SR_register_on_exit(CPUOFF|GIE);
                    UCA0IE &= ~UCRXIE;
                    Rx_index=0;
                    Rx_key=0;
                    break;
                }
                Rx_index++;
                break;
            case USCI_UART_UCTXIFG:
                if(Tx_key==1)
                {
                    if(Tx_index>size)
                    {
                        __bic_SR_register_on_exit(CPUOFF|GIE);
                        UCA0IE &= ~UCTXIE;
                        UCA0IE &= ~UCTXCPTIE;
                        Tx_key=0;
                        break;
                    }
                    UCA0TXBUF = Data[Tx_index];
                    Tx_index++;
                    Tx_key=0;
                }
                break;
            case USCI_UART_UCSTTIFG: break;
            case USCI_UART_UCTXCPTIFG:
                Tx_key=1;
                UCA0IFG|=UCTXIFG;
                break;
            default: break;
        }
    }
    
    
      

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

    >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 输入输入、则会停止运行。 我想在不使用复位按钮的情况下获得输出。我在这里共享代码块、请提供帮助。

      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
                                 {
                                sprintf(addr, "TIME = %d:%d:%d   DATE = %d / %d / %d\r\n", hours,mins,secs,day,month,year);
                                print(addr);
                                 }
                             __delay_cycles(8000000);
                }
    

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

    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 模式、请确保使用十六进制。  

                 if((RTCHOUR==10)&&(RTCMIN==15))

    应该是:

                 if((RTCHOUR==0x10)&&(RTCMIN==0x15))

    此致、
    Brandon Fisher

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

    您好、Bruce、Brandon。

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

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

    Sindhusha、您好!

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

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

    此致、
    Brandon Fisher