STM32之RTC配置与初始化-rtc.h rtc.c
<rtc.h>
#include "stm32f10x.h"
#ifndef _RTC_H
#define _RTC_H
typedef struct
{
vu8 hour;
vu8 mintue;
vu8 second;
vu16 year;
vu8 month;
vu8 day;
vu8 week;
}_calendar_obj;
// extern _calendar_obj Calendar;
u8 RTC_Init(void);
u8 Is_Leap_Year(u16 _year);
_calendar_obj RTC_GetCalendar(void);
u8 RTC_GetWeek(u16 _year,u8 _month,u8 _day);
u8 RTC_SetCalendar(u16 _year,u8 _month,u8 _day,u8 _hour,u8 _min,u8 _second);
#endif <rtc.c>
#include "rtc.h" const u8 month_table[]={,,,,,,,,,,,};
const u8 week_table[]={,,,,,,,,,,,}; _calendar_obj Calendar; void delay_ms(u16 time)
{
u16 i=;
while(time--)
{
i=;
while(i--);
}
} u8 Is_Leap_Year(u16 _year)
{
if((_year% && _year%!=) | (_year%==)) return ;
else return ;
} u8 RTC_Init(void)
{
u16 temp=;
//enable RTC_CLK outside
if(BKP_ReadBackupRegister(BKP_DR1)!=0x5050)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
RCC_LSEConfig(RCC_LSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)==RESET)
{
temp++;
delay_ms();
}
if(temp>) return ;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
RTC_SetPrescaler();
RTC_WaitForLastTask();
RTC_SetCalendar(,,,,,);
RTC_ExitConfigMode();
BKP_WriteBackupRegister(BKP_DR1,0x5050);
}
else
{
RTC_WaitForSynchro();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
}
return ;
} _calendar_obj RTC_GetCalendar(void)
{
static u16 daycount=;
u32 timecount=RTC_GetCounter();
u32 daynum=timecount/; //day
u16 temp=; //Calendar year
if(daycount!=daynum) //>1
{
daycount=daynum;
temp=;
while(daynum>)
{
if(Is_Leap_Year(temp))
{
if(daynum>=)
daynum=daynum-;
else
break;
}
else
daynum=daynum-;
temp++;
}
Calendar.year=temp; // set year
temp=; //reset temp // Calendar month
while(daynum>=)
{
if(Is_Leap_Year(Calendar.year) && temp==)
{
if(daynum>=) daynum=daynum-;
else break;
}
else
{
if(daynum>=month_table[temp])
daynum=daynum-month_table[temp];
else
break;
}
temp++;
}
Calendar.month=temp+; //set month
Calendar.day=daynum+; //set day
} daynum=timecount%;
Calendar.hour=daynum/; //set hour
Calendar.mintue=(daynum%)/; //set mintue
Calendar.second=(daynum%)%; //set second return Calendar;
} u8 RTC_SetCalendar(u16 _year,u8 _month,u8 _day,u8 _hour,u8 _min,u8 _second)
{
u16 i;
u32 seccount=; //second total
if(_year< || _year>) return ; //valid year //calculate year
for(i=;i<_year;i++)
{
if(Is_Leap_Year(i))
seccount=seccount+**; //3600*24*366=31622400
else
seccount=seccount+**; //3600*24*365=31536000
}
//calculate month
_month=_month-;
for(i=;i<_month;i++)
{
seccount=seccount+(u32)month_table[i]**;
if(Is_Leap_Year(_year) && i==) //February,add 1 day
{
seccount=seccount+*;
}
} //calculate day
seccount=seccount+(u32)(_day-)**;
seccount+=(u32)_hour*;
seccount+=(u32)_min*;
seccount+=_second; //set Calendar
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
PWR_BackupAccessCmd(ENABLE);
RTC_SetCounter(seccount);
RTC_WaitForLastTask(); return ;
} u8 RTC_GetWeek(u16 _year,u8 _month,u8 _day)
{
u16 temp;
u8 yearH,yearL;
yearH=_year/; // 2016/100=20
yearL=_year%; // 2016%100=16 if(yearH>) yearL+=;
temp=yearL+yearL/;
temp=temp+_day+week_table[_month-];
if(yearL%== && _month<)
temp=temp-; return temp%;
}
STM32之RTC配置与初始化-rtc.h rtc.c的更多相关文章
- STM32之RTC配置与初始化
void rtc_init() { //让电源和后备寄存器使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE) ...
- STM32串口通信配置(USART1+USART2+USART3+UART4)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean
让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...
- 三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位
对于FPGA内部的复位,之前一直比较迷,这两天仔细研究官方数据手册,解开了心中的诸多疑惑,感觉自己又进步了呢..... 原创不易,转载请转原文,注明出处,谢谢. 一.关于POR(Power-On ...
- [Winfrom]Cefsharp配置与初始化
摘要 在做客户端程序的时候,本来打算使用wpf的,但在内嵌cefsharp的时候,发现输入法有问题,所以使用了winform作为cefsharp的容器. 系列文章 CefSharp 在同一窗口打开链接 ...
- 在过滤器中获取在web.xml配置的初始化参数
在过滤器中获取在web.xml配置的初始化参数 例如 <filter> <filter-name>cross-origin</filter-name> < ...
- mybatis源码分析--如何加载配置及初始化
简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...
- nginx&http 第二章 ngx 事件event配置等初始化
event事件模块,配置分为两层:ngx_events_module 事件模块 和 ngx_event_core_module 事件核心模块.ngx_events_module:模块类型NGX_COR ...
- STM32入门系列-STM32时钟系统,时钟初始化配置函数
在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...
随机推荐
- Graph-tool简介 - wiki
graph-tool is a Python module for manipulation and statistical analysis of graphs[disambiguation nee ...
- EL表达式 (详解)(转)
EL表达式 1.EL简介 1)语法结构 ${expression} 2)[]与.运算符 EL 提供.和[]两种运算符来存取数据. 当要存取的属性名称中包含一 ...
- C#综合揭秘——细说多线程(上)
引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用. 而 I/O线程 ...
- IE7局部滚动区域下绝对定位或相对定位元素不随滚动条滚动的bug
尽管在项目中测试人员已经慢慢淡化了IE6的测试,但是IE7依然还是要纳入测试范围. 最近碰到一个IE7的蛋疼bug,在页面上设置了一个局部的滚动区域,在拖动滚动条的时候,滚动区域内设置了相对定位或绝对 ...
- python 练习 14
方法一 #!/usr/bin/python # -*- coding: UTF-8 -*- def fib(n): a,b = 1,1 for i in range(n-1): a,b = b,a+b ...
- AES算法
高级加密标准(Advanced Encryption Standard,AES),又称 高级加密标准Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多 ...
- javaSE之如何将一个文件复制到另一个文件
/* * (1). 文件字符输入,输出流 * 文件字节输入,输出流的read和write方法使用 * 字节数组读写数据,即以字节为单位处理数据,因此,字节流不能很好的操作Unicode字符 * ,比如 ...
- ARM的启动和中断向量表
启动的方式 对于S3C2440而言,启动的方式有两种,一是Nor Flash方式启动,二是Nand Flash方式启动. 使用Nor Flash方式启动 Nor Flash的地址范围如下 0x0000 ...
- 转:Struts2<s:iterator value="" var="lst">中var的使用和一些标签的使用体会
比如<s:iterator value="pmOperateList" var="lst"> <!-- iterator加上var 等价于重新 ...
- 5月11日 ArrayList集合复习、特殊集合、枚举类型
一.ArrayList集合复习 //定义 ArrayList al = new ArrayList(); //添加元素 al.Add(); //插入元素 al.Insert(,); //查看个数 in ...