//通过该例程,学会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();
if(HSEStartUpStatus==SUCCESS)//外部高速时钟已经准别好
{
//开启FLASH的预取功能
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//FLASH延迟2个周期
FLASH_SetLatency(FLASH_Latency_2);
//配置AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);