主题中讨论的其他器件: MSP430FG4618
大家好、
我正在尝试运行下面的程序、但 RTC 运行不好:
您能告诉我并告诉我我我我是否出错了吗?
此致、
Anderson。
//****************************************************************************// // Definições e Inicialização do RTC Interno do MSP430 do Data Logger // //****************************************************************************// void initRTC(void) { // Configura o Relógio de Tempo Real RTC RTCCTL01 = RTCMODE + RTCBCD + RTCHOLD + RTCTEV_3; RTCCTL01 |= RTCRDYIE + RTCTEVIE; // Enable interrupt RTCPS0CTL = RT0PSDIV_7; // Set RTPS0 to /256 RTCPS1CTL = RT1IP_6 + RT1PSIE + RT1SSEL_3; // Set RT1IP to /4, enable // RT1PS interrupt and select // RTOPS output as clock // Desabilita a Interrupção de Alarme RTCCTL0 &= ~RTCAIE; // disable alarm interrupt RTCCTL0 &= ~RTCAIFG; // clear alarm interrupt flag // Rotinas para Inicialização dos Registradores do RTC RTCSEC = 0x00; // Carrega com Zero o Registrador do RTCSEC RTCMIN = 0x00; // Carrega com Zero o Registrador do RTCMIN RTCHOUR = 0x00; // Carrega com Zero o Registrador do RTCHOUR RTCDOW = 0x01; // Carrega a Semana RTCDAY = 0x01; // Carrega o Dia 01 RTCMON = 0x01; // Carrega o Mes 01 RTCYEAR = 0x2020; // Carrega o Ano 2020 // Programação do Inicio e Término das Coletas de Dados Inic_Dia_Logger = 0x01; Inic_Mes_Logger = 0x01; Inic_Ano_Logger = 0x20; Inic_Hou_Logger = 0x00; Inic_Min_Logger = 0x00; Inic_Seg_Logger = 0x00; Term_Dia_Logger = 0x01; Term_Mes_Logger = 0x01; Term_Ano_Logger = 0x20; Term_Hou_Logger = 0x00; Term_Min_Logger = 0x00; Term_Seg_Logger = 0x00; // Programação do Inicio e Término das Transmissões de Dados Inic_Dia_Lora = 0x01; Inic_Mes_Lora = 0x01; Inic_Ano_Lora = 0x20; Inic_Hou_Lora = 0x00; Inic_Min_Lora = 0x00; Inic_Seg_Lora = 0x00; Term_Dia_Lora = 0x01; Term_Mes_Lora = 0x01; Term_Ano_Lora = 0x20; Term_Hou_Lora = 0x00; Term_Min_Lora = 0x00; Term_Seg_Lora = 0x00; } //****************************************************************************// // Rotina Principal do Data Logger // //****************************************************************************// void main(void) { volatile unsigned int j; // Variável de Inicialização da Frequencia do Cristal Oscilador WDTCTL = WDTPW + WDTHOLD; // Desabilita o WDT P5SEL |= BIT4+BIT5; // Port select XT1 UCSCTL6 &= ~(XT1OFF); // XT1 On UCSCTL6 |= XCAP_3; // Internal load cap // Loop until XT1 fault flag is cleared do { UCSCTL7 &= ~XT1LFOFFG; // Clear XT1 fault flags }while (UCSCTL7&XT1LFOFFG); // Test XT1 fault flag // Initialize DCO to 1.998MHz __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_3; // Set RSELx for DCO = 4.9 MHz UCSCTL2 = FLLD_1 + 60; // Set DCO Multiplier for 1.998MHz // (N + 1) * FLLRef = Fdco // (60 + 1) * 32768 = 1.998MHz // Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop // Loop until XT1,XT2 & DCO fault flag is cleared do { UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG); // Clear XT2,XT1,DCO fault flags SFRIFG1 &= ~OFIFG; // Clear fault flags }while (SFRIFG1&OFIFG); // Test oscillator fault flag ..... // Habilita os Periféricos RTC e BT RTCCTL01 &= ~RTCHOLD; // Habilita o RTC // Rotina Principal do Loop do { __bis_SR_register(LPM3_bits + GIE); // Entra em LPM3 (Modo de Baixo Consumo) __no_operation (); // Não Faz Nada } while (1); // Enquanto While Igual a 1, Garante o LPM3 } //****************************************************************************// // Rotina de Tratamento das Coletas de Dados via Memória Interna do Data Logger // //****************************************************************************// #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=RTC_VECTOR __interrupt #elif defined(__GNUC__) __attribute__((interrupt(RTC_VECTOR))) #endif void RTC_A_ISR (void) { switch (__even_in_range(RTCIV,16)) { case 0: break; //Sem interrupção case 2: //RTCRDYIFG //Interrupção a cada segundo Temporiza_RTC = Temporiza_RTC + 1; break; case 4: //RTCEVIFG //Interrupção a cada minuto break; case 6: //RTCAIFG //Interrupts 5:00pm on 5th day of week break; case 8: break; //RT0PSIFG case 10: break; //RT1PSIFG case 12: break; //Reserved case 14: break; //Reserved case 16: break; //Reserved default: break; }