rt-thread-official/bsp/essemi/es8p508x/libraries/Library/Source/lib_rtc.c

1907 lines
40 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*********************************************************
*Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: lib_rtc.c
*作 者: Liut
*版 本: V1.00
*日 期: 2017/07/14
*描 述: RTC模块程序
*备 注: 适用于HRSDK-GDB-ES8P508 V1.1
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "lib_rtc.h"
#include "lib_scu.h"
/***************************************************************
函数名RTC_Init
描 述:实时时钟初始化
输入值CLKx:RTC时钟源选择HOURx12小时/24小时制选择
输出值:无
返回值:无
***************************************************************/
void RTC_Init(RTC_TYPE_CLKS CLKx,RTC_TYPE_TIME HOURx)
{
uint32_t flag;
if(CLKx == RTC_LOSC )
{
uint32_t Prot_Temp;
Prot_Temp = SCU->PROT.PROT;
if(Prot_Temp != 0) //写保护了
SCU_RegUnLock(); //解锁
SCU_XTAL_Enable(); //使能外部32kHZ
while(SCU_XTALReadyFlag() != SET); //等待时钟开启
if(Prot_Temp != 0)
SCU_RegLock(); //打开写保护
}
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
RTC->CON.PON = 0; // 清零使能RTC
RTC->CON.HSWI = HOURx; // 24小时模式
RTC->CON.CLKS = CLKx; // 时钟源选择32768Hz
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
}
/***************************************************************
函数名RTC_StartRead
描 述:启动实时时钟读流程
输入值:无
输出值:无
返回值:无
***************************************************************/
void RTC_StartRead(void)
{
RTC->CON.TMWR = 0; // 操作类型是读
RTC->CON.TMUP = 1; // 触发读操作
while (RTC->CON.TMUP == 1); //等待读完成
}
/***************************************************************
函数名RTC_ReadHourmode
描 述:读取小时模式
输入值:无
输出值:无
返回值:当前的小时模式
***************************************************************/
uint32_t RTC_ReadHourmode(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
result = RTC->CON.HSWI;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadSecond
描 述:读取秒
输入值:无
输出值:无
返回值:当前的秒
***************************************************************/
uint32_t RTC_ReadSecond(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->HMS.SEC & (uint32_t)0x01) * 1);
result += (((RTC->HMS.SEC >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->HMS.SEC >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->HMS.SEC >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->HMS.SEC >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->HMS.SEC >> 5) & (uint32_t)0x01) * 20);
result += (((RTC->HMS.SEC >> 6) & (uint32_t)0x01) * 40);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadMinute
描 述:读取分
输入值:无
输出值:无
返回值:当前的分
***************************************************************/
uint32_t RTC_ReadMinute(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->HMS.MIN & (uint32_t)0x01) * 1);
result += (((RTC->HMS.MIN >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->HMS.MIN >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->HMS.MIN >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->HMS.MIN >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->HMS.MIN >> 5) & (uint32_t)0x01) * 20);
result += (((RTC->HMS.MIN >> 6) & (uint32_t)0x01) * 40);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadHour
描 述:读取小时
输入值:无
输出值:无
返回值:当前的小时
***************************************************************/
uint32_t RTC_ReadHour(uint32_t *meridiem)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->HMS.HOUR & (uint32_t)0x01) * 1);
result += (((RTC->HMS.HOUR >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->HMS.HOUR >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->HMS.HOUR >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->HMS.HOUR >> 4) & (uint32_t)0x01) * 10);
if(RTC_ReadHourmode() == RTC_HOUR24) //24小时模式20小时
{
result += (((RTC->HMS.HOUR >> 5) & (uint32_t)0x01) * 20);
}
else //12小时模式1 PM,0 AM
{
*meridiem = (((RTC->HMS.HOUR >> 5) & (uint32_t)0x01));
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadDay
描 述:读取日
输入值:无
输出值:无
返回值:当前的日
***************************************************************/
uint32_t RTC_ReadDay(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->YMDW.DAY & (uint32_t)0x01) * 1);
result += (((RTC->YMDW.DAY >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->YMDW.DAY >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->YMDW.DAY >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->YMDW.DAY >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->YMDW.DAY >> 5) & (uint32_t)0x01) * 20);
/* 加入RTC写保护 */
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadMonth
描 述:读取月
输入值:无
输出值:无
返回值:当前的月
***************************************************************/
uint32_t RTC_ReadMonth(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->YMDW.MON & (uint32_t)0x01) * 1);
result += (((RTC->YMDW.MON >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->YMDW.MON >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->YMDW.MON >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->YMDW.MON >> 4) & (uint32_t)0x01) * 10);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadYear
描 述:读取年
输入值:无
输出值:无
返回值:当前的年
***************************************************************/
uint32_t RTC_ReadYear(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->YMDW.YEAR & (uint32_t)0x01) * 1);
result += (((RTC->YMDW.YEAR >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->YMDW.YEAR >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->YMDW.YEAR >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->YMDW.YEAR >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->YMDW.YEAR >> 5) & (uint32_t)0x01) * 20);
result += (((RTC->YMDW.YEAR >> 6) & (uint32_t)0x01) * 40);
result += (((RTC->YMDW.YEAR >> 7) & (uint32_t)0x01) * 80);
result += 2000;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadWeek
描 述:读取星期
输入值:无
输出值:无
返回值:当前的星期
***************************************************************/
uint32_t RTC_ReadWeek(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
switch(RTC->YMDW.WEEK)
{
case 0x00: result = 0;break;
case 0x01: result = 1;break;
case 0x02: result = 2;break;
case 0x03: result = 3;break;
case 0x04: result = 4;break;
case 0x05: result = 5;break;
case 0x06: result = 6;break;
default: result = 0;break;
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_StartRead
描 述:启动实时时钟写流程
输入值:无
输出值:无
返回值:无
***************************************************************/
void RTC_StartWrite(void)
{
/* 触发写操作步骤 */
RTC->CON.TMWR = 1; // 操作类型是写
RTC->CON.TMUP = 1; // 触发写操作
while (RTC->CON.TMUP == 1); //等待写完成
}
/***************************************************************
函数名RTC_WriteSecond
描 述:修改秒
输入值second: 秒
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteSecond(uint32_t second)
{
uint32_t flag = 0;
uint32_t sec_buf = 0;
/* 检查输入参数 */
if (second >= 60)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (second >= 40)
{
sec_buf |= (uint32_t)1<<6;
second -= 40;
}
else
{
sec_buf &= ~(uint32_t)1<<6;
}
if (second >= 20)
{
sec_buf |= (uint32_t)1<<5;
second -= 20;
}
else
{
sec_buf &= ~(uint32_t)1<<5;
}
if (second >= 10)
{
sec_buf |= (uint32_t)1<<4;
second -= 10;
}
else
{
sec_buf &= ~(uint32_t)1<<4;
}
if (second >= 8)
{
sec_buf |= (uint32_t)1<<3;
second -= 8;
}
else
{
sec_buf &= ~(uint32_t)1<<3;
}
if (second >= 4)
{
sec_buf |= (uint32_t)1<<2;
second -= 4;
}
else
{
sec_buf &= ~(uint32_t)1<<2;
}
if (second >= 2)
{
sec_buf |= (uint32_t)1<<1;
second -= 2;
}
else
{
sec_buf &= ~(uint32_t)1<<1;
}
if (second >= 1)
{
sec_buf |= (uint32_t)1;
second -= 1;
}
else
{
sec_buf &= ~(uint32_t)1;
}
RTC->HMS.SEC = sec_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteMinute
描 述:修改秒
输入值minute: 秒
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteMinute(uint32_t minute)
{
uint32_t flag;
uint32_t min_buf = 0;
/* 检查输入参数 */
if (minute >= 60)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (minute >= 40)
{
min_buf |= (uint32_t)1<<6;
minute -= 40;
}
else
{
min_buf &= ~(uint32_t)1<<6;
}
if (minute >= 20)
{
min_buf |= (uint32_t)1<<5;
minute -= 20;
}
else
{
min_buf &= ~(uint32_t)1<<5;
}
if (minute >= 10)
{
min_buf |= (uint32_t)1<<4;
minute -= 10;
}
else
{
min_buf &= ~(uint32_t)1<<4;
}
if (minute >= 8)
{
min_buf |= (uint32_t)1<<3;
minute -= 8;
}
else
{
min_buf &= ~(uint32_t)1<<3;
}
if (minute >= 4)
{
min_buf |= (uint32_t)1<<2;
minute -= 4;
}
else
{
min_buf &= ~(uint32_t)1<<2;
}
if (minute >= 2)
{
min_buf |= (uint32_t)1<<1;
minute -= 2;
}
else
{
min_buf &= ~(uint32_t)1<<1;
}
if (minute >= 1)
{
min_buf |= (uint32_t)1;
minute -= 1;
}
else
{
min_buf &= ~(uint32_t)1;
}
RTC->HMS.MIN = min_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteHour
描 述:修改时
输入值hour: 时
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteHour(uint32_t hour, uint32_t meridiem)
{
uint32_t flag,mode;
uint32_t hour_buf = 0;
/* 检查输入参数 */
if (hour >= 24)
return ERROR;
mode = RTC_ReadHourmode();
if(mode == RTC_HOUR12 && hour > 12) //12小时模式不可大于12小时
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if(mode == RTC_HOUR24)
{
if (hour >= 20)
{
hour_buf |= (uint32_t)1<<5;
hour -= 20;
}
else
{
hour_buf &= ~((uint32_t)1<<5);
}
}
else
{
if(meridiem == 1)
hour_buf |= (uint32_t)1<<5;
else
hour_buf &= ~((uint32_t)1<<5);
}
if (hour >= 10)
{
hour_buf |= (uint32_t)1<<4;
hour -= 10;
}
else
{
hour_buf &= ~((uint32_t)1<<4);
}
if (hour >= 8)
{
hour_buf |= (uint32_t)1<<3;
hour -= 8;
}
else
{
hour_buf &= ~((uint32_t)1<<3);
}
if (hour >= 4)
{
hour_buf |= (uint32_t)1<<2;
hour -= 4;
}
else
{
hour_buf &= ~((uint32_t)1<<2);
}
if (hour >= 2)
{
hour_buf |= (uint32_t)1<<1;
hour -= 2;
}
else
{
hour_buf &= ~((uint32_t)1<<1);
}
if (hour >= 1)
{
hour_buf |= (uint32_t)1;
hour -= 1;
}
else
{
hour_buf &= ~(uint32_t)1;
}
RTC->HMS.HOUR = hour_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteDay
描 述:修改日
输入值day: 日
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteDay(uint32_t day)
{
uint32_t flag;
uint32_t day_buf = 0;
/* 检查输入参数 */
if ((day == 0) || (day >= 32))
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (day >= 20)
{
day_buf |= (uint32_t)1<<5;
day -= 20;
}
else
{
day_buf &= ~((uint32_t)1<<5);
}
if (day >= 10)
{
day_buf |= (uint32_t)1<<4;
day -= 10;
}
else
{
day_buf &= ~((uint32_t)1<<4);
}
if (day >= 8)
{
day_buf |= (uint32_t)1<<3;
day -= 8;
}
else
{
day_buf &= ~((uint32_t)1<<3);
}
if (day >= 4)
{
day_buf |= (uint32_t)1<<2;
day -= 4;
}
else
{
day_buf &= ~((uint32_t)1<<2);
}
if (day >= 2)
{
day_buf |= (uint32_t)1<<1;
day -= 2;
}
else
{
day_buf &= ~((uint32_t)1<<1);
}
if (day >= 1)
{
day_buf |= (uint32_t)1;
day -= 1;
}
else
{
day_buf &= ~(uint32_t)1;
}
RTC->YMDW.DAY = day_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteMonth
描 述:修改月
输入值month: 月
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteMonth(uint32_t month)
{
uint32_t flag;
uint32_t month_buf = 0;
/* 检查输入参数 */
if ((month == 0) || (month >= 13))
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (month >= 10)
{
month_buf |= (uint32_t)1<<4;
month -= 10;
}
else
{
month_buf &= ~((uint32_t)1<<4);
}
if (month >= 8)
{
month_buf |= (uint32_t)1<<3;
month -= 8;
}
else
{
month_buf &= ~((uint32_t)1<<3);
}
if (month >= 4)
{
month_buf |= (uint32_t)1<<2;
month -= 4;
}
else
{
month_buf &= ~((uint32_t)1<<2);
}
if (month >= 2)
{
month_buf |= (uint32_t)1<<1;
month -= 2;
}
else
{
month_buf &= ~((uint32_t)1<<1);
}
if (month >= 1)
{
month_buf |= (uint32_t)1;
month -= 1;
}
else
{
month_buf &= ~(uint32_t)1;
}
RTC->YMDW.MON = month_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteYear
描 述:修改年
输入值year: 年
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteYear(uint32_t year)
{
uint32_t flag;
uint32_t year_buf = 0;
/* 检查输入参数 */
if ((year < 2000) || (year > 2099))
return ERROR;
/* 年转换 */
year -= 2000;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (year >= 80)
{
year_buf |= (uint32_t)1<<7;
year -= 80;
}
else
{
year_buf &= ~((uint32_t)1<<7);
}
if (year >= 40)
{
year_buf |= (uint32_t)1<<6;
year -= 40;
}
else
{
year_buf &= ~((uint32_t)1<<6);
}
if (year >= 20)
{
year_buf |= (uint32_t)1<<5;
year -= 20;
}
else
{
year_buf &= ~((uint32_t)1<<5);
}
if (year >= 10)
{
year_buf |= (uint32_t)1<<4;
year -= 10;
}
else
{
year_buf &= ~((uint32_t)1<<4);
}
if (year >= 8)
{
year_buf |= (uint32_t)1<<3;
year -= 8;
}
else
{
year_buf &= ~((uint32_t)1<<3);
}
if (year >= 4)
{
year_buf |= (uint32_t)1<<2;
year -= 4;
}
else
{
year_buf &= ~((uint32_t)1<<2);
}
if (year >= 2)
{
year_buf |= (uint32_t)1<<1;
year -= 2;
}
else
{
year_buf &= ~((uint32_t)1<<1);
}
if (year >= 1)
{
year_buf |= (uint32_t)1;
year -= 1;
}
else
{
year_buf &= ~(uint32_t)1;
}
RTC->YMDW.YEAR = year_buf;
/* 触发写操作步骤 */
RTC_StartWrite();
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteWeek
描 述:修改星期
输入值week: 星期0-6
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteWeek(uint32_t week)
{
uint32_t flag;
/* 检查输入参数 */
if (week > 6)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
RTC->YMDW.WEEK = week;
/* 触发写操作步骤 */
RTC->CON.TMWR = 1; // 操作类型是写
RTC->CON.TMUP = 1; // 触发写操作
while (RTC->CON.TMUP == 1);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_ReadWeekAlarmMinute
描 述:读取分
输入值:无
输出值:无
返回值:当前的分
***************************************************************/
uint32_t RTC_ReadWeekAlarmMinute(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->WA.WM & (uint32_t)0x01) * 1);
result += (((RTC->WA.WM >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->WA.WM >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->WA.WM >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->WA.WM >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->WA.WM >> 5) & (uint32_t)0x01) * 20);
result += (((RTC->WA.WM >> 6) & (uint32_t)0x01) * 40);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadWeekAlarmHour
描 述:读取小时
输入值:无
输出值:无
返回值:当前的小时
***************************************************************/
uint32_t RTC_ReadWeekAlarmHour(uint32_t *meridiem)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->WA.WH & (uint32_t)0x01) * 1);
result += (((RTC->WA.WH >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->WA.WH >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->WA.WH >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->WA.WH >> 4) & (uint32_t)0x01) * 10);
if(RTC_ReadHourmode() == RTC_HOUR24) //24小时模式20小时
{
result += (((RTC->WA.WH >> 5) & (uint32_t)0x01) * 20);
}
else //12小时模式1 PM,0 AM
{
*meridiem = (((RTC->WA.WH >> 5) & (uint32_t)0x01));
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadWeekAlarmWeek
描 述:读取星期
输入值:无
输出值:无
返回值:当前的星期
***************************************************************/
uint32_t RTC_ReadWeekAlarmWeek(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
switch(RTC->WA.WW)
{
case 0x00: result = 0;break;
case 0x01: result = 1;break;
case 0x02: result = 2;break;
case 0x03: result = 3;break;
case 0x04: result = 4;break;
case 0x05: result = 5;break;
case 0x06: result = 6;break;
default: result = 0;break;
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadDayAlarmMinute
描 述:读取分钟
输入值:无
输出值:无
返回值:当前的分钟
***************************************************************/
uint32_t RTC_ReadDayAlarmMinute(void)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->DA.DM & (uint32_t)0x01) * 1);
result += (((RTC->DA.DM >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->DA.DM >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->DA.DM >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->DA.DM >> 4) & (uint32_t)0x01) * 10);
result += (((RTC->DA.DM >> 5) & (uint32_t)0x01) * 20);
result += (((RTC->DA.DM >> 6) & (uint32_t)0x01) * 40);
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_ReadDaykAlarmHour
描 述:读取小时
输入值:无
输出值:无
返回值:当前的小时
***************************************************************/
uint32_t RTC_ReadDayAlarmHour(uint32_t *meridiem)
{
uint32_t flag;
uint32_t result;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 触发读操作步骤 */
RTC_StartRead();
/* 计算时间 */
result = ((RTC->DA.DH & (uint32_t)0x01) * 1);
result += (((RTC->DA.DH >> 1) & (uint32_t)0x01) * 2);
result += (((RTC->DA.DH >> 2) & (uint32_t)0x01) * 4);
result += (((RTC->DA.DH >> 3) & (uint32_t)0x01) * 8);
result += (((RTC->DA.DH >> 4) & (uint32_t)0x01) * 10);
if(RTC_ReadHourmode() == RTC_HOUR24) //24小时模式20小时
{
result += (((RTC->DA.DH >> 5) & (uint32_t)0x01) * 20);
}
else //12小时模式1 PM,0 AM
{
*meridiem = (((RTC->DA.DH >> 5) & (uint32_t)0x01));
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return result;
}
/***************************************************************
函数名RTC_WriteWeekAlarmMinute
描 述:修改分钟
输入值minute: 分钟
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteWeekAlarmMinute(uint32_t minute)
{
uint32_t flag;
uint32_t minute_buf = 0;
/* 检查输入参数 */
if (minute >= 60)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (minute >= 40)
{
minute_buf |= (uint32_t)1<<6;
minute -= 40;
}
else
{
minute_buf &= ~(uint32_t)1<<6;
}
if (minute >= 20)
{
minute_buf |= (uint32_t)1<<5;
minute -= 20;
}
else
{
minute_buf &= ~(uint32_t)1<<5;
}
if (minute >= 10)
{
minute_buf |= (uint32_t)1<<4;
minute -= 10;
}
else
{
minute_buf &= ~(uint32_t)1<<4;
}
if (minute >= 8)
{
minute_buf |= (uint32_t)1<<3;
minute -= 8;
}
else
{
minute_buf &= ~(uint32_t)1<<3;
}
if (minute >= 4)
{
minute_buf |= (uint32_t)1<<2;
minute -= 4;
}
else
{
minute_buf &= ~(uint32_t)1<<2;
}
if (minute >= 2)
{
minute_buf |= (uint32_t)1<<1;
minute -= 2;
}
else
{
minute_buf &= ~(uint32_t)1<<1;
}
if (minute >= 1)
{
minute_buf |= (uint32_t)1;
minute -= 1;
}
else
{
minute_buf &= ~(uint32_t)1;
}
RTC->WA.WM = minute_buf;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteWeekAlarmHour
描 述:修改小时
输入值hour: 小时
meridiem(仅在12小时模式时有效)
0 AM
1 PM
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteWeekAlarmHour(uint32_t hour, uint32_t meridiem)
{
uint32_t flag,mode;
uint32_t hour_buf = 0;
/* 检查输入参数 */
if (hour >= 24)
return ERROR;
mode = RTC_ReadHourmode();
if(mode == RTC_HOUR12 && hour > 12) //12小时模式不可大于12小时
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if(mode == RTC_HOUR24)
{
if (hour >= 20)
{
hour_buf |= (uint32_t)1<<5;
hour -= 20;
}
else
{
hour_buf &= ~((uint32_t)1<<5);
}
}
else
{
if(meridiem == 1)
hour_buf |= (uint32_t)1<<5;
else
hour_buf &= ~((uint32_t)1<<5);
}
if (hour >= 10)
{
hour_buf |= (uint32_t)1<<4;
hour -= 10;
}
else
{
hour_buf &= ~((uint32_t)1<<4);
}
if (hour >= 8)
{
hour_buf |= (uint32_t)1<<3;
hour -= 8;
}
else
{
hour_buf &= ~((uint32_t)1<<3);
}
if (hour >= 4)
{
hour_buf |= (uint32_t)1<<2;
hour -= 4;
}
else
{
hour_buf &= ~((uint32_t)1<<2);
}
if (hour >= 2)
{
hour_buf |= (uint32_t)1<<1;
hour -= 2;
}
else
{
hour_buf &= ~((uint32_t)1<<1);
}
if (hour >= 1)
{
hour_buf |= (uint32_t)1;
hour -= 1;
}
else
{
hour_buf &= ~(uint32_t)1;
}
RTC->WA.WH = hour_buf;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteWeekAlarmWeek
描 述:修改星期
输入值week: 星期0-6
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteWeekAlarmWeek(uint32_t week)
{
uint32_t flag;
/* 检查输入参数 */
if (week > 6)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
RTC->WA.WW = week;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteDayAlarmMinute
描 述:修改分钟
输入值minute: 分钟
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteDayAlarmMinute(uint32_t minute)
{
uint32_t flag,minute_buf;
/* 检查输入参数 */
if (minute >= 60)
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if (minute >= 40)
{
minute_buf |= (uint32_t)1<<6;
minute -= 40;
}
else
{
minute_buf &= ~(uint32_t)1<<6;
}
if (minute >= 20)
{
minute_buf |= (uint32_t)1<<5;
minute -= 20;
}
else
{
minute_buf &= ~(uint32_t)1<<5;
}
if (minute >= 10)
{
minute_buf |= (uint32_t)1<<4;
minute -= 10;
}
else
{
minute_buf &= ~(uint32_t)1<<4;
}
if (minute >= 8)
{
minute_buf |= (uint32_t)1<<3;
minute -= 8;
}
else
{
minute_buf &= ~(uint32_t)1<<3;
}
if (minute >= 4)
{
minute_buf |= (uint32_t)1<<2;
minute -= 4;
}
else
{
minute_buf &= ~(uint32_t)1<<2;
}
if (minute >= 2)
{
minute_buf |= (uint32_t)1<<1;
minute -= 2;
}
else
{
minute_buf &= ~(uint32_t)1<<1;
}
if (minute >= 1)
{
minute_buf |= (uint32_t)1;
minute -= 1;
}
else
{
minute_buf &= ~(uint32_t)1;
}
RTC->DA.DM = minute_buf;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_WriteDayAlarmHour
描 述:修改小时
输入值hour: 小时
meridiem(仅在12小时模式时有效)
0 AM
1 PM
输出值:无
返回值:无
***************************************************************/
ErrorStatus RTC_WriteDayAlarmHour(uint32_t hour, uint32_t meridiem)
{
uint32_t flag,mode;
uint32_t hour_buf = 0;
/* 检查输入参数 */
if (hour >= 24)
return ERROR;
mode = RTC_ReadHourmode();
if(mode == RTC_HOUR12 && hour > 12) //12小时模式不可大于12小时
return ERROR;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
if(mode == RTC_HOUR24)
{
if (hour >= 20)
{
hour_buf |= (uint32_t)1<<5;
hour -= 20;
}
else
{
hour_buf &= ~((uint32_t)1<<5);
}
}
else
{
if(meridiem == 1)
hour_buf |= (uint32_t)1<<5;
else
hour_buf &= ~((uint32_t)1<<5);
}
if (hour >= 10)
{
hour_buf |= (uint32_t)1<<4;
hour -= 10;
}
else
{
hour_buf &= ~((uint32_t)1<<4);
}
if (hour >= 8)
{
hour_buf |= (uint32_t)1<<3;
hour -= 8;
}
else
{
hour_buf &= ~((uint32_t)1<<3);
}
if (hour >= 4)
{
hour_buf |= (uint32_t)1<<2;
hour -= 4;
}
else
{
hour_buf &= ~((uint32_t)1<<2);
}
if (hour >= 2)
{
hour_buf |= (uint32_t)1<<1;
hour -= 2;
}
else
{
hour_buf &= ~((uint32_t)1<<1);
}
if (hour >= 1)
{
hour_buf |= (uint32_t)1;
hour -= 1;
}
else
{
hour_buf &= ~(uint32_t)1;
}
RTC->DA.DH = hour_buf;
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return SUCCESS;
}
/***************************************************************
函数名RTC_InterruptEnable
描 述:使能实时时钟的某些中断
输入值src: 实时时钟的中断源
输出值:无
返回值:无
***************************************************************/
void RTC_InterruptEnable(RTC_Interrupt_Source src)
{
uint32_t flag;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
switch (src)
{
case RTC_Interrupt_Source_Second:
RTC->IE.SCDIE = 1;
break;
case RTC_Interrupt_Source_Minute:
RTC->IE.MINIE = 1;
break;
case RTC_Interrupt_Source_Hour:
RTC->IE.HORIE = 1;
break;
case RTC_Interrupt_Source_Day:
RTC->IE.DAYIE = 1;
break;
case RTC_Interrupt_Source_Month:
RTC->IE.MONIE = 1;
break;
case RTC_Interrupt_Source_DayALE:
RTC->IE.DALE = 1;
break;
case RTC_Interrupt_Source_WeekALE:
RTC->IE.WALE = 1;
break;
default:
break;
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
NVIC->ISER[0] |= (1 << 20); // 使能NVIC中断
return;
}
/***************************************************************
函数名RTC_InterruptDisable
描 述:禁能实时时钟的某些中断
输入值src: 实时时钟的中断源
输出值:无
返回值:无
***************************************************************/
void RTC_InterruptDisable(RTC_Interrupt_Source src)
{
uint32_t flag;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
/* 设置新的值 */
switch (src)
{
case RTC_Interrupt_Source_Second:
RTC->IE.SCDIE = 0;
break;
case RTC_Interrupt_Source_Minute:
RTC->IE.MINIE = 0;
break;
case RTC_Interrupt_Source_Hour:
RTC->IE.HORIE = 0;
break;
case RTC_Interrupt_Source_Day:
RTC->IE.DAYIE = 0;
break;
case RTC_Interrupt_Source_Month:
RTC->IE.MONIE = 0;
break;
case RTC_Interrupt_Source_DayALE:
RTC->IE.DALE = 0;
break;
case RTC_Interrupt_Source_WeekALE:
RTC->IE.WALE = 0;
break;
default:
break;
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return;
}
/***************************************************************
函数名RTC_GetITStatus
描 述:读取实时时钟的某些中断状态
输入值src: 实时时钟的中断源
输出值:无
返回值:中断标志
***************************************************************/
ITStatus RTC_GetITStatus(RTC_Interrupt_Source src)
{
ITStatus result = RESET;
switch (src)
{
case RTC_Interrupt_Source_Second:
if(RTC->IE.SCDIE)
result = SET;
break;
case RTC_Interrupt_Source_Minute:
if(RTC->IE.MINIE)
result = SET;
break;
case RTC_Interrupt_Source_Hour:
if(RTC->IE.HORIE)
result = SET;
break;
case RTC_Interrupt_Source_Day:
if(RTC->IE.DAYIE)
result = SET;
break;
case RTC_Interrupt_Source_Month:
if(RTC->IE.MONIE)
result = SET;
break;
case RTC_Interrupt_Source_DayALE:
if(RTC->IE.DALE)
result = SET;
break;
case RTC_Interrupt_Source_WeekALE:
if(RTC->IE.WALE)
result = SET;
break;
default:
result = RESET;
break;
}
return result;
}
/***************************************************************
函数名RTC_GetFlagStatus
描 述:读取实时时钟的某些中断标志
输入值src: 实时时钟的中断源
输出值:无
返回值:中断标志
***************************************************************/
FlagStatus RTC_GetFlagStatus(RTC_Interrupt_Source src)
{
FlagStatus result = RESET;
switch (src)
{
case RTC_Interrupt_Source_Second:
if(RTC->IF.SCDIF)
result = SET;
break;
case RTC_Interrupt_Source_Minute:
if(RTC->IF.MINIF)
result = SET;
break;
case RTC_Interrupt_Source_Hour:
if(RTC->IF.HORIF)
result = SET;
break;
case RTC_Interrupt_Source_Day:
if(RTC->IF.DAYIF)
result = SET;
break;
case RTC_Interrupt_Source_Month:
if(RTC->IF.MONIF)
result = SET;
break;
case RTC_Interrupt_Source_DayALE:
if(RTC->IF.DAFG)
result = SET;
break;
case RTC_Interrupt_Source_WeekALE:
if(RTC->IF.WAFG)
result = SET;
break;
default:
result = RESET;
break;
}
return result;
}
/***************************************************************
函数名RTC_ClearITPendingBit
描 述:清除指定的中断标志位
输入值src: 实时时钟的中断源
输出值:无
返回值:无
***************************************************************/
void RTC_ClearITPendingBit(RTC_Interrupt_Source src)
{
uint32_t flag;
/* 解除RTC写保护 */
flag = RTC->WP.WP;
if (flag == 0x00000000)
RTC->WP.WP = 0x55AAAA55;
switch (src)
{
case RTC_Interrupt_Source_Second:
RTC->IF.Word = RTC_Interrupt_Source_Second;
break;
case RTC_Interrupt_Source_Minute:
RTC->IF.Word = RTC_Interrupt_Source_Minute;
break;
case RTC_Interrupt_Source_Hour:
RTC->IF.Word = RTC_Interrupt_Source_Hour;
break;
case RTC_Interrupt_Source_Day:
RTC->IF.Word = RTC_Interrupt_Source_Day;
break;
case RTC_Interrupt_Source_Month:
RTC->IF.Word = RTC_Interrupt_Source_Month;
break;
case RTC_Interrupt_Source_DayALE:
RTC->IF.Word = RTC_Interrupt_Source_DayALE;
break;
case RTC_Interrupt_Source_WeekALE:
RTC->IF.Word = RTC_Interrupt_Source_WeekALE;
break;
default:
break;
}
/* 加入RTC写保护 */
if (flag == 0x00000000)
RTC->WP.WP = 0x00000000;
return;
}
/*************************END OF FILE**********************/