예제 #1
0
void SetRtc(Rtc_t *pRtcData)
{
  // Stop the RTC
  RTCCTL01 |= RTCHOLD;    

  // These calls are to asm level patch functions provided by TI for the MSP430F5438
  unsigned int Year = (pRtcData->YearMsb << 8) + pRtcData->YearLsb;
  PrintF(">SetRtc Year: %d", Year);
  RtcYear = (ToBCD(Year / 100) << 8) + ToBCD(Year % 100);
  PrintF(" %04X", RtcYear);
  
  RtcMon = ToBCD(pRtcData->Month);
  RtcDay = ToBCD(pRtcData->Day);
  RtcDow = ToBCD(pRtcData->DayOfWeek);
  RtcHour = ToBCD(pRtcData->Hour);
  RtcMin = ToBCD(pRtcData->Minute);
  RtcSec = ToBCD(pRtcData->Second);

  RestoreRtc();
  
  // Enable the RTC
  RTCCTL01 &= ~RTCHOLD;

  EnableTimeStamp();
}
예제 #2
0
void InitRealTimeClock(void)
{
  RtcInUseMask = 0;
  
  // stop it
  RTCCTL01 = RTCHOLD;

  // use calibration data to adjust real time clock frequency
  if (ValidCalibration())
  {
    signed char RtcCalibrationValue = GetRtcCalibrationValue();
    
    if (RtcCalibrationValue < 0)
    {
      RtcCalibrationValue = -RtcCalibrationValue;
      RTCCTL2 = RtcCalibrationValue & RTCCAL_VALUE_MASK;
    }
    else
    {
      RTCCTL2 = RtcCalibrationValue & RTCCAL_VALUE_MASK;
      /* adjust up */
      RTCCTL2 |= RTCCALS;
    }
  }
  
  // Set RTC mode and BCD format
  RTCCTL01 |= RTCMODE | RTCBCD;

  // set 128 Hz rate for prescale 0 interrupt
  RTCPS0CTL |= RT0IP_7;

  // enable 1 pulse per second interrupt using prescale 1
  RTCPS1CTL |= RT1IP_6 | RT1PSIE;

  // 1 Hz calibration output
  RTCCTL23 |= RTCCALF_3;

  // setting the peripheral selection bit makes the other I/O control a don't care
  // P2.4 = 1 Hz RTC calibration output
  // Direction needs to be set as output
  RTC_1HZ_PORT_SEL |= RTC_1HZ_BIT;  
  RTC_1HZ_PORT_DIR |= RTC_1HZ_BIT;

  RestoreRtc();

  // Enable the RTC
  RTCCTL01 &= ~RTCHOLD;  
}