STM32的RTC模块

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:23   2068   0

写在前面:

其实并不困难,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个算法

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP