?? rtc.c
字號(hào):
#include "config.h"
INT8U RTC_Init_OK=0;
/*******************************************************************************************************
** 函數(shù)名稱(chēng): RTC_InitDft
** 函數(shù)功能: 按照默認(rèn)值初始化實(shí)時(shí)時(shí)鐘.RTC被初始化為時(shí)鐘源選擇Fpclk,秒值增加一次后產(chǎn)生中斷
** 入口參數(shù): time: 初始化時(shí)間指針
** 出口參數(shù): 無(wú)
*******************************************************************************************************/
uint8 RTC_InitDft(void)
{
CCR = 0x00; // 禁止時(shí)間計(jì)數(shù)器
PREINT = Fpclk / 32768 - 1; // 設(shè)置基準(zhǔn)時(shí)鐘分頻器,RTC時(shí)鐘使用內(nèi)部時(shí)鐘分頻得到
PREFRAC = Fpclk % 32768;
if(GPS_Fault==0&&(GPS_DATA.Time.Year>0)&&(GPS_DATA.Time.Mon>0)&&(GPS_DATA.Time.Day>0))
{
GPS_DATA.Time.Week=weekdayGet(GPS_DATA.Time.Year,GPS_DATA.Time.Mon,GPS_DATA.Time.Day);
YEAR = GPS_DATA.Time.Year+2000; // 初始化時(shí)間寄存器
MONTH = GPS_DATA.Time.Mon;
DOM = GPS_DATA.Time.Day;
DOW = GPS_DATA.Time.Week;
HOUR = GPS_DATA.Time.Hour;
MIN = GPS_DATA.Time.Min;
SEC = GPS_DATA.Time.Sec;
RTC_Init_OK=2; //GPS時(shí)間
}
CISS &= ~(0x01 << 7); // 必需禁止次秒級(jí)中斷,因?yàn)樵摷拇嫫鞯闹挡皇軓?fù)位影響
AMR |= 0xff; // 必需禁止報(bào)警,因?yàn)樗闹挡皇軓?fù)位影響
CIIR = 0x01; // 設(shè)置秒值的增量產(chǎn)生1次中斷
ILR |= 0x03; // 清除RTC增量中斷標(biāo)志
CCR = 0x01; // 啟動(dòng)RTC,時(shí)鐘源使用Fpclk
return TRUE;
}
uint8 RTC_InitDft2(void)
{
CCR = 0x00; // 禁止時(shí)間計(jì)數(shù)器
/*
if(GPS_Fault==0&&(GPS_DATA.Time.Year>0)&&(GPS_DATA.Time.Mon>0)&&(GPS_DATA.Time.Day>0))
{
GPS_DATA.Time.Week=weekdayGet(GPS_DATA.Time.Year,GPS_DATA.Time.Mon,GPS_DATA.Time.Day);
YEAR = GPS_DATA.Time.Year+2000; // 初始化時(shí)間寄存器
MONTH = GPS_DATA.Time.Mon;
DOM = GPS_DATA.Time.Day;
DOW = GPS_DATA.Time.Week;
HOUR = GPS_DATA.Time.Hour;
MIN = GPS_DATA.Time.Min;
SEC = GPS_DATA.Time.Sec;
RTC_Init_OK=2; //GPS時(shí)間
}
*/
{
uint16 time[7] = {2009, 6, 20, 5, 20, 10, 28};// 用于設(shè)定RTC的初始時(shí)間
YEAR = time[0]; // 初始化時(shí)間寄存器
MONTH = time[1];
DOM = time[2];
DOW = time[3];
HOUR = time[4];
MIN = time[5];
SEC = time[6];
}
INTWAKE = 1 << 15; // 允許RTC喚醒CPU
CIIR = 0; // 由于復(fù)位后改寄存器的值未定,因此必須清零,以免影響其他中斷
CISS = 0; // 必需禁止次秒級(jí)中斷,因?yàn)樵摷拇嫫鞯闹挡皇軓?fù)位影響
AMR = 0xfe; // 只打開(kāi)秒報(bào)警,必需禁止其他報(bào)警,因?yàn)樗闹挡皇軓?fù)位影響
ALSEC = 38; // 設(shè)置秒報(bào)警寄存器的值為38,即每分鐘的第38秒就產(chǎn)生報(bào)警中斷
ILR = 0x03; // 清除RTC增量中斷標(biāo)志
CCR = 0x11; // 啟動(dòng)RTC,時(shí)鐘源使用外部32.768KHz的獨(dú)立晶振
return TRUE;
}
/*******************************************************************************************************
** 函數(shù)名稱(chēng): RtcTimeSnd
** 函數(shù)功能: 時(shí)間更新時(shí),讀取RTC的時(shí)間值
** 入口參數(shù): 無(wú)
** 出口參數(shù): 無(wú)
*******************************************************************************************************/
uint8 RtcTime(RTC_DATETIME * dateTime)
{
uint32 datas;
uint32 times;
uint32 bak;
while (0 == (ILR & 0x01)); // 等待RTC增量中斷
ILR = 0x01; // 清除中斷標(biāo)志
times = CTIME0; // 讀取完整的時(shí)鐘寄存器
datas = CTIME1;
bak = (datas >> 16) & 0xfff; // 獲取 年
dateTime->Time_year = bak;
bak = (datas >> 8) & 0x0f; // 獲取 月
dateTime->Time_month = bak;
bak = datas & 0x1f; // 獲取 日
dateTime->Time_day = bak;
bak = (times >> 24) & 0x07; // 獲取 星期
dateTime->Time_week = bak;
bak = (times >> 16) & 0x1f; // 獲取 小時(shí)
dateTime->Time_hour = bak;
bak = (times >> 8) & 0x3f; // 獲取 分鐘
dateTime->Time_min = bak;
bak = times & 0x3f; // 獲取 秒鐘
dateTime->Time_sec = bak;
return TRUE;
}
/****************************************************************************
* 名稱(chēng):WDTinit()
* 功能:
* 入口參數(shù):
*
* 出口參數(shù):無(wú)
* 說(shuō)明:
* 注意:
****************************************************************************/
void WDTinit(void)
{
WDTC = 0xff000000;//0xff000000
WDMOD = 0x03;
WdtFeed();
}
void WdtFeed(void)
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng): uint8 T1MAT_Init
** 功能描述: 定時(shí)器0匹配模式初始化
** 入口參數(shù): time 匹配時(shí)間,該值會(huì)直接寫(xiě)入到匹配寄存器中
** PR_data 預(yù)分頻寄存器的值
** T_MODE 匹配控制模式
** 0:匹配時(shí),定時(shí)器復(fù)位
** 1:匹配時(shí),定時(shí)器停止
** EXT_MODE 匹配時(shí),外部輸出控制
** 0:不執(zhí)行任何動(dòng)作
** 1:外部匹配輸出0
** 2:外部匹配輸出1
** 3:外部匹配輸出翻轉(zhuǎn)
** MATn 匹配通道選擇,0~3
** Int_En 中斷使能
** 0:發(fā)生匹配事件時(shí),不產(chǎn)生中斷
** 1:發(fā)生匹配事件時(shí),產(chǎn)生中斷
** 出口參數(shù): 0 :初始化失敗
** 1 :初始化成功
**調(diào)試說(shuō)明: 調(diào)用前,要設(shè)置相關(guān)的引腳
********************************************************************************************************/
uint8 T1MAT_Init(uint32 time, uint32 PR_data, uint8 T_MODE, uint8 EXT_MODE, uint8 MATn, uint8 Int_En)
{
if ((T_MODE > 1) || (EXT_MODE > 3) || (MATn > 3) || (Int_En > 1))
{
return (0); // 參數(shù)不合理,直接返回
}
T1TCR = 0x03; // 在設(shè)置之前,先將定時(shí)器復(fù)位
T1IR = T1IR | (1 << MATn); // 清除中斷標(biāo)志位
T1PR = PR_data; // 設(shè)置預(yù)分頻器
/* 設(shè)置匹配寄存器 */
switch (MATn)
{
case 0:
T1MR0 = time;
break;
case 1:
T1MR1 = time;
break;
case 2:
T1MR2 = time;
break;
case 3:
T1MR3 = time;
break;
default:
break;
}
T1MCR = T1MCR & (~(7 << (MATn * 3))) | (1 << (MATn * 3 + 1 + T_MODE)) | (Int_En << (MATn * 3));
T1EMR = T1EMR & (~(3 << (MATn * 2 + 4))) | (EXT_MODE << (MATn * 2 + 4));
T1TCR = 0x01; // 重新啟動(dòng)定時(shí)器
return (1);
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :IRQ_EINT0
** 函數(shù)功能 :外部中斷0中斷服務(wù)程序,取反蜂鳴器控制口。
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
**********************************************************************************************************/
void IRQ_EINT0(void)
{
//
EXTINT = (1 << 0); // 清外部中斷0中斷標(biāo)志
VICVectAddr = 0x00; // 通知VIC中斷處理結(jié)束
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :Init_Eint
** 函數(shù)功能 :外部中實(shí)驗(yàn)
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
**********************************************************************************************************/
void Init_Eint(void)
{
PINSEL4 = 0x00100000; // P2.10連接EINT0
EXTMODE = 0x01; //0x00 電平觸發(fā)方式,EXTMODE = 0x01;為邊沿觸發(fā)方式
EXTPOLAR = 0x00; //低電平觸發(fā)// 下降沿觸發(fā)
SetVICIRQ (14, 2, (uint32)IRQ_EINT0);
//VICIntSelect = 0x00; // 所有中斷通道設(shè)置為IRQ中斷
//VICVectPri14 = 00; // 設(shè)置外部中斷0中斷最高優(yōu)先級(jí)
//VICVectAddr14 = (uint32)IRQ_EINT0; // 設(shè)置中斷服務(wù)程序地址
EXTINT = (1 << 0); // 清外部中斷0中斷標(biāo)志
//VICIntEnable = 1 << 14; // 使能EINT0中斷
INTWAKE |= (1 << 0); // 外部中斷0可喚醒芯片
}
#define KEYPin (1 << 23) // P0.23為P0口中斷輸入腳
//#define KEYPin (1 << 1) // P2.1為P2口中斷輸入腳
#define GPIOWAKE (1 << 7) // 使能GPIO腳掉電喚醒位
/*******************************************************************************************
** 函數(shù)名稱(chēng) :IRQ_Eint3
** 函數(shù)功能 :GPIO中斷服務(wù)程序
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
*******************************************************************************************/
void IRQ_Eint3(void)
{
IO2IntClr = KEYPin; // 清零P2.1中斷
VICVectAddr = 0; // 向量中斷結(jié)束
//IO2IntStatF=0;
}
/*********************************************************************************************************
** 函數(shù)名稱(chēng) :Init_Eint3
** 函數(shù)功能 :外部中實(shí)驗(yàn)
** 入口參數(shù) :無(wú)
** 出口參數(shù) :無(wú)
**********************************************************************************************************/
void Init_Eint3(void)
{
//IO_INT_STAT=0;
//IO2IntStatF=0;
IO_INT_STAT= ( (1<<2 ) ); //打開(kāi)P0,P2的GPIO INT STATUS //IOIntStatus
IO2IntStatF|=KEYPin; //下降沿觸發(fā)
IO2IntEnF |= KEYPin; // 設(shè)置P2.1為下降沿中斷
/* 初始化中斷向量 */
SetVICIRQ (17, 1, (uint32)IRQ_Eint3);
//VICIntSelect = 0x00000000; // 設(shè)置所有中斷分配為IRQ中斷
//VICVectPri17 = 1; // 分配外部中斷3為優(yōu)先級(jí)1中斷
//VICVectAddr17 = (uint32)IRQ_Eint3; // 設(shè)置中斷服務(wù)程序地址
IO2IntClr = KEYPin; // 清零P2.1中斷
//VICIntEnable = 1 << 17; // 使能EINT3中斷
INTWAKE |= GPIOWAKE; // GPIO中斷喚醒芯片
}
void IRQ_Eint3_P0_24(void)
{
IO0IntClr = KEYPin; // 清零P2.1中斷
VICVectAddr = 0; // 向量中斷結(jié)束
//IO0IntStatF=0;
}
void Init_Eint3_P0_24(void)
{
//IO_INT_STAT=0;
//IO2IntStatF=0;
IO_INT_STAT= ( ( 1<<0 ) ); //打開(kāi)P0,P2的GPIO INT STATUS //IOIntStatus
IO0IntStatF|=KEYPin; //下降沿觸發(fā)
IO0IntEnF |= KEYPin; // 設(shè)置P2.1為下降沿中斷
/* 初始化中斷向量 */
SetVICIRQ (17, 1, (uint32)IRQ_Eint3_P0_24);
//VICIntSelect = 0x00000000; // 設(shè)置所有中斷分配為IRQ中斷
//VICVectPri17 = 1; // 分配外部中斷3為優(yōu)先級(jí)1中斷
//VICVectAddr17 = (uint32)IRQ_Eint3; // 設(shè)置中斷服務(wù)程序地址
IO0IntClr = KEYPin; // 清零P2.1中斷
//VICIntEnable = 1 << 17; // 使能EINT3中斷
INTWAKE |= GPIOWAKE; // GPIO中斷喚醒芯片
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -