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开发板的 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:
此致、
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