//经过该例程,学会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();
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/256330.html