stm32+rx8025
// 设备读写地址
#define RX8025_ADDR_READ 0x65
#define RX8025_ADDR_WRITE 0x64
// 设备寄存器地址
#define RX8025_ADDR_SECONDS 0x00
#define RX8025_ADDR_WEEK 0x30
#define RX8025_ADDR_DATES 0x40
#define RX8025_ADDR_MONTH 0x50
#define RX8025_ADDR_MINUTES 0x80
#define RX8025_ADDR_CONTROL1 0xE0
#define RX8025_ADDR_CONTROL2 0xF0 uint8_t RX8025_BCD2DEC(uint8_t val)
{
uint8_t i;
i = val&0x0f; //按位与,i得到低四位数。
val >>= 4; //右移四位,将高四位移到低四位的位置,得到高四位码值。
val &= 0x0f; //防止移位时高位补进1,只保留高四位码值
val *= 10; //高位码值乘以10
i += val; //然后与第四位码值相加。
return i; //将得到的十进制数返回
}
/**
* @brief RX8025_DEC2BCD 十进制转BCD码
* @param val BCD码
* @return
*/
uint8_t RX8025_DEC2BCD(uint8_t val)
{
uint8_t i;
i = val/10; //取得十位
val %= 10; //取得个位
i <<= 4; //左移4位
i += val;
return i;
}
void Rx8025_WriteCTFG(void)
{
uint8_t temp;
temp = RX8025_ReadReg(REG_CONTROL2);
temp &= 0xFB; //Write CTFG;
RX8025_WriteReg(REG_CONTROL2,temp);
}
/****************************************************
* Function Name :
* Description : 初始化RX8025
* Input :
* Return : 返回非0值代表初始化通过
* Note :
*****************************************************/
uint8_t RX8025_Init(void)
{
uint8_t temp,temp1;
RX8025GpioInit();
temp = RX8025_ReadReg(REG_CONTROL1);
/******* RX8025上电默认选择12小时制 **********/
#if USING_T12_T24==1 //24小时制
RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_12_24);
#elif USING_T12_T24==0 //12小时制
RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_12_24));
#endif
/* INTA管脚输出模式 */
temp = RX8025_ReadReg(REG_CONTROL1);
temp &= 0xF8; //清空低3位
//temp |= 0x00;//INTA管脚不输出
//temp |= 0x01;//INTA管脚输出固定低电平
//temp |= 0x02;//INTA管脚输出占空比50%、2HZ的脉冲
temp |= 0x03;//INTA管脚输出占空比50%、1HZ的脉冲
//temp |= 0x04;//INTA管脚输出电平模式,1秒1次
//temp |= 0x05;//INTA管脚输出电平模式,1分钟1次
//temp |= 0x06;//INTA管脚输出电平模式,1小时1次
//temp |= 0x07;//INTA管脚输出电平模式,1月1次
RX8025_WriteReg(REG_CONTROL1,temp);
temp1 = RX8025_ReadReg(REG_CONTROL1);
if(temp == temp1) //读写是否正常
temp1 = 0;
else
temp1 = 1;
/* 低电压检测功能 */
/* 振动停止检测功能 */
temp = RX8025_ReadReg(REG_CONTROL1);
RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_XST); //启动低电压检测
/* 电源复位检测功能 */
temp = RX8025_ReadReg(REG_CONTROL1);
RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_PON)); //清除标志位,为下次做准备
/* INTB管脚输出 */
temp = RX8025_ReadReg(REG_CONTROL2);
RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_WAFG)); //关闭ALARM_W引起的INTB管脚的输出
temp = RX8025_ReadReg(REG_CONTROL2);
RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_DAFG)); //关闭ALARM_D引起的INTB管脚的输出
/* 日历计数器 */
temp = RX8025_ReadReg(REG_MONTH);
RX8025_WriteReg(REG_MONTH,temp&(~0x80)); //规定:先写零再使用
return temp1;
}
/*
读取RTC
method=0时采用阻塞方式读,method=1时采用状态机+非阻塞方式
*/
void ReadRTCBlock(struct tm *rtc)
{
Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
//----星期
Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
//----一个月中的日期
Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
Rx8025RTC.tm_year += 2000;
(*rtc).tm_sec = Rx8025RTC.tm_sec;
(*rtc).tm_min = Rx8025RTC.tm_min;
(*rtc).tm_hour = Rx8025RTC.tm_hour;
//----星期
(*rtc).tm_wday= Rx8025RTC.tm_wday;
//----一个月中的日期
(*rtc).tm_mday = Rx8025RTC.tm_mday;
(*rtc).tm_mon = Rx8025RTC.tm_mon;
(*rtc).tm_year = Rx8025RTC.tm_year;
}
void ReadRTCNoBlock(struct tm *rtc)
{
(*rtc).tm_sec = Rx8025RTC.tm_sec;
(*rtc).tm_min = Rx8025RTC.tm_min;
(*rtc).tm_hour = Rx8025RTC.tm_hour;
//----星期
(*rtc).tm_wday= Rx8025RTC.tm_wday;
//----一个月中的日期
(*rtc).tm_mday = Rx8025RTC.tm_mday;
(*rtc).tm_mon = Rx8025RTC.tm_mon;
(*rtc).tm_year = Rx8025RTC.tm_year;
}
/****************************************************
* Function Name :
* Description :
* Input :
* Return :
* Note : 采用阻塞方式写,耗时75ms
*****************************************************/
uint8_t WriteRTCBlock(struct tm rtc)
{
Rx8025RTC.tm_sec = rtc.tm_sec;
Rx8025RTC.tm_min = rtc.tm_min;
Rx8025RTC.tm_hour = rtc.tm_hour;
//----星期
Rx8025RTC.tm_wday = rtc.tm_wday;
//----一个月中的日期
Rx8025RTC.tm_mday = rtc.tm_mday;
Rx8025RTC.tm_mon = rtc.tm_mon;
Rx8025RTC.tm_year = rtc.tm_year;
/* 每次写入耗时0.97ms */
RX8025_WriteReg(0,RX8025_DEC2BCD(Rx8025RTC.tm_sec));
RX8025_WriteReg(1,RX8025_DEC2BCD(Rx8025RTC.tm_min));
RX8025_WriteReg(2,RX8025_DEC2BCD(Rx8025RTC.tm_hour));
RX8025_WriteReg(3,RX8025_DEC2BCD(Rx8025RTC.tm_wday));
RX8025_WriteReg(4,RX8025_DEC2BCD(Rx8025RTC.tm_mday));
RX8025_WriteReg(5,RX8025_DEC2BCD(Rx8025RTC.tm_mon));
RX8025_WriteReg(6,RX8025_DEC2BCD(Rx8025RTC.tm_year-2000));
return 1;
}
/**************************************
功能描述: 发送读取时间命令
参数说明:
返回说明:
调用方式: 1s调用一次
全局变量:
读写时间:
注意事项:
日期 :
**************************************/
void Rx8025ReadRTCTask(void)
{
rx8025_status = READ_RTC;
}
/**************************************
功能描述: 周期性轮询任务
参数说明:
返回说明:
调用方式: 100ms调用一次
全局变量:
读写时间:
注意事项:
日期 :
**************************************/
void Rx8025Task(void)
{
static uint8_t step=0;
switch(rx8025_status)
{
case IDLE_RTC:
break;
case READ_RTC:
switch(step)
{
case 0:
Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
step++;
break;
case 1:
Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
step++;
break;
case 2:
Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
step++;
break;
case 3:
Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
step++;
break;
case 4:
Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
step++;
break;
case 5:
Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
step++;
break;
case 6:
Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
Rx8025RTC.tm_year += 2000;
step = 0;
rx8025_status = IDLE_RTC;
break;
}
break;
default:
break;
}
}
stm32+rx8025的更多相关文章
- ucos实时操作系统学习笔记——操作系统在STM32的移植
使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...
- [转] STM32各种时钟的区别
[原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...
- [转载]:STM32为什么必须先配置时钟再配置GPIO
转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...
- STM32 NVIC配置详解
例程: /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ...
- MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL 是因为目标板的芯片处于休眠 ...
- MDK5 STM32编译问题汇总
MDK5 STM32编译问题汇总 WIN8.KEIL-MDK-5 编译时,出现弹窗"The ARM C/C++ Compiler 已停止工作",关闭弹窗后,编译输出的窗口中出现如下 ...
- STM32学习及应用笔记一:SysTick定时器学习及应用
这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...
- STM32之DMA+ADC
借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不 ...
- STM32之DAC君
如花说得好:呃呃呃.是俗话说得好:有了ADC,怎可少了DAC..我觉得奇怪.今天我开头就直奔主题了.我想了想,总结了一句话:孙悟空纵然有七十二变.无论是变成猫也好,变成狗也罢.始终还是会变回他本身.所 ...
随机推荐
- Python字典中的值为列表或字典的构造方法
转自: https://blog.csdn.net/buside/article/details/81323871 1.值为列表的构造方法 dic = {} dic.setdefault(key,[] ...
- svn版本管理工具的使用
安装参考http://www.cnblogs.com/macula/archive/2012/02/12/2347637.html 主要的使用步骤如下: 建立版本管理库: svnadmin creat ...
- windows7命令行终端获取管理员模式随笔
非常感谢http://wenku.baidu.com/view/d0e8d2d2240c844769eaee8a.html 背景: 安装了windows7系统后发现有很多命令在命令行模式下运行不了说没 ...
- BZOJ.1005.[HNOI2008]明明的烦恼(Prufer 高精 排列组合)
题目链接 若点数确定那么ans = (n-2)!/[(d1-1)!(d2-1)!...(dn-1)!] 现在把那些不确定的点一起考虑(假设有m个),它们在Prufer序列中总出现数就是left=n-2 ...
- POJ.1655 Balancing Act POJ.3107 Godfather(树的重心)
关于树的重心:百度百科 有关博客:http://blog.csdn.net/acdreamers/article/details/16905653 1.Balancing Act To POJ.165 ...
- BZOJ.3450.(JoyOI1952) Easy(期望)
题目链接 /* 设f[i]为到i的期望得分,c[i]为到i的期望连续长度 则若s[i]=='x',f[i]=f[i-1], c[i]=0 s[i]=='0',f[i]=f[i-1]+2*c[i-1]+ ...
- python——append与extend
编者注:本文主要参考了<Python核心编程(第二版)> 网上有很多对这两个函数的区别讲解,但我觉得都讲的不是很清楚,记忆不深刻.这样解释清楚且容易记住. list.append(obje ...
- Centos 7 安装 Mysql 5.5 5.6 5.7
环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -a Linu ...
- Instruments
链接: iOS性能优化:Instruments使用实战 iOS 使用Instruments的工具小结
- C++泛型编程(1)--自己实现C++迭代器/遍历器 iterator
1.原理 迭代器又称为遍历器,用于访问容器中的数据,迭代器旨在算法和容器之间搭建访问的桥梁,从而使算法和数据分离,不用关心数据具体的存储细节.具体的原理描述请参考以下两个博客: [1].C++迭代器 ...