头文件:
#ifndef __DS1302_H
#define __DS1302_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "systick.h"
#define CE_L GPIO_ResetBits(GPIOC,GPIO_Pin_4)
#define CE_H GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define SCLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_6)
#define SCLK_H GPIO_SetBits(GPIOA,GPIO_Pin_6)
#define DATA_L GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define DATA_H GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define Read_IO GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)
void ds1302_gpio_init(void);
void ds1032_init(void);
void ds1032_read_time(void);
#endif
源文件:
#include "ds1302.h"
u8 read_time[7];
TIMEData TimeData;
void ds1302_gpio_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_ResetBits(GPIOC,GPIO_Pin_4);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_6);
}
void ds1032_DATAOUT_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}
void ds1032_DATAINPUT_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void ds1302_write_onebyte(uint8_t data)
{
uint8_t count=0;
ds1032_DATAOUT_init();
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;
CE_H;
ds1302_write_onebyte(temp1);
ds1302_write_onebyte(temp2);
CE_L;
SCLK_L;
}
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;
CE_H;
ds1302_write_onebyte(temp3);
ds1032_DATAINPUT_init();
for(count=0;count<8;count++)
{
return_data>>=1;
SCLK_H;delay_us(4);
SCLK_L;delay_us(14);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7))
{return_data=return_data|0x80;}
}
CE_L;
DATA_L;
return return_data;
}
void ds1032_init()
{
ds1302_wirte_rig(0x8e,0x00);
ds1302_wirte_rig(0x80,0x37);
ds1302_wirte_rig(0x82,0x58);
ds1302_wirte_rig(0x84,0x23);
ds1302_wirte_rig(0x86,0x30);
ds1302_wirte_rig(0x88,0x09);
ds1302_wirte_rig(0x8a,0x07);
ds1302_wirte_rig(0x8c,0x20);
ds1302_wirte_rig(0x80,0x19);
ds1302_wirte_rig(0x8e,0x80);
}
void ds1032_read_time()
{
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);
}
注:进行I/O输入与输出切换时,可以直接操作寄存器,这样将会减少程序运行时间。
|