OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7709|回复: 6

在stm32f4上移植ds1302的程序(亲测有效)

[复制链接]

0

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-7-9
在线时间
16 小时
发表于 2016-10-29 20:28:50 | 显示全部楼层 |阅读模式
网上写的直接抄发现没用,然后自己动手,修修改改就出来了,欢迎大神指点硬件图
QQ图片20161029195258.png
io口用的是PC0,PC1,PC2,接了100k下拉电阻,晶振两端接了30pf的电容
ds1302.h
[mw_shl_code=c,true]#ifndef _DS1302_H
#define _DS1302_H

#include "sys.h"
#define DS1302_SDA_IN()               {GPIOC->MODER &= 0x0000000f;}
#define DS1302_SDA_OUT()       {GPIOC->MODER &= 0x0000000f;GPIOC->MODER |= 1<<4;}

#define RST                        PCout(0)        
#define SCLK                        PCout(1)      
#define DATA_OUT                        PCout(2)      
#define DATA_IN                     PCin(2)  

#define SECOND                      0x80
#define MINUTE                                   0x82
#define HOUR                  0x84
#define DATE                        0x86
#define MONTH                 0x88
#define WEEK                  0x8A
#define YEAR                                     0x8C
#define ENABLE                             0x8E

typedef struct
{
        u8 second;
        u8 minute;
        u8 hour;
        u8 date;
        u8 month;
        u8 week;
        u8 year;
}TIME;

void DS1302_Init(void);

void Write1302(unsigned char dat);
void WriteSet1302(unsigned char Cmd,unsigned char dat);
unsigned char Read1302(void);
unsigned char ReadSet1302(unsigned char Cmd);
void Time_Init(void);
void Get_Time(TIME* time);


#endif
[/mw_shl_code]

ds1302.c
[mw_shl_code=c,true]#include "ds1302.h"
#include "delay.h"

void DS1302_Init()
{
        GPIO_InitTypeDef  GPIO_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

  //GPIOC0,C1,C23&#245;ê&#188;&#187;ˉéè&#214;&#195;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
       
}

void Write1302(unsigned char dat)
{
        unsigned char i;
        SCLK=0;
        delay_us(2);
        for(i=0;i<8;i++)
        {
                DATA_OUT=dat&0x01;
                delay_us(2);
                SCLK=1;
                delay_us(2);
                SCLK=0;
                dat>>=1;
        }

}

void WriteSet1302(unsigned char Cmd,unsigned char dat)
{
        RST=0;
        SCLK=0;
        RST=1;
        delay_us(2);
        Write1302(Cmd);
        Write1302(dat);
        SCLK=1;
        RST=0;
}

unsigned char Read1302(void)
{
        unsigned char i,dat;
        delay_us(2);
        for(i=0;i<8;i++)
        {
                dat>>=1;
                if(DATA_IN==1)
                        dat|=0x80;
                SCLK=1;
                delay_us(2);
                SCLK=0;
                delay_us(2);
        }
return dat;
}


unsigned char ReadSet1302(unsigned char Cmd)
{
                unsigned char dat;
                RST=0;
                SCLK=0;
                RST=1;
                Write1302(Cmd);
                dat=Read1302();
                SCLK=1;
                RST=0;
                return dat;
}

void Time_Init()
{
        WriteSet1302(SECOND,0);
        WriteSet1302(MINUTE,0);
        WriteSet1302(HOUR,6);
        WriteSet1302(DATE,11);
        WriteSet1302(MONTH,11);
        WriteSet1302(WEEK,1);
        WriteSet1302(YEAR,0x16);

}



void Get_Time(TIME* time)
{
                u8 temp;
                time->second=ReadSet1302(SECOND|1);
                temp=time->second;
                time->second=(temp&=0x0f)+(time->second>>4)*10;
               
                time->minute=ReadSet1302(MINUTE|1);
                temp=time->minute;
                time->minute=(temp&=0x0f)+(time->minute>>4)*10;
               
                time->hour=ReadSet1302(HOUR|1);
                temp=time->hour;
                time->hour=(temp&=0x0f)+(time->hour>>4)*10;
               
                time->date=ReadSet1302(DATE|1);
                temp=time->date;
                time->date=(temp&=0x0f)+(time->date>>4)*10;
               
                time->month=ReadSet1302(MONTH|1);
                temp=time->month;
                time->month=(temp&=0x0f)+(time->month>>4)*10;
               
                time->week=ReadSet1302(WEEK|1);
                temp=time->week;
                time->week=(temp&=0x0f)+(time->week>>4)*10;
               
                time->year=ReadSet1302(YEAR|1);
                temp=time->year;
                time->year=(temp&=0x0f)+(time->year>>4)*10;
}
[/mw_shl_code]

main.c

[mw_shl_code=c,true]#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "ds1302.h"
#include "lcd.h"



int main(void)
{
       
        TIME time;
        delay_init(168);      
        uart_init(115200);               
        DS1302_Init();
        Time_Init();

                                        
          while(1)
        {                 
               
                Get_Time(&time);
                printf("%d",time.second);
               
                delay_ms(1000);
                               
        }
}
[/mw_shl_code]


写得不好,欢迎指点,就我知道的缺点
①没有充电函数
②没有开机自检
③没有写保护
不过基本的读写时间是可以进行了

第一次发帖,向原子哥问好,原子哥爆个照呗~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-4-13
在线时间
6 小时
发表于 2021-12-16 16:34:17 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-10-30 09:54:56 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-16 19:23:03 | 显示全部楼层
可以发个照片吗?效果是什么样的?
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-19 10:03:11 | 显示全部楼层
我现在就在做这个东西,但是没有搞明白,求大神指点
回复 支持 反对

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-4-19 21:18:30 | 显示全部楼层
大神出现吧,给点帮助
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2021-6-10
在线时间
1 小时
发表于 2021-8-17 14:37:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表