#include <sys_ds1302zn.h>
void ds1302_gpio_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(DS1302_CE_RCC | DS1302_SCLK_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS1302_CE_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(DS1302_CE_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = DS1302_SCLK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(DS1302_SCLK_PORT, &GPIO_InitStructure);
}
void ds1032_DATAOUT_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(DS1302_DATA_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS1302_DATA_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);
DATA_L;
}
void ds1032_DATAINPUT_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(DS1302_DATA_RCC, ENABLE);
GPIO_InitStructure.GPIO_Pin = DS1302_DATA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(DS1302_DATA_PORT, &GPIO_InitStructure);
}
void ds1302_write_onebyte(uint8_t data)
{
ds1032_DATAOUT_init();
uint8_t count=0;
SCLK_L;
for(count=0;count<8;count++)
{
SCLK_L;
if(data&0x01) DATA_H;
else DATA_L;
SCLK_H;
data>>=1;
}
}
void ds1302_wirte_rig(uint8_t address,uint8_t data)
{
uint8_t temp1=address;
uint8_t temp2=data;
CE_L;SCLK_L;delay_us_dwt(1);
CE_H;delay_us_dwt(2);
ds1302_write_onebyte(temp1);
ds1302_write_onebyte(temp2);
CE_L;SCLK_L;delay_us_dwt(2);
}
uint8_t ds1302_read_rig(uint8_t address)
{
uint8_t temp3=address;
uint8_t count=0;
uint8_t return_data=0x00;
CE_L;SCLK_L;delay_us_dwt(3);
CE_H;delay_us_dwt(3);
ds1302_write_onebyte(temp3);
ds1032_DATAINPUT_init();
delay_us_dwt(2);
for(count=0;count<8;count++)
{
delay_us_dwt(2);
return_data>>=1;
SCLK_H;delay_us_dwt(4);
SCLK_L;delay_us_dwt(14);
if(GPIO_ReadInputDataBit(DS1302_DATA_PORT,DS1302_DATA_PIN))
return_data=return_data|0x80;
}
delay_us_dwt(2);
CE_L;DATA_L;
return return_data;
}
void ds1032_SetTime(uint8_t year,uint8_t mon,uint8_t date,uint8_t hours,uint8_t min,uint8_t sec,uint8_t week)
{
ds1302_wirte_rig(0x8e,0x00);
ds1302_wirte_rig(0x80,sec);
ds1302_wirte_rig(0x82,min);
ds1302_wirte_rig(0x84,hours);
ds1302_wirte_rig(0x86,date);
ds1302_wirte_rig(0x88,mon);
ds1302_wirte_rig(0x8a,week);
ds1302_wirte_rig(0x8c,year);
ds1302_wirte_rig(0x8e,0x80);
}
TIMEData ds1032_read_realTime(void)
{
TIMEData time;
uint8_t read_time[7];
read_time[0]=ds1302_read_rig(0x81);
read_time[1]=ds1302_read_rig(0x83);
read_time[2]=ds1302_read_rig(0x85);
read_time[3]=ds1302_read_rig(0x87);
read_time[4]=ds1302_read_rig(0x89);
read_time[5]=ds1302_read_rig(0x8B);
read_time[6]=ds1302_read_rig(0x8D);
time.second=(read_time[0]>>4)*10+(read_time[0]&0x0f);
time.minute=((read_time[1]>>4)&(0x07))*10+(read_time[1]&0x0f);
time.hour =(read_time[2]>>4)*10+(read_time[2]&0x0f);
time.day =(read_time[3]>>4)*10+(read_time[3]&0x0f);
time.month =(read_time[4]>>4)*10+(read_time[4]&0x0f);
time.week =read_time[5];
time.year =(read_time[6]>>4)*10+(read_time[6]&0x0f)+2000;
return time;
}
void ds1032_init(void)
{
ds1302_gpio_init();
HAL_Delay(5);
HAL_Delay(5);
}
#ifndef _SYS_DS1302ZN_H_
#define _SYS_DS1302ZN_H_
#include <stm32f4xx.h>
#include <stm32f4xx_it.h>
#include <stdio.h>
#define DS1302_CE_RCC RCC_AHB1Periph_GPIOB
#define DS1302_CE_PORT GPIOB
#define DS1302_CE_PIN GPIO_Pin_8
#define DS1302_SCLK_RCC RCC_AHB1Periph_GPIOB
#define DS1302_SCLK_PORT GPIOB
#define DS1302_SCLK_PIN GPIO_Pin_6
#define DS1302_DATA_RCC RCC_AHB1Periph_GPIOB
#define DS1302_DATA_PORT GPIOB
#define DS1302_DATA_PIN GPIO_Pin_7
#define CE_L GPIO_ResetBits(DS1302_CE_PORT,DS1302_CE_PIN)
#define CE_H GPIO_SetBits(DS1302_CE_PORT,DS1302_CE_PIN)
#define SCLK_L GPIO_ResetBits(DS1302_SCLK_PORT,DS1302_SCLK_PIN)
#define SCLK_H GPIO_SetBits(DS1302_SCLK_PORT,DS1302_SCLK_PIN)
#define DATA_L GPIO_ResetBits(DS1302_DATA_PORT,DS1302_DATA_PIN)
#define DATA_H GPIO_SetBits(DS1302_DATA_PORT,DS1302_DATA_PIN)
typedef struct
{
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
uint8_t week;
}TIMEData;
extern TIMEData TimeData;
extern void ds1032_init(void);
extern void ds1302_gpio_init(void);
extern TIMEData ds1032_read_realTime(void);
extern void ds1302_wirte_rig(uint8_t address,uint8_t data);
extern uint8_t ds1302_read_rig(uint8_t address);
#endif
int main(void){
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置系统中断优先级分组2
SysClockSet(USE_HSE,168); //外部晶振168mhz
Sys_TickInit(168000000/1000);
DWT_Init();
usart_init(1,115200,0);
TIMEData t;
ds1032_init();
while(1){
t = ds1032_read_realTime();
printf("%04d-%02d-%02d %02d:%02d:%02d\\\\r\\\\n",t.year,t.month,t.day,t.hour,t.minute,t.second);
HAL_Delay(1000);
}
}
输出了以下这样的错乱时间,
2055-55-55 55:55:55
2056-56-56 56:56:56
2057-57-57 57:57:57
2058-58-58 58:58:58
2059-59-59 59:59:59
2000-00-00 00:00:00
2001-01-01 01:01:01
2002-02-02 02:02:02
2003-03-03 03:03:03
2004-04-04 04:04:04
2005-05-05 05:05:05
2006-06-06 06:06:06
2007-07-07 07:07:07
2008-08-08 08:08:08
2009-09-09 09:09:09
2010-10-10 10:10:10
2011-11-11 11:11:11
2012-12-12 12:12:12
2013-13-13 13:13:13
2014-14-14 14:14:14
2015-15-15 15:15:15
2016-16-16 16:16:16
2017-17-17 17:17:17
2018-18-18 18:18:18
2019-19-19 19:19:19
2020-20-20 20:20:20
2021-21-21 21:21:21
2022-22-22 22:22:22
2023-23-23 23:23:23
2024-24-24 24:24:24
2025-25-25 25:25:25
2026-26-26 26:26:26
2027-27-27 27:27:27
2028-28-28 28:28:28