写在前面:
其实并不困难,RTC已经整合在STM32芯片内部,你可以理解为一个比如AT24C02在芯片里面。
比如你现在要做一个时钟,你需要什么?
A一个一秒钟增加1的一个数
B一个把这个数转化成年月日的算法。
写在这个数u32我们放到全局中,每1S就增加一个,我们用32.768K的晶振,
因为越高越安全,其实我们会分频的,就是1s动一下。
准备空米快
typedef struct
{
u8 sec;
u8 min;
u8 hour;
u8 week;
u8 day;
u8 mon;
u8 year;
}_TM;
typedef struct
{
void (*init)(void);
void (*GetTime)(_TM *);
void (*SetTime)(_TM *);
}_RTC;
确定RTC需要干的活儿
很快吧init写好 抄袭刘洋的代码
void STEP1_RCC(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void STEP2_NVIC(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void RTC_Configuration(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
//允许访问BKP区域
PWR_BackupAccessCmd(ENABLE);
//复位BKP
BKP_DeInit();
//使能外部低速晶振 32.768K
RCC_LSEConfig(RCC_LSE_ON);
//等待外部低速晶振就绪
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);
//选择RTC外部时钟为低速晶振 32.768K
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
//使能RTC时钟
RCC_RTCCLKCmd(ENABLE);
//等待RTC寄存器同步
RTC_WaitForSynchro();
//等待写RTC寄存器完成
RTC_WaitForLastTask();
//使能RTC秒中断
RTC_ITConfig(RTC_IT_SEC,ENABLE);
//等待写RTC寄存器完成
RTC_WaitForLastTask();
//设置预分频
RTC_SetPrescaler(32767);
//等待写RTC寄存器完成
RTC_WaitForLastTask();
}
void Clock_Init(void)
{
if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
{
//第一次运行 初始化设置
//RTC初始化
RTC_Configuration();
//等待写RTC寄存器完成
RTC_WaitForLastTask();
//设置时间初值
RTC_SetCounter(0xA442);
//等待写RTC寄存器完成
RTC_WaitForLastTask();
//写配置标志
BKP_WriteBackupRegister(BKP_DR1,0xA5A5);
}
else
{
//等待RTC寄存器同步
RTC_WaitForSynchro();
//等待写RTC寄存器完成
RTC_WaitForLastTask();
//使能RTC秒中断
RTC_ITConfig(RTC_IT_SEC,ENABLE);
//等待写RTC寄存器完成
RTC_WaitForLastTask();
}
RCC_ClearFlag();//清除复位标志;
}
void RTC_Init(void)
{
STEP1_RCC();
STEP2_NVIC();
Clock_Init();
}
算法https://blog.csdn.net/wyzjoyful/article/details/52745918?open_source=weibo_search
中断
extern RTC_SEC;
#if 1
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)//读取中断标志
{
RTC_ClearITPendingBit(RTC_IT_SEC);//清楚中断标志
RTC_SEC=1;//秒中断标志
}
}
问题遗留:
我现在是自己写的算法,GEEK代码呢?看不懂 头文件在库里面不在工程里面 它的2个算法
|