新闻中心

EEPW首页>嵌入式系统>设计应用> STM32学习笔记——实时时钟RTC

STM32学习笔记——实时时钟RTC

作者: 时间:2016-11-28 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/201611/322893.htm

//通过该例程,学会RTC的配置和读取计数值,数值格式的转换的方法,要想控制好的话,要多看资料,多看程序

#include"stm32f10x_lib.h"

vu32TimeDisplay=0;

ErrorStatusHSEStartUpStatus;

u32THH=0,TMM=0,TSS=0;

unsignedintjj=0;

unsignedintLedNumVal=0,LedNumVal1=0;//变量定义

//此表为LED的字模,共阴数码管0-9-

unsignedcharDisp_Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段码控制

//此表为8个数码管位选控制,共阴数码管1-8个-

unsignedchardispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};//位选控制查表的方法控制

unsignedintLedOut[10];//变量定义

voidRCC_Configuration(void);

voidGPIO_Configuration(void);

voidUSART_Configuration(void);

voidRTC_Configuration(void);

voidNVIC_Configuration(void);

u32Time_Regulate(void);

voidTime_Adjust(void);

voidTime_Show(void);

voidTime_Display(u32TimeVar);

voidDelay(vu32nCount);

intmain(void)

{

#ifdefDEBUG

debug();

#endif

RCC_Configuration();//系统时钟配置函数

NVIC_Configuration();//NVIC配置函数

GPIO_Configuration();//配置GPIO

//从指定的后备寄存器中读取数据,参数用来选择后备寄存器,可以是BKP_DR1~BKP_DR1010个后备寄存器

if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)//???为什么要检测0xA5A5

{

//配置RTC

RTC_Configuration();

Time_Adjust();

BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//向指定的后备寄存器中写入用户程序数据这里是向BKP_DR1中写入0xA5A5

}

else

{

if(RCC_GetFlagStatus(RCC_FLAG_PORRST)!=RESET)//检查指定的RCC标志位设置与否,这里检查POR/PDR复位

//{

RTC_WaitForSynchro();//等待最近一次对RTC寄存器的写操作完成,也即等待RTC寄存器同步

RTC_ITConfig(RTC_IT_SEC,ENABLE);//使能或失能指定的RTC中断第一个参数指定待配置的RTC中断源,可以是RTC_IT_SEC:秒中断

//RTC_IT_OW:溢出中断,RTC_IT_ALR:闹钟中断。第二个参数可以是ENABLE或DISABLE

RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成

}

#ifdefRTCClockOutput_Enable

//使能或失能APB1外设时钟具体说明详见《STM32函数说明》P208

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);

PWR_BackupAccessCmd(ENABLE);//使能或失能RTC和后备寄存器访问

//该函数使能或失能管脚的侵入检测功能这里是失能

BKP_TamperPinCmd(DISABLE);

//调用该函数前必须先失能管脚的侵入检测功能

BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);//选择在侵入检测管脚上输出的RTC时钟源

//参数指定RTC输出时钟源,可以是:BKP_RTCOutputSource_CalibClock:侵入检测管脚上输出,其时钟频率为RTC时钟除以64

//BKP_RTCOutputSource_None:侵入检测管脚上无RTC输出,BKP_RTCOutputSource_Alarm:侵入检测管脚上输出RTC闹钟脉冲

//BKP_RTCOutputSource_Second:侵入检测管脚上输出RTC秒脉冲

#endif

//清除复位标志

RCC_ClearFlag();

while(1)

{unsignedinti;

//if(++jj>=0x01ff)

//{LedNumVal1++;

//jj=0;

//}

//得到时间并显示RTC_GetCounter():获得RTC计数器的值返回值是u32类型的RTC计数器的值

Time_Display(RTC_GetCounter());

LedOut[0]=Disp_Tab[THH0/10];//时

LedOut[1]=Disp_Tab[THH];

LedOut[2]=~0XBF;//横线

LedOut[3]=Disp_Tab[TMM0/10];//分

LedOut[4]=Disp_Tab[TMM];

LedOut[5]=~0XBF;//横线

LedOut[6]=Disp_Tab[TSS0/10];//十位

LedOut[7]=Disp_Tab[TSS];//个位

for(i=0;i<8;i++)

{

//BSRR:端口位设置/复位寄存器,详细的GPIO寄存器结构体说明见《STM32函数说明》P120

GPIOB->BSRR=LedOut[i]<<8&0xFF00;

GPIOB->BRR=(~(LedOut[i]<<8))&0xFF00;//BRR:端口位复位寄存器

GPIOB->BSRR=dispbit[i]&0x00FF;//使用查表法进行位选

GPIOB->BRR=(~dispbit[i])&0x00FF;

Delay(0x000ff);//扫描间隔时间

}

}//while

}

voidDelay(vu32nCount)

{

for(;nCount!=0;nCount--);

}

voidRCC_Configuration(void)

{

//复位RCC外部设备寄存器到默认值

RCC_DeInit();

//打开外部高速晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟准备好

HSEStartUpStatus=RCC_WaitForHSEStartUp();


上一页 1 2 下一页

关键词:STM32实时时钟RT

评论


技术专区

关闭