📄 rtc.c
字号:
#include "config.h"
INT8U RTC_Init_OK=0;
/*******************************************************************************************************
** 函数名称: RTC_InitDft
** 函数功能: 按照默认值初始化实时时钟.RTC被初始化为时钟源选择Fpclk,秒值增加一次后产生中断
** 入口参数: time: 初始化时间指针
** 出口参数: 无
*******************************************************************************************************/
uint8 RTC_InitDft(void)
{
CCR = 0x00; // 禁止时间计数器
PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器,RTC时钟使用内部时钟分频得到
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; // 初始化时间寄存器
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时间
}
CISS &= ~(0x01 << 7); // 必需禁止次秒级中断,因为该寄存器的值不受复位影响
AMR |= 0xff; // 必需禁止报警,因为它的值不受复位影响
CIIR = 0x01; // 设置秒值的增量产生1次中断
ILR |= 0x03; // 清除RTC增量中断标志
CCR = 0x01; // 启动RTC,时钟源使用Fpclk
return TRUE;
}
uint8 RTC_InitDft2(void)
{
CCR = 0x00; // 禁止时间计数器
/*
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; // 初始化时间寄存器
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时间
}
*/
{
uint16 time[7] = {2009, 6, 20, 5, 20, 10, 28};// 用于设定RTC的初始时间
YEAR = time[0]; // 初始化时间寄存器
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; // 由于复位后改寄存器的值未定,因此必须清零,以免影响其他中断
CISS = 0; // 必需禁止次秒级中断,因为该寄存器的值不受复位影响
AMR = 0xfe; // 只打开秒报警,必需禁止其他报警,因为它的值不受复位影响
ALSEC = 38; // 设置秒报警寄存器的值为38,即每分钟的第38秒就产生报警中断
ILR = 0x03; // 清除RTC增量中断标志
CCR = 0x11; // 启动RTC,时钟源使用外部32.768KHz的独立晶振
return TRUE;
}
/*******************************************************************************************************
** 函数名称: RtcTimeSnd
** 函数功能: 时间更新时,读取RTC的时间值
** 入口参数: 无
** 出口参数: 无
*******************************************************************************************************/
uint8 RtcTime(RTC_DATETIME * dateTime)
{
uint32 datas;
uint32 times;
uint32 bak;
while (0 == (ILR & 0x01)); // 等待RTC增量中断
ILR = 0x01; // 清除中断标志
times = CTIME0; // 读取完整的时钟寄存器
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; // 获取 小时
dateTime->Time_hour = bak;
bak = (times >> 8) & 0x3f; // 获取 分钟
dateTime->Time_min = bak;
bak = times & 0x3f; // 获取 秒钟
dateTime->Time_sec = bak;
return TRUE;
}
/****************************************************************************
* 名称:WDTinit()
* 功能:
* 入口参数:
*
* 出口参数:无
* 说明:
* 注意:
****************************************************************************/
void WDTinit(void)
{
WDTC = 0xff000000;//0xff000000
WDMOD = 0x03;
WdtFeed();
}
void WdtFeed(void)
{
WDFEED = 0xAA;
WDFEED = 0x55;
}
/*********************************************************************************************************
** 函数名称: uint8 T1MAT_Init
** 功能描述: 定时器0匹配模式初始化
** 入口参数: time 匹配时间,该值会直接写入到匹配寄存器中
** PR_data 预分频寄存器的值
** T_MODE 匹配控制模式
** 0:匹配时,定时器复位
** 1:匹配时,定时器停止
** EXT_MODE 匹配时,外部输出控制
** 0:不执行任何动作
** 1:外部匹配输出0
** 2:外部匹配输出1
** 3:外部匹配输出翻转
** MATn 匹配通道选择,0~3
** Int_En 中断使能
** 0:发生匹配事件时,不产生中断
** 1:发生匹配事件时,产生中断
** 出口参数: 0 :初始化失败
** 1 :初始化成功
**调试说明: 调用前,要设置相关的引脚
********************************************************************************************************/
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); // 参数不合理,直接返回
}
T1TCR = 0x03; // 在设置之前,先将定时器复位
T1IR = T1IR | (1 << MATn); // 清除中断标志位
T1PR = PR_data; // 设置预分频器
/* 设置匹配寄存器 */
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; // 重新启动定时器
return (1);
}
/*********************************************************************************************************
** 函数名称 :IRQ_EINT0
** 函数功能 :外部中断0中断服务程序,取反蜂鸣器控制口。
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void IRQ_EINT0(void)
{
//
EXTINT = (1 << 0); // 清外部中断0中断标志
VICVectAddr = 0x00; // 通知VIC中断处理结束
}
/*********************************************************************************************************
** 函数名称 :Init_Eint
** 函数功能 :外部中实验
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void Init_Eint(void)
{
PINSEL4 = 0x00100000; // P2.10连接EINT0
EXTMODE = 0x01; //0x00 电平触发方式,EXTMODE = 0x01;为边沿触发方式
EXTPOLAR = 0x00; //低电平触发// 下降沿触发
SetVICIRQ (14, 2, (uint32)IRQ_EINT0);
//VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断
//VICVectPri14 = 00; // 设置外部中断0中断最高优先级
//VICVectAddr14 = (uint32)IRQ_EINT0; // 设置中断服务程序地址
EXTINT = (1 << 0); // 清外部中断0中断标志
//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脚掉电唤醒位
/*******************************************************************************************
** 函数名称 :IRQ_Eint3
** 函数功能 :GPIO中断服务程序
** 入口参数 :无
** 出口参数 :无
*******************************************************************************************/
void IRQ_Eint3(void)
{
IO2IntClr = KEYPin; // 清零P2.1中断
VICVectAddr = 0; // 向量中断结束
//IO2IntStatF=0;
}
/*********************************************************************************************************
** 函数名称 :Init_Eint3
** 函数功能 :外部中实验
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void Init_Eint3(void)
{
//IO_INT_STAT=0;
//IO2IntStatF=0;
IO_INT_STAT= ( (1<<2 ) ); //打开P0,P2的GPIO INT STATUS //IOIntStatus
IO2IntStatF|=KEYPin; //下降沿触发
IO2IntEnF |= KEYPin; // 设置P2.1为下降沿中断
/* 初始化中断向量 */
SetVICIRQ (17, 1, (uint32)IRQ_Eint3);
//VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
//VICVectPri17 = 1; // 分配外部中断3为优先级1中断
//VICVectAddr17 = (uint32)IRQ_Eint3; // 设置中断服务程序地址
IO2IntClr = KEYPin; // 清零P2.1中断
//VICIntEnable = 1 << 17; // 使能EINT3中断
INTWAKE |= GPIOWAKE; // GPIO中断唤醒芯片
}
void IRQ_Eint3_P0_24(void)
{
IO0IntClr = KEYPin; // 清零P2.1中断
VICVectAddr = 0; // 向量中断结束
//IO0IntStatF=0;
}
void Init_Eint3_P0_24(void)
{
//IO_INT_STAT=0;
//IO2IntStatF=0;
IO_INT_STAT= ( ( 1<<0 ) ); //打开P0,P2的GPIO INT STATUS //IOIntStatus
IO0IntStatF|=KEYPin; //下降沿触发
IO0IntEnF |= KEYPin; // 设置P2.1为下降沿中断
/* 初始化中断向量 */
SetVICIRQ (17, 1, (uint32)IRQ_Eint3_P0_24);
//VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断
//VICVectPri17 = 1; // 分配外部中断3为优先级1中断
//VICVectAddr17 = (uint32)IRQ_Eint3; // 设置中断服务程序地址
IO0IntClr = KEYPin; // 清零P2.1中断
//VICIntEnable = 1 << 17; // 使能EINT3中断
INTWAKE |= GPIOWAKE; // GPIO中断唤醒芯片
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -