// 设备读写地址
#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的更多相关文章

  1. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  2. [转] STM32各种时钟的区别

    [原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...

  3. [转载]:STM32为什么必须先配置时钟再配置GPIO

    转载来源 :http://blog.csdn.net/fushiqianxun/article/details/7926442 [原创]:我来添两句,就是很多同学(包括我)之前搞低端单片机,到了stm ...

  4. STM32 NVIC配置详解

    例程:  /* Configure one bit for preemption priority */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ...

  5. 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   是因为目标板的芯片处于休眠 ...

  6. MDK5 STM32编译问题汇总

    MDK5 STM32编译问题汇总 WIN8.KEIL-MDK-5 编译时,出现弹窗"The ARM C/C++ Compiler 已停止工作",关闭弹窗后,编译输出的窗口中出现如下 ...

  7. STM32学习及应用笔记一:SysTick定时器学习及应用

    这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过.最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下. 1.SysTick究竟是 ...

  8. STM32之DMA+ADC

    借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不 ...

  9. STM32之DAC君

    如花说得好:呃呃呃.是俗话说得好:有了ADC,怎可少了DAC..我觉得奇怪.今天我开头就直奔主题了.我想了想,总结了一句话:孙悟空纵然有七十二变.无论是变成猫也好,变成狗也罢.始终还是会变回他本身.所 ...

随机推荐

  1. Project_Lemon测评系统安装经验

    历经千辛万苦才在我自己的Linux上装好了Lemon 因为毕竟没有什么使用Linux的经验然后踩了不少坑,同时为了所以就有了这篇文章. 本教程大部分都基于Linux,若有需要Windows下的帮助请看 ...

  2. R2 day2

    简单写一下吧 emmmm,来晚了1h,没赶上,所以没交.......(捂脸 T1 开始读错题了诶 开烤1.2h后 发现是个傻逼题.... 排序一下,维护前缀最左,右端点 随机数据我跑的比他们都慢... ...

  3. [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树

    [BZOJ3080]Minimum Variance Spanning Tree/[BZOJ3754]Tree之最小方差树 题目大意: 给定一个\(n(n\le50)\)个点,\(m(m\le1000 ...

  4. Need help with git commit - Error : "error: cannot run gpg: No such file or directory error: could not run gpg. fatal: failed to write commit object"support (self.git)

    参考:https://www.reddit.com/r/git/comments/4jflp1/need_help_with_git_commit_error_error_cannot_run/ It ...

  5. failed to load class "org.sl4j.impl.StaticLoggerBinder"

    (1)要确保有properties文件在你的主项目的src下面 (2)https://www.slf4j.org/codes.html(这个是配置相关文件) (3)如果经过1.2步后问题依然存在,那么 ...

  6. MAC自动脚本

    链接: crontab 详细用法 定时任务 Linux crontab命令 定时任务 用法详解以及no crontab for root解决办法

  7. spring cloud: 使用consul来替换config server

    上一篇提到了,eureka 2.x官方停止更新后,可以用consul来替代,如果采用consul的话,其实config server也没必要继续使用了,consul自带kv存储,完全可以取代confi ...

  8. orm Lite的使用

    1.什么是ORM Lite orm Lite(Object Relationanl Mapping Lite)是一种用于持久化保存java对象的框架,相对于标准的ORM包来说. 2. Demo ●声明 ...

  9. JVM调优总结(7):调优方法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  10. CAP:Alantany 谈 CAP

    引用Alantany的话:“CAP理论提出就是针对分布式数据库环境的,所以,P这个属性是必须具备的.P就是在分布式环境中,由于网络的问题可能导致某个节点和其它节点失去联系,这时候就形成了P(parti ...