历史上的今天
返回首页

历史上的今天

今天是:2025年06月25日(星期三)

正在发生

2018年06月25日 | 基于STM32的DS1302时钟芯片驱动

2018-06-25 来源:eefocus

/*************************************************************************************************************************
* 函数 : DS1302.H
* 功能 :  DS1302头文件
* 参数 :  无
* 返回 :  无
* 依赖 :  底层读写函数
* 最后修改时间 : 
* 说明 : DS1302采用GPIO模拟SPI的方式DS1302 LSB格式,上升沿写 下降沿读  BCD码存储
* 参考 :
*************************************************************************************************************************/ 
#include "sys.h"
#include "DS1302.h"
#include "delay.h"
//#include "type.h"
#include "stdio.h"


u8 u8time[8];
u8 rtc_init[8] = {
58, //秒  0
                  11, //分 1
                  14, //小时2
                  12,//日 3
                  1,//月 4
                  4,//周  
                  16,//2016年 6
                  0,//写效许 7
};


/*************************************************************************************************************************
* 函数 : void DS1302_GPIO_Init(void)
* 功能 :  配置STM32的GPIO和SPI接口,用于连接 DS1302
* 参数 :  无
* 返回 :  无
* 依赖 :  GPIO库函数
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-9
* 最后修改时间 : 2017-1-4修改驱动
* 说明 : DS1302_DIO配置为开漏模式,此模式下能够实现真正的双向IO口
*************************************************************************************************************************/
void DS1302_GPIO_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//使能PA,PD端口时钟
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;  //IO口速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOA.8
}


 void Dio_In(void)
 {
GPIO_InitTypeDef  GPIO_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//使能PA,PD端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ; 
GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
 
void  DIO_Out(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);//使能PA,PD端口时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;//LED0-->PA.8 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOA.8
}
/*************************************************************************************************************************
*函数         :  void DS1302_WriteByte(u8 data)
*功能         :  写一个Byte到DS1302
*参数         :  data:要写入的Byte
*返回         :  无
*依赖 : 底层宏定义
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-09
* 最后修改时间: 
*说明         :  写一个字节的数据SCK上升沿写数据
*************************************************************************************************************************/
void DS1302_WriteByte(u8 addr,u8 data)
{
char  i=0;
  int Coda=0;
   Coda=(data<<8)|addr;
   En_Ss( );
  for(i=0;i<16;i++)
  {  
if((Coda&0x01)!=0)
         Set_Dio( );
       else
         Clr_Dio();
        Set_Sclk( );
        Coda=Coda>>1; 
        Clr_Sclk( );
  }
   Di_Ss( );
}




/*************************************************************************************************************************
*函数         :  u8 DS1302_ReadByte(u8 addr)
*功能         :  从DS1302SPI总线上读取一个字节
*参数         :  addr:寄存器地址
*返回         :  读取到的数据
*依赖 : 底层宏定义
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-09
* 最后修改时间: 
*说明         :  读一个字节的数据 SCK下降沿读数据
*************************************************************************************************************************/
u8 DS1302_ReadByte(u8 addr)
{
char i,Coda;
  Coda=addr;
  En_Ss( );
  for(i=0;i<8;i++)
  { 
if((Coda&0x01)!=0)
        Set_Dio( );
      else
        Clr_Dio( );
      Set_Sclk( );
          Coda=Coda>>1;
        Clr_Sclk( );
   }
  /************************************/
   Dio_In();   //读数据
     Coda=0;
   for(i=0;i<8;i++)
  {   
if( Read_Dio()!=0)
        Coda|=(1<        Set_Sclk( );
        Clr_Sclk( );
    }


   Di_Ss();
   DIO_Out();              
   return Coda ;
}




/*************************************************************************************************************************
*函数         :  void DS1302_WriteData(u8 addr,u8 data)
*功能         :  向指定寄存器写入一个字节的数据
*参数         :  addr:寄存器地址;data:需要写入的数据
*返回         :  无
*依赖 : 底层宏定义
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-09
* 最后修改时间: 
*说明         :  
*************************************************************************************************************************/
void DS1302_WriteData(u8 addr,u8 data)
{
Di_Ss();
Clr_Sclk();
delay_us(1);
En_Ss();
delay_us(2);
DS1302_WriteByte(addr,data);
Di_Ss();
Clr_Sclk();
delay_us(1);
}




/*************************************************************************************************************************
*函数         :  void DS1302_ReadTime(u8 addr,u8 time[8])
*功能         :  处理数据并通过串口打印
*参数         :  read:要写入的Byte
*返回         :  无
*依赖 : 底层宏定义
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-10
* 最后修改时间: 
*说明         :  
*************************************************************************************************************************/
void DS1302_ReadTime(u8 addr,u8 time[8])
{
char i,j,Coda;
u8 temp;
    Coda=addr;
En_Ss();
    for(i=0;i<8;i++)

if((Coda&0x01)!=0)
       Set_Dio();
      else
Clr_Dio();

      Set_Sclk();
      Coda=Coda>>1;
      Clr_Sclk();
    }
Dio_In();   //读数据
    for(i=0;i<8;i++ )
     { 
time[i]=0;
       for(j=0;j<8;j++ )
       { 
if( Read_Dio()!=0)
          time[i]|=(1<           Set_Sclk();
           Clr_Sclk();
        }
temp = time[i] / 16;
time[i] = temp * 10 + time[i] % 16;
      }
    Di_Ss();
    DIO_Out();     
}




/*************************************************************************************************************************
*函数         :  void DS1302_Settime(u8 *Buffer)
*功能         :  对时
*参数         :  要写入年 月 日 时 分 秒
*返回         :  无
*依赖 : 底层宏定义
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-10
* 最后修改时间: 
*说明         :  
*************************************************************************************************************************/
void DS1302_Settime(uint8_t addr,uint8_t time[8])
{
char i,j,ge;
int Coda=0;


  Coda=addr;
En_Ss();
for(i=0;i<8;i++)//时间地址
  { 
if((Coda&0x01)!=0)
     Set_Dio();
    else
Clr_Dio();
      Set_Sclk();
      Coda=Coda>>1;
      Clr_Sclk();
}
    
for(i=0;i<8;i++) //时间数据
 { 
ge=time[i]%10;//个位数部分
time[i]=(time[i]/10)*16+ge;
Coda=time[i];
   for(j=0;j<8;j++)
   {  
if((Coda&0x01)!=0)
       Set_Dio();
       else
Clr_Dio(); 
 
         Set_Sclk();
         Coda=Coda>>1;
         Clr_Sclk();    
    }
}
  Di_Ss();

}



/*************************************************************************************************************************
* 函数 : DS1302.H
* 功能 :  DS1302头文件
* 参数 :  无
* 返回 :  无
* 依赖 :  底层读写函数
* 作者 :  li_qcxy@126.com
* 时间 :  2016-12-9
* 最后修改时间 : 
* 说明 : DS1302采用GPIO模拟SPI的方式DS1302 LSB格式,上升沿写 下降沿读
*************************************************************************************************************************/ 
#ifndef __DS1302_H
#define __DS1302_H


#include "sys.h"
//#include "type.h"
/*****************DS1302控制命令***************************************
*BIT7 BIT6  BIT5 BIT4  BIT3 BIT2  BIT1 BIT0
* 0数据不能写入 存取日历时钟DataAddr4 Addr3 Addr2Addr1 Addr0写操作
* 1必须为1  存取RAM时钟Data 读操作
**********************************************************************/


//寄存器地址
typedef enum
{
DS1302_RdSec  = 0x81,  //BIT7: 0正常工作; 1:低功耗模式
DS1302_RdMin  = 0x83,
DS1302_RdHour = 0x85,//BIT5: 0运行为12时; 1:24时
DS1302_RdDate  = 0x87,
DS1302_RdMonth= 0x89,
DS1302_RdWeek  = 0x8b,
DS1302_RdYear  = 0x8d,
DS1302_RdProtect= 0x8f,//读保护
DS1302_RdTrickleCharge= 0x91,
DS1302_RdClockBurst= 0xbf,
DS1302_WrSec  = 0x80,  //BIT7: 0正常工作; 1:低功耗模式
DS1302_WrMin  = 0x82,
DS1302_WrHour  = 0x84,  //BIT5: 0运行为12时; 1:24时
DS1302_WrDate  = 0x86,
DS1302_WrMonth= 0x88,
DS1302_WrWeek  = 0x8a,
DS1302_WrYear  = 0x8c,
DS1302_WrProtect= 0x8e,//写保护
DS1302_WrTrickleCharge= 0x90,
}DS1302_RegAddr;


typedef enum
{
DS1302_WrClockBurst= 0xbe,//写时钟突发模式
DS1302_RdRamBurst= 0xbf,//读时钟突发模式
DS1302_WrRAMBurst= 0xfe,//写RAM突发模式
DS1302_RdRAMBurst= 0xff,//读RAM突发模式
}DS1302_MODE;


//定义时间结构体
typedef struct
{
unsigned char sec;
unsigned char min;
unsigned char hour;
unsigned char day;
unsigned char month;
unsigned char year;
}TIME_TypeDef;


//*****************DS1302控制命令*******************
//相对应的IO口配置移植时修改
#define DS1302_PORT GPIOB
#define DS1302_SCK GPIO_Pin_6//DS1302_SCK
#define DS1302_DIO GPIO_Pin_7//DS1302_DIO
#define DS1302_CE GPIO_Pin_5//DS1302_CE


//寄存器IO口操作状态
#define Clr_Sclk() (GPIO_ResetBits(DS1302_PORT, DS1302_SCK))
#define Set_Sclk() (GPIO_SetBits(DS1302_PORT, DS1302_SCK))


#define Clr_Dio() (GPIO_ResetBits(DS1302_PORT, DS1302_DIO))
#define Set_Dio() (GPIO_SetBits(DS1302_PORT, DS1302_DIO))


#define Di_Ss() (GPIO_ResetBits(DS1302_PORT, DS1302_CE))
#define En_Ss() (GPIO_SetBits(DS1302_PORT, DS1302_CE))


#define Read_Dio() (GPIO_ReadInputDataBit(DS1302_PORT, DS1302_DIO))


extern u8 rtc_init[8];
extern u8 u8time[8];
/**********************************************函数声明**************************************************/
void DS1302_GPIO_Init(void); //配置STM32的GPIO和SPI接口
void DS1302_Settime(uint8_t addr,uint8_t time[8]);  //设置时间
void DS1302_ReadTime(u8 addr,u8 time[8]); //读取DS1302时间
#endif


推荐阅读

史海拾趣

Condor公司的发展小趣事

关于Condor公司在电子行业的发展,以下是五个相关故事:

  1. Condor的创始与早期发展

Condor公司成立于1893年,起初主要涉及离心机、挤奶机以及泵的生产。随着技术的不断进步和市场需求的变化,公司逐渐转型,开始专注于压力和液位控制组件及系统解决方案的研发与生产。这一转变使得Condor在电子行业中崭露头角,为其后续的发展奠定了坚实的基础。

  1. 专利技术的突破

1935年,Condor取得了世界上的泵压力开关上的第一个专利,这一创新性的技术突破为公司的快速发展注入了新的动力。随着这项专利技术的应用,Condor的产品开始在各种工业领域中得到广泛应用,特别是在需要精确控制压力和液位的场景中,如汽车、冶金、水火核风电等行业。

  1. 国际市场的拓展与合作

随着全球化进程的加速,Condor开始积极拓展国际市场。公司与多个国家的合作伙伴建立了长期稳定的合作关系,共同开发新产品,拓展新的应用领域。这一战略举措不仅提升了Condor在全球电子行业中的影响力,也为其带来了更多的商业机会。

  1. 产品质量的持续提升

Condor一直坚持以最高的质量要求来生产每一款产品。为了确保产品质量,公司在生产过程中严格把控每一个环节,从原材料采购到最终的产品测试,都遵循严格的标准和流程。这种对质量的执着追求,使得Condor的产品在市场上赢得了良好的口碑和客户的信赖。

  1. 技术创新的持续推进

作为家族企业,Condor始终保持着对技术创新的热情和投入。公司不断引进新的技术和设备,优化生产流程,提高产品的性能和可靠性。同时,Condor还积极与科研机构和高校合作,共同研发新的技术和产品,以满足市场不断变化的需求。这种持续的技术创新为Condor在电子行业中保持领先地位提供了有力支持。

以上五个故事展示了Condor公司在电子行业中的发展历程和关键转折点,体现了其对技术、质量和市场的敏锐洞察力和持续创新精神。如需更多信息,建议查阅Condor公司官网或相关新闻报道。

HOPERF公司的发展小趣事

为了进一步提升生产效率和产品质量,HOPERF在无锡太湖科技园建立了3万平方米的现代化生产基地。该基地引进了德国、美国等地区的先进封装测试生产设备和高精密测试测量仪器,并严格按照ISO9001国际质量认证体系进行生产管理。这种高标准的生产管理流程确保了产品质量的可靠性和稳定性,赢得了国内外客户的广泛认可和信赖。

American Power Devices Inc公司的发展小趣事

近年来,电子行业面临着巨大的变革,新技术、新产品层出不穷。为了应对这一挑战,APD公司积极调整战略,加大在新能源、物联网等领域的投入。同时,公司还注重人才培养和引进,通过搭建良好的人才梯队,为公司的创新发展提供了有力保障。

Evans Capacitor Company公司的发展小趣事

随着市场竞争的加剧,ECC意识到单纯的技术创新已经不足以保持领先地位。因此,公司开始注重产品品质的提升。ECC引入了严格的质量管理体系,从原材料采购到生产流程,再到成品检测,每一个环节都严格把控。这一举措使得ECC的产品质量得到了显著提升,赢得了客户的广泛信任。

Black Box Corporation公司的发展小趣事

在快速发展的同时,Black Box也非常注重企业文化和人才建设。公司倡导开放、创新、协作的企业文化,鼓励员工提出新的想法和建议。同时,公司还建立了完善的人才培养和晋升机制,为员工的职业发展提供了广阔的空间。这些举措不仅吸引了大量优秀人才加入Black Box,也提高了公司的整体竞争力。

以上五个故事框架仅是基于Black Box Corporation的一般情况和电子行业趋势的假设性构建。实际的发展过程可能更加复杂和多样,需要具体的公司历史资料和行业数据来支撑。如果需要更详细和准确的故事,建议查阅Black Box Corporation的官方资料、相关新闻报道或行业研究报告。

Cooper Industries公司的发展小趣事

在照明领域,Cooper Industries同样展现出了强大的实力。1987年,公司收购了英国McGraw-Edison,并成立了“库柏照明”事业部,这一举措使库柏照明迅速成为世界上最大的商业、工业、道路和住宅照明装置的制造商之一。此后,公司不断在照明领域进行创新和突破,如在2007年成功收购以LED灯具著称的io Lighting灯具公司,进一步巩固了其在节能灯具市场的地位。这些努力使得库柏照明在全球范围内享有极高的声誉和市场份额。

问答坊 | AI 解惑

安防监控、监控工程(深圳市鑫达莱科技有限公司网络监控部)

深圳市鑫达莱科技有限公司网络工程部是由在台湾著名的CCTV 厂商杰士安(JSA-CCTV)电子股份和鑫达莱公司注资支持下而成立的智能化系统集成公司, 是一家专业提供视频监控系统、防盗报警系统、停车场系统、网络工程等智能化系统集成为一体的高科技企业 ...…

查看全部问答>

Windows ce的数据库

在PC上怎么将一个TXT文件导入到一个Windows ce的数据库文件里面,用什么软件,怎么使用。网上有个Sybase Central ,不过找不到下载地址。谁有的话发个给我,谢谢!邮箱:yhnujm258147@163.com…

查看全部问答>

编制内核问题请教

哪位遇见过这样的问题?怎么解决啊?帮帮忙吧! CeNlsCmp:   Total for all locales: 77588 bytes CeNlsCmp: Writing out calendars CeNlsCmp:     Calendar 1: 28 bytes CeNlsCmp:   Total for all c ...…

查看全部问答>

关于短信猫TC35无法注册网络的问题?

大家好:     我使用西门子TC35模块短信猫用超级终端连接显示已经连接(AT返回OK), 执行(AT+CREG?返回0,3)网络注册拒绝的意思,我换过3张卡均是此问题, 但可以读出手机卡上的短信。 请问用过此设备的同志们如何能注册到网 ...…

查看全部问答>

谁能给我个数摸转换的示例程序给我呢?

如题,我因为要做毕业设计,没有接触过这方面的设计,所以想有个示例作为参考 谢谢了哈…

查看全部问答>

建议SOSO搞个短信模块的团购,有兴趣的跟帖

建议SOSO搞个短信模块的团购,有兴趣的跟帖,短信模块是智能家居的一部分,实际用途也很多,可以先定一个型号,然后联系团购…

查看全部问答>

关于堆栈溢出请教

//端口2中断// #pragma vector=PORT2_VECTOR __interrupt void waterflow() { if((P2IFG&BIT1)==BIT1)//插卡进入信号中断 { SET_GIE; P2IE&=~BIT1; P2IFG&=~BIT1;//清除中断标志 .... P2IE|=BIT1; LPM3 ...…

查看全部问答>

求志同道合の人士!

今天查资料,偶然进论坛晃悠了一下,觉得坛里搞电子软硬件的XDJM还不少我一直以来均有自己搞产品的想法,也积累了不少的市场需求和产品创意,但苦于没有可以将产品理念付诸于实物的团队。有感而发了,一是新人报到,二是想看看坛里有没有志同道合的 ...…

查看全部问答>

UARTwrite和UARTCharPut的区别

如题,想问下UARTwrite(const char *pcBuf,unsigned long ulLen)和UARTCharPut (unsigned long ulBase, unsigned char ucData) 的区别…

查看全部问答>

TI电源使用小提示—开发板抢购_2

用过TI的DC-DC,有一点小经验。 TPS5XXXX,忘了哪个具体型号了。   外围电路有电感和电容,   在做某项试验时,发现电源输出纹波过大,导致dsp和fpga不能正常工作。 经过反复试验排查,发现是由于低温时电感的感抗值发生了变化,当 ...…

查看全部问答>