0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32入门学习笔记之RTC实验(下)

jf_78858299 来源:滑小稽笔记 作者:电子威廉希尔官方网站 园地 2023-02-16 11:22 次阅读

(2)创建rtc.c文件并输入以下代码。

#include "rtc.h"
/***************************************************
Name    :RTC_Init
Fuction    :RTC初始化
Parameter  :None
Return    :None
***************************************************/
void RTC_Init()
{
  if( BKP->DR1!=0x5050 )
  {
    RCC->APB1ENR |= 1<<28 ;                                      //使能PWR时钟
    RCC->APB1ENR |= 1<<27 ;                                      //使能BKP时钟,RTC校准在BKP相关寄存器
    PWR->CR |= 1<<8 ;                                        //取消BKP相关寄存器写保护
    RCC->BDCR |= 1<<16 ;                                      //备份区域软复位
    RCC->BDCR &= ~( 1<<16 ) ;                                    //备份区域软复位结束
    RCC->BDCR |= 1<<0 ;                                        //开启外部低速振荡器
    while( ( RCC->BDCR&0x02 )!=0x02 ) ;                                //等待外部时钟就绪
    RCC->BDCR |= 1<<8 ;                                        //LSI作为RTC时钟
    RCC->BDCR |= 1<<15 ;                                      //RTC时钟使能
    while( !( RTC->CRL&( 1<<5 ) ) ) ;                                //等待RTC寄存器最后一次操作完成
    while( !( RTC->CRL&( 1<<3 ) ) ) ;                                //等待RTC寄存器同步完成
    RTC->CRH &= ~( 7<<0 ) ;                                      //不允许中断,CRH寄存器低三位有效
    while( !( RTC->CRL&( 1<<5 ) ) ) ;                                //等待RTC寄存器最后一次操作完成
    RTC->CRL |= 1<<4 ;                                        //进入配置模式
    RTC->PRLH = 0 ;
    RTC->PRLL = 32767 ;                                        //设定分频值
    RTC->CRL &= ~( 1<<4 ) ;                                      //退出配置模式
    while( !( RTC->CRL&( 1<<5 ) ) ) ;                                //等待RTC寄存器最后一次操作完成
    BKP->DR1 = 0x5050 ;
  }
  else
  {
    while( !( RTC->CRL&( 1<<3 ) ) ) ;                                //等待RTC寄存器同步
      while( !( RTC->CRL&( 1<<5 ) ) ) ;                                //等待RTC寄存器操作完成
  }
}
/***************************************************
Name    :Is_Leap_Year
Function  :闰年判定
Parameter  :
      year:年份
Return    :闰年
***************************************************/
u8 Is_Leap_Year( u16 year )
{
  //必须能被4整除
  if( year%4==0 )
  {
    if( year%100==0 )
    {
      if( year%400==0 )
        return 1 ;
      else
        return 0 ;
    }
    else
      return 1 ;
  }
  else
    return 0;
}
/***************************************************
Name    :RTC_Set_Time
Fuction    :设置时间
Parameter  :
      year:年
      month:月
      date:日
      hour:时
      minute:分
      second:秒
Return    :None
***************************************************/
u8 mon_table[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } ;
void RTC_Set_Time( u8 year, u8 month, u8 date, u8 hour, u8 minute, u8 second )
{
  u16 t ;
  u32 seccount = 0 ;
  //把所有年份的秒钟相加
  for( t=1970; t2000; t++ )
  {
    if( Is_Leap_Year( t ) )
      seccount += 31622400 ;                                    //闰年的秒钟数
    else
      seccount += 31536000 ;                                    //平年的秒钟数
  }
  month -= 1 ;
  for( t=0; t//把前面月份的秒钟数相加
  {
    seccount += ( u32 )mon_table[ t ]*86400 ;                            //月份秒钟数相加
    if( Is_Leap_Year( year+2000 )&&( t==1 ) )
      seccount += 86400 ;                                      //闰年2月份增加一天的秒钟数     
  }
  seccount += ( date-1 )*86400 ;                                    //把前面日期的秒钟数相加
  seccount += hour*3600 ;                                        //小时秒钟数
    seccount += minute*60 ;                                        //分钟秒钟数
  seccount += second ;                                        //最后的秒钟加上去
  //设置时钟
    RCC->APB1ENR |= 1<<28 ;                                        //使能电源时钟
    RCC->APB1ENR |= 1<<27 ;                                        //使能备份时钟
  PWR->CR |= 1<<8 ;                                          //取消备份区写保护
  RTC->CRL |= 1<<4 ;                                          //允许配置
  RTC->CNTL = seccount&0xFFFF ;
  RTC->CNTH = seccount>>16 ;
  RTC->CRL &= ~( 1<<4 ) ;                                        //配置更新
  while( ( RTC->CRL&0x20 )!=0x20 ) ;                                  //等待RTC寄存器操作完成
  RTC_Get_Time() ;                                          //设置完之后更新一下数据
}
/***************************************************
Name    :RTC_Get_Time
Fuction    :获取时间
Parameter  :None
Return    :None
***************************************************/
RTC_Data RTC_Time;
void RTC_Get_Time()
{
  u16 daycnt=0;
  u32 timecount=0;
  u32 temp=0;
  u16 temp1=0;
  //得到计数器中的值
  timecount = RTC->CNTH ;
  timecount <<= 16 ;
  timecount += RTC->CNTL ;
  //得到天数
   temp = timecount/86400 ;
  //超过一天了
  if( daycnt!=temp )
  {    
    daycnt = temp ;
    temp1 = 1970 ;                                          //从1970年开始
    while( temp>=365 )
    {
      //闰年
      if( Is_Leap_Year( temp1 ) )
      {
        if( temp>=366 )
          temp -= 366 ;                                    //闰年的秒钟数
        else
          break ;
      }
      else
        temp -= 365;                                      //平年
      temp1 ++ ;
    }
    RTC_Time.year = temp1-2000 ;                                  //得到年份
    temp1 = 0 ;
    //超过了一个月
    while( temp>=28 )
    {
      if( Is_Leap_Year( RTC_Time.year+2000 )&&( temp1==1 ) )//当年是不是闰年/2月份
      {
        if( temp>=29 )
          temp -= 29 ;//闰年的秒钟数
        else
          break; 
      }
      else 
      {
        if( temp>=mon_table[ temp1 ] )
          temp -= mon_table[ temp1 ] ;                            //平年
        else
          break ;
      }
      temp1 ++ ;
    }
    RTC_Time.month = temp1+1 ;                                    //得到月份
    RTC_Time.date = temp+1 ;                                    //得到日期
  }
  temp = timecount%86400 ;                                      //得到秒钟数
  RTC_Time.hour = temp/3600 ;                                      //小时
  RTC_Time.minute = ( temp%3600 )/60 ;                                //分钟
  RTC_Time.second = ( temp%3600 )%60 ;                                //秒钟
}

(3)创建1.c文件并输入以下代码。

#include "sys.h"
#include "delay.h"
#include "usart1.h"
#include "lcd.h"
#include "rtc.h"


int main()
{
  u8 Str[ 50 ] ;
  STM32_Clock_Init( 9 ) ;                                        //STM32时钟初始化
  SysTick_Init( 72 ) ;                                        //SysTick初始化
  USART1_Init( 72, 115200 ) ;                                      //初始化串口1波特率115200
  LCD_Init() ;                                            //LCD初始化
  RTC_Init() ;
  RTC_Set_Time( 20, 12, 10, 10, 8, 0 ) ;
  while( 1 )
  {
    RTC_Get_Time() ;
    sprintf( ( char * )Str, "20%02d-%02d-%02d %02d:%02d:%02d", RTC_Time.year, RTC_Time.month, RTC_Time.date, RTC_Time.hour, RTC_Time.minute, RTC_Time.second ) ;
    LCD_ShowString( 10, 10, Str ) ;
    delay_ms( 500 ) ;
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电源
    +关注

    关注

    184

    文章

    17762

    浏览量

    250683
  • 晶体振荡器
    +关注

    关注

    9

    文章

    624

    浏览量

    29167
  • 时钟芯片
    +关注

    关注

    2

    文章

    250

    浏览量

    39903
  • RTC
    RTC
    +关注

    关注

    2

    文章

    540

    浏览量

    66696
收藏 人收藏

    评论

    相关推荐

    STM32学习笔记(初学者快速入门)

    STM32学习笔记(初学者快速入门)资料来自网络资源
    发表于 06-11 20:23

    STM32RTC实时时钟实验讲解,从入门到放弃 精选资料分享

    STM32RTC实时时钟实验讲解,从入门到放弃。文章目录STM32RTC实时时钟实验讲解,从入门
    发表于 08-03 06:38

    Stm32RTC时钟

    Stm32RTC时钟1.时钟框图:先将之前没做笔记的时候的时间框架图补上:同样源自正点原子的PPT,图中红框的部分为RTC的时钟源,有三种
    发表于 08-11 07:04

    CubeMX入门STM32 HAL库的学习笔记

    STM32CubeMX是ST官方开发的一款很好用的软件,主要用于STM32系列单片机的硬件驱动层的配置。网上也有一些关于STM32CubeMX的相关教程,对它的相关操作进行说明。从今天起,小柯希望能将自己从CubeMX
    发表于 08-17 06:55

    STM32入门学习笔记 精选资料分享

    STM32入门学习笔记本文为笔者入门学习过程的记录,只是零散的记录了一些个人不太懂得,觉得需要经
    发表于 08-24 07:56

    DSPRTC教程

    DSPRTC教程,很好的DSP自学资料,快来学习吧。
    发表于 04-15 14:14 14次下载

    STM32各模块学习笔记

    STM32个模块学习笔记 目录 STM32笔记之一 中断优先级.......................................
    发表于 11-30 03:32 3166次阅读

    STM32学习笔记1——软硬件基础keil5编程与GPIO开发

    STM32学习笔记1——软硬件基础keil5编程与GPIO开发
    发表于 11-30 12:36 4次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>1——软硬件基础<b class='flag-5'>之</b>keil5编程与GPIO开发

    STM32学习STM32cubeMX软件安装与使用(附STM32cubeMX5.2.1载地址)

    STM32学习STM32cubeMX软件安装与使用(附STM32cubeMX5.2.1载地址
    发表于 12-07 11:51 28次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>之</b><b class='flag-5'>STM32</b>cubeMX软件安装与使用(附<b class='flag-5'>STM32</b>cubeMX5.2.1<b class='flag-5'>下</b>载地址)

    STM32内部RTC时钟脉冲实验参考程序

    STM32内部RTC时钟脉冲实验参考程序
    发表于 12-30 10:45 13次下载

    STM32学习笔记:跑马灯实验

    跑马灯实验放寒假了,最近在学习STM32所以想写写一些笔记,刚刚好也能和大家分享一下学习心得体会,希望能够对和我一样在
    发表于 01-17 10:57 2次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>:跑马灯<b class='flag-5'>实验</b>

    STM32入门学习笔记基础定时器实验

    STM32内部共有8个定时器,其中Timer1和Timer8属于高级定时器,Timer2~Timer5属于通用定时器,8个定时器的资源独立,互不影响。
    的头像 发表于 02-16 10:14 792次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>入门</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b>基础定时器<b class='flag-5'>实验</b>(<b class='flag-5'>下</b>)

    STM32入门学习笔记RTC实验(上)

    实时时钟Real TimeClock(简称RTC),实时时钟芯片是日常生活中应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。有些时钟芯片为了在主电源掉电时,还可以工作,需要外加电池供电。
    的头像 发表于 02-16 11:22 1455次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>入门</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b><b class='flag-5'>实验</b>(上)

    STM32学习笔记RTC实时时钟1

    STM32 的实时时钟(RTC)是一个独立的定时器。 STM32RTC 模块拥有一组连续计数的计数器,在相应软件配置,可提供时钟日历
    的头像 发表于 05-26 14:26 1934次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b>实时时钟1

    STM32学习笔记RTC实时时钟2

    STM32 的实时时钟(RTC)是一个独立的定时器。 STM32RTC 模块拥有一组连续计数的计数器,在相应软件配置,可提供时钟日历
    的头像 发表于 05-26 14:26 1177次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b><b class='flag-5'>之</b><b class='flag-5'>RTC</b>实时时钟2