基于stm32f103zet6的DS1302學(xué)習(xí)
由于硬件出了問題,也就是外部低速晶振沒用,震不起來,然后查看了網(wǎng)上的帖子,STM32的RTC果然口碑不怎么樣,所以果斷換DS1302,在移植的過程中還算順利,記錄下來吧,也算對自己的總結(jié)吧!
1、所謂的DS1302
這里面也指明了簡單的SPI協(xié)議
然后就直接上代碼了,注釋很詳細的!基本實現(xiàn)單行注釋
1、主函數(shù)main
#include"stm32f10x.h"
#include"SysTick.h"
#include"Delay.h"
#include"Usart.h"
#include"stdio.h"
#include"DS1302.h"
/*******由于沒有做外設(shè)測試的程序是:按鍵PA0僅一個LED燈******/
/*******由于沒有做外設(shè)測試的程序是:串口采用的是PA9->(T<->T),PA9->(R<->R)*****/
/*******由于沒有做外設(shè)測試的程序是:ds1302clk<->PA4
ds1302dat<->PA5
ds1302rst<->PA6*****/
externuint8_twrite[];
externuint8_tread[];
intmain(void)
{
//uint8_ttime[]={0,0,12,11,11,1,13};
//初始化系統(tǒng)定時器
SysTick_Init();
USART1_Config();
ds1302_GPIO_Configuration();//一定別忘記了配置GPIO
printf("rn("__DATE__"-"__TIME__")rn");
//ds1302_init(write,time);//設(shè)置1302的初始時間
ds1302_data(read);
while(1);//這個得加,不然的話會有尾巴是亂碼?。?!
}
/*******************************************************************************
**文件名稱:ds1302.c
**編譯環(huán)境:RealViewMDK-ARM4.53
**文件作者:
**功能說明:ds1302相關(guān)函數(shù)定義
**軟件協(xié)議:模擬SPI協(xié)議
**簡介:clk上升沿發(fā)送數(shù)據(jù),clk下降沿接收數(shù)據(jù)
: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配置為開漏模式,此模式下能夠?qū)崿F(xiàn)真正的雙向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)//寫一個字節(jié)的數(shù)據(jù)sck上升沿寫數(shù)據(jù)
{
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)