📄 time.c
字号:
/*
* File: time.c
* Purpose: Real time clock function and interrupt handler
* Author: Peter Ivanov, Olimex Ltd.
* Modified by:
* Created: 2007-05-19 11:29:32
* Last modify: 2007-10-03 21:20:56 ivanovp {Time-stamp}
* Copyright: (C) Peter Ivanov, Olimex Ltd., 2007
* Licence: GPL
*/
/**
* \file time.c
* \brief Real time clock function and interrupt handler
* \author Peter Ivanov, Olimex Ltd.
*/
#include <msp430xG461x.h>
#include <signal.h>
#include "time.h"
#include "diskio.h"
volatile uint32_t jiffies = 0; // counts milliseconds
/**
* You shouldn't use this function because it is automatically called by TIME_init().
*
* @see TIME_init()
*/
void RTC_init (void)
{
// Real-Time Clock Control Register -> ACLK, Counter Mode, 32bit overflow, enable interupt
//RTCCTL = RTCTEV0 + RTCIE;
// Enable Timer Interupt (RTC in counter mode is like Timer)
//IFG2 = BTIE;
// 32768
//RTCNT1 = 0x00;
//RTCNT2 = 0x80;
// Real-Time Clock Control Register -> ACLK, Calendar Mode, enable interupt
RTCCTL = RTCMODE_3 | RTCTEV_0 | RTCIE | RTCHOLD;
RTCYEARH = TIME_DEFAULT_YEAR >> 8;
RTCYEARL = TIME_DEFAULT_YEAR & 0xFF;
RTCMON = TIME_DEFAULT_MONTH;
RTCDAY = TIME_DEFAULT_DAY;
RTCHOUR = TIME_DEFAULT_HOUR;
RTCMIN = TIME_DEFAULT_MIN;
RTCSEC = TIME_DEFAULT_SEC;
RTCCTL &= ~RTCHOLD;
}
#define DISK_TIMERPROC_CNT 10 ///< FAT FS's function disk_timeproc() called in every millisecond @ 8 MHz
/**
* @fn watchdog_isr
* Watchdog timer interrupt. Watchdog interrupt is called in every millisecond @
* 8 MHz.
*/
interrupt (WDT_VECTOR) wakeup watchdog_isr (void)
{
static uint8_t cnt = DISK_TIMERPROC_CNT;
jiffies++;
cnt--;
if (cnt == 0)
{
cnt = DISK_TIMERPROC_CNT;
// call every 10 milliseconds @ 8 MHz
disk_timerproc ();
}
//LPM3_EXIT;
}
void TIME_init ()
{
RTC_init ();
//FLL_CTL0 |= XCAP18PF; // Set load cap for 32k xtal
// WDT interrupt in every 0.5 ms @ 1 MHz -> 0.625 us @ 8 MHz
//WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTIS1;
// WDT interrupt in every 8 ms @ 1 MHz -> 1 ms @ 8 MHz
WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTIS0;
IE1 |= WDTIE;
// Interrupt enable
_EINT ();
}
void TIME_getDate (TIME_date_t *const date)
{
//RTCCTL |= RTCHOLD;
date->year = RTCYEARH << 8 | RTCYEARL;
date->month = RTCMON;
date->day = RTCDAY;
date->hour = RTCHOUR;
date->min = RTCMIN;
date->sec = RTCSEC;
//RTCCTL &= ~RTCHOLD;
}
void TIME_setDate (const TIME_date_t *date)
{
RTCCTL |= RTCHOLD;
RTCYEARH = date->year >> 8;
RTCYEARL = date->year & 0xFF;
RTCMON = date->month;
RTCDAY = date->day;
RTCHOUR = date->hour;
RTCMIN = date->min;
RTCSEC = date->sec;
RTCCTL &= ~RTCHOLD;
}
void mdelay (uint32_t milliseconds)
{
uint32_t j = jiffies;
while (jiffies - j < milliseconds);
}
void delay (uint32_t seconds)
{
uint32_t j = jiffies;
uint32_t ms = seconds * 1000;
while (jiffies - j < ms);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -