|
@@ -0,0 +1,1906 @@
|
|
|
+/*********************************************************
|
|
|
+ *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时钟源选择;HOURx:12小时/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**********************/
|
|
|
+
|
|
|
+
|