主题中讨论的其他器件: 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;
}