⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 time.c

📁 MSP acquires data and sends through USB to PC. Check the link for PC capture software and project d
💻 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 + -