基于stm32f103zet6的DS1302学习
扫描二维码
随时随地手机看文章
由于硬件出了问题,也就是外部低速晶振没用,震不起来,然后查看了网上的帖子,STM32的RTC果然口碑不怎么样,所以果断换DS1302,在移植的过程中还算顺利,记录下来吧,也算对自己的总结吧!
1、所谓的DS1302
这里面也指明了简单的SPI协议
然后就直接上代码了,注释很详细的!基本实现单行注释
1、主函数main
#include"stm32f10x.h"
#include"SysTick.h"
#include"Delay.h"
#include"Usart.h"
#include"stdio.h"
#include"DS1302.h"
/*******由于没有做外设测试的程序是:按键PA0仅一个LED灯******/
/*******由于没有做外设测试的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/
/*******由于没有做外设测试的程序是:ds1302clk<->PA4
ds1302dat<->PA5
ds1302rst<->PA6*****/
externuint8_twrite[];
externuint8_tread[];
intmain(void)
{
//uint8_ttime[]={0,0,12,11,11,1,13};
//初始化系统定时器
SysTick_Init();
USART1_Config();
ds1302_GPIO_Configuration();//一定别忘记了配置GPIO
printf("rn("__DATE__"-"__TIME__")rn");
//ds1302_init(write,time);//设置1302的初始时间
ds1302_data(read);
while(1);//这个得加,不然的话会有尾巴是乱码!!!
}
/*******************************************************************************
**文件名称:ds1302.c
**编译环境:RealViewMDK-ARM4.53
**文件作者:
**功能说明:ds1302相关函数定义
**软件协议:模拟SPI协议
**简介:clk上升沿发送数据,clk下降沿接收数据
:typedefunsignedcharuint8_t;
**
**
**
*******************************************************************************/
/*包含头文件*****************************************************************/
#include"ds1302.h"
#include"stdio.h"
#include"Delay.h"
uint8_tread[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//读秒、分、时、日、月、周、年的寄存器地址
uint8_twrite[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒、分、时、日、月、周、年的寄存器地址
/*PA4、PA6为输出*/
/*PA5配置为开漏模式,此模式下能够实现真正的双向IO口*/
voidds1302_GPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=ds1302clk|ds1302rst;//clk、rst配置为输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;//IO配置为双向
GPIO_InitStruct.GPIO_Pin=ds1302dat;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
voidwrite_1302byte(uint8_tdat)//写一个字节的数据sck上升沿写数据
{
uint8_ti=0;
GPIO_ResetBits(GPIOA,ds1302clk);//ds1302clk=0
Delay_us(2);//延时大约2us
for(i=0;i<8;i++)
{
GPIO_ResetBits(GPIOA,ds1302clk);//ds1302clk=0;
if(dat&0x01)
GPIO_SetBits(GPIOA,ds1302dat);
else //ds1302dat=(dat&0x01)