/****************************************************************************************
* File name: rtc_driver.c
* File information:
* Change Logs:
* Date Author Notes
* 2018-07-10 H.q.x first version
* 2018-07-20 Y.L 移植
*****************************************************************************************/
#include "rtc_driver.h"
#include <finsh.h>
const int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char now_year;
unsigned char now_month;
unsigned char now_day;
unsigned char now_hour;
unsigned char now_min;
unsigned char now_sec;
/******************************************************************************************
* 函 数 名: isLeapYear
* 函数参量:
* 返 回 值:
* 注 释: 闰年的判断条件 :1.能被4整除且不能被100整除 2.或者能被400整除
*****************************************************************************************/
int isLeapYear(int year)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
return 1;
}
return 0;
}
/******************************************************************************************
* 函 数 名: date2sec
* 函数参量:
* 返 回 值:
* 注 释: 时间转秒
*****************************************************************************************/
long date2sec(date d)
{
long sum=0;
int i,backup;
for(i=YEAR;i<d.year;i++) //累计以往各年的天数
{
sum+=365;
if(isLeapYear(i))
{
sum+=1; //闰年多一天
}
}
backup=i;
for(i=1;i<d.month;i++) //累计当年以往各月的天数
{
sum+=days[i-1];
}
if(d.month>2)
{
if(isLeapYear(backup))
{
sum+=1; //闰年多一天
}
}
sum+=d.day-1; //累计当年当月的天数
sum=sum*24*60*60; //转换成秒
sum+=d.hour*60*60+d.min*60+d.sec; //加当天的小时,分钟,秒
return sum; //返回总秒数
}
/******************************************************************************************
* 函 数 名: sec2date
* 函数参量:
* 返 回 值:
* 注 释: 秒转时间
*****************************************************************************************/
date sec2date(long sec)
{
date d={YEAR,1,1,0,0,0};
int ds,sum;
ds=sec/(24*60*60);
sec-=ds*(24*60*60);
d.hour=sec/(60*60);
sec-=d.hour*(60*60);
d.min=sec/60;
sec-=d.min*60;
d.sec=sec;
while(1) //计算有多少年
{
sum=365;
if(isLeapYear(d.year))
{
sum+=1; //闰年多一天
}
if(ds<sum)
{
break; //不足一年了
}
d.year++;
ds-=sum;
}
while(1) //计算有多少月
{
sum=days[d.month-1];
if(d.month==2)
{
if(isLeapYear(d.year))
{
sum+=1; //闰年多一天
}
}
if(ds<sum)
{
d.day+= ds; //不足一月了
break;
}
ds-=sum;
d.month++;
}
return d;
}
/******************************************************************************************
* 函 数 名: RTC_SDA_IO
* 函数参量:
* 返 回 值:
* 注 释: 数据线IO配置
*****************************************************************************************/
static void RTC_SDA_IO(int8_t x)
{
if(x)
{
((GPIO_Type *)PTB_BASE)->PSOR |= (1U<<14);
}
else
{
((GPIO_Type *)PTB_BASE)->PCOR |= (1U<<14);
}
}
/******************************************************************************************
* 函 数 名: RTC_SCL_IO
* 函数参量:
* 返 回 值:
* 注 释: 时钟线IO配置
*****************************************************************************************/
static void RTC_SCL_IO(int8_t x)
{
if(x)
{
((GPIO_Type *)PTB_BASE)->PSOR |= (1U<<13);
}
else
{
((GPIO_Type *)PTB_BASE)->PCOR |= (1U<<13);
}
}
/******************************************************************************************
* 函 数 名: RTC_SDA_IN_CONFIG
* 函数参量:
* 返 回 值:
* 注 释: RTC数据线输入模式配置
*****************************************************************************************/
static void RTC_SDA_IN_CONFIG(void)
{
RTC_SDA_IO(1); //置高
((GPIO_Type *)PTB_BASE)->PDDR |= (0U<<14); //PTB10输入
((PORT_Type *)PTB_BASE)->PCR[14] &= ~0x600;
((PORT_Type *)PTB_BASE)->PCR[14] |= 0x100; //PTB10普通IO
((PORT_Type *)PTB_BASE)->PCR[14] |= 0x3; //上拉
}
/******************************************************************************************
* 函 数 名: RTC_SDA_OUT_CONFIG
* 函数参量:
* 返 回 值:
* 注 释: RTC数据线输出模式配置
*****************************************************************************************/
static void RTC_SDA_OUT_CONFIG(void)
{
((GPIO_Type *)PTB_BASE)->PDDR |= (1U<<14); //PTB10输出
((PORT_Type *)PTB_BASE)->PCR[14] &= ~0x600;
((PORT_Type *)PTB_BASE)->PCR[14] |= 0x100; //PTB10普通IO
((PORT_Type *)PTB_BASE)->PCR[14] &= ~(0x2); //上拉失能
}
/******************************************************************************************
* 函 数 名: RTC_SCL_CONFIG
* 函数参量:
* 返 回 值:
* 注 释: RTC时钟线 模式配置
*****************************************************************************************/
static void RTC_SCL_CONFIG(void)
{
RTC_SCL_IO(1); //置高
((GPIO_Type *)PTB_BASE)->PDDR |= (1U<<13); //PTB10输出
((PORT_Type *)PTB_BASE)->PCR[13] &= ~0x600;
((PORT_Type *)PTB_BASE)->PCR[13] |= 0x100; //PTB10普通IO
((PORT_Type *)PTB_BASE)->PCR[13] &= ~(0x2); //上拉
}
/******************************************************************************************
* 函 数 名: RTC_delay
* 函数参量:
* 返 回 值:
* 注 释: RTC延时
*****************************************************************************************/
void RTC_delay(unsigned int ticks)
{
while(ticks--);
}
/******************************************************************************************
* 函 数 名: rtc_iic_start
* 函数参量:
* 返 回 值:
* 注 释:
*****************************************************************************************/
static void rtc_iic_start(void)
{
RTC_SDA_OUT_CONFIG();
RTC_delay(RTC_delay_TICK_1US);//1us
RTC_SCL_IO(1);
RTC_SDA_IO(1);
RTC_delay(RTC_delay_TICK_1US);//1us
RTC_SDA_IO(0);
RTC_delay(RTC_delay_TICK_1US);//1us
RTC_SCL_IO(0);
}
/******************************************************************************************
* 函 数 名: rtc_iic_stop
* 函数参量:
* 返 回 值:
* 注 释:
*****************************************************************************************/
static void rtc_iic_stop(void)
{
RTC_SDA_OUT_CONFIG();
RTC_SCL_IO(0);
RTC_SDA_IO(0);
RTC_delay(RTC_delay_TICK_1US);//1us
RTC_SCL_IO(1);
RTC_delay(RTC_delay_TICK_1US);//1us
RTC_SDA_IO(1);
}
/******************************************************************************************
* 函 数 名: rtc_iic_send_ask
* 函数参量:
* 返 回 值:
* 注 释:
*****************************************************************************************/
void rtc_iic_send_ask(void)
{
RTC_SDA_OUT_CONFIG();
//RTC_SCL_IO = 0;
RTC_delay(RTC_delay_TICK_1US);
RTC_SDA_IO(0);
RTC_delay(RTC_delay_TICK_1US);
RTC_SCL_IO(1);
RTC_delay(RTC_delay_TICK_1US);
RTC_SCL_IO(0);
RTC_delay(RTC_delay_TICK_1US);
}
/******************************************************************************************
* 函 数 名: rtc_iic_send_noask
* 函数参量:
* 返 回 值:
* 注 释:
*****************************************************************************************/
static void rtc_iic_send_noask(void) //无应答波形
{
RTC_SDA_OUT_CONFIG();
RTC_JYRTC-1驱动程序_源码
版权申诉
53 浏览量
2021-10-04
01:03:01
上传
评论
收藏 6KB ZIP 举报
![avatar](https://profile-avatar.csdnimg.cn/0b1cb844ebaa451fbc1e05cd93b8a360_weixin_42679995.jpg!1)
食肉库玛
- 粉丝: 57
- 资源: 4740
最新资源
- 雷克沙u盘加密软件windows客户端
- JavaSwing订单管理系统.zip
- 数据库管理工具:dbeaver-ce-23.2.4-macos-aarch64.dmg
- 一个能够使用的幻兽帕鲁修改器
- java期末大作业课程设计学生成绩管理系统源码+数据库(高分项目)
- 数据库管理工具:dbeaver-ce-23.2.2-stable.x86-64.rpm
- 数据库管理工具:dbeaver-ce-23.2.2-macos-x86-64.dmg
- 数据库管理工具:dbeaver-ce-23.2.2-macos-aarch64.dmg
- 数据库管理工具:dbeaver-ce-23.1.5-stable.x86-64.rpm
- 以下是一些适用于英语六级作文的万能句型模板,涵盖了引言、正文和结论部分的各类表达方式.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
评论0