STM32—RTC

发布者:美好回忆最新更新时间:2019-02-12 来源: eefocus关键字:STM32  RTC 手机看文章 扫描二维码
随时随地手机看文章

什么是RTC ?


RTC:实时时钟(Real-Time Clock),利用RTC可以实现产品的精确计时,比如平时用的笔记本电脑、电子日历等都有RTC模块,当主电源断电时,RTC的模块用电池来供电,继续进行计时。STM32中的RTC和定时器有点类似,有一个32位的计数器,可以计数2的32次方,大约可以计时136年。


RTC的结构框图


RTC的时钟源(STM32L1系列,其它系列的芯片时钟源会略有不同,但都是这三类):


(1) LSE 32.768kHz


(2)HSE,最大1Mhz


(3)LSI,内部低速时钟,L1系列是37k,F2系列是32K,F4系列是40K,频率不一样,预分频值的设定也不一样。


RTC的相关代码

下面是HAL库中RTC使用的一些代码。


 第一步,选择RTC的时钟源,本例选择内部低速时钟LSI,在系统时钟配置中有该时钟源的配置。



 

void SystemClock_Config(void) 

 

   //..............省略   

 

 

 

   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;      

   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;                     

   if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)= HAL_OK!)

   {   

       _Error_Handler(__ FILE __,__ LINE__); 

   }

 

 

   //............省略

 

}

 


然后,进行RTC初始化并启动设置RTC的定时时间,初始化部分涉及RTC的各个参数较多。


void MX_RTC_Init(void)

    / **初始化RTC  

    * / 

  hrtc.Instance = RTC; 

  hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制,还可选择12小时制

  hrtc.Init.AsynchPrediv = 124; //异步预分频值

  hrtc.Init.SynchPrediv = 295; //同步预分频值,异步与同步的预分频设置下面进行详细讲解

  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; //输出关闭

  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;// 输出极性为高,无效

  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; //输出方式,开漏

  if(HAL_RTC_Init(&hrtc)!= HAL_OK)

  { 

    _Error_Handler(__ FILE __,__ LINE__); 

  } 

 

    / **初始化RTC并设置时间和日期  

    * / 

  if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!= 0x32F2){ 

  sTime.Hours = 0x09; 

  sTime.Minutes = 0x1F; 

  sTime.Seconds = 0x0;

  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; //不使用夏令时

  sTime.StoreOperation = RTC_STOREOPERATION_RESET; 

  if(HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BIN)!= HAL_OK)//注意传入参数有二进制格式和BCD格式可选

  { 

    _Error_Handler(__ FILE __,__ LINE__); 

  } 

 

  sDate.WeekDay = RTC_WEEKDAY_MONDAY; 

  sDate.Month = RTC_MONTH_NOVEMBER; 

  sDate.Date = 0x15; 

  sDate.Year = 0x11; 

 

  if(HAL_RTC_SetDate(&hrtc,&sDate,RTC_FORMAT_BIN)!= HAL_OK)

  { 

    _Error_Handler(__ FILE __,__ LINE__); 

  } 

 

    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); 

  }

  //设置RTC定时时间1s 

  if(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,1,RTC_WAKEUPCLOCK_CK_SPRE_16BITS)!= HAL_OK)

  { 

    _Error_Handler(__ FILE __,__ LINE__); 

  }         

}

 

 RTC预分频值的设定关系到RTC多长时间记一次数。为了实现RTC的秒中断,需要对同步和异步预分频进行设置,如下图。STM32L1系列的RTC详细资料见链接:STM32L1XX_RTC。


如上图,为了得到1HZ计数周期,37KHZ/(124+1)/(295+1)=1HZ , 故预分频设置为124和295,如使用32.768k,设置为127和255。


RTC的时钟使能如下:


void HAL_RTC_MspInit(RTC_HandleTypeDef * hrtc)

 

      if(hrtc-> Instance == RTC)

      { 

      / * USER CODE BEGIN RTC_MspInit 0 * / 

 

      / * USER CODE END RTC_MspInit 0 * / 

        / * *RTC时钟使能* / 

        __HAL_RCC_RTC_ENABLE(); 

      / * USER CODE BEGIN RTC_MspInit 1 * / 

        HAL_NVIC_SetPriority(RTC_WKUP_IRQn,0,0);//设置RTC秒中断优先级

        HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn);       //使能RTC秒中断

      / * USER CODE END RTC_MspInit 1 * / 

      } 

}


 

第三步:编写RTC中断函数并置标志位;


void RTC_WKUP_IRQHandler(void)

{

     HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);

     RTC_Flag = 1; 

}

 


第四步:主函数中若标志位被置位,执行自己的程序;


while(1)

 {

   if(!RTC_Flag == RESET)

    {

          RTC_Flag = 0; //RTC标志位清零

         .......        //添加自己的程序

    }

 }


关键字:STM32  RTC 引用地址:STM32—RTC

上一篇:STM32-USART HAL库接收任意长度数据详细解析
下一篇:STM32—USART

推荐阅读最新更新时间:2024-03-16 16:23

stm32 usb数据缓冲区疑问
USB不同的应用需要使用到的端点数和端点数据长度各不相同,如果为每个端点都单独规划一个存储区非常浪费。 所以STM32为USB模块提供了共512个字节的存储区,至于如何为每个端点分配使用这512B的空间,就是用户自己的事情了,这样存储区的分配就非常经济灵活。这512B空间的首地址是0x40006000。 你看到的#define ENDP2_RXADDR (0xD8),这个0xD8就是在这512B空间里的偏移地址,说明端点2收到的数据将放在0x40006000 + 0xD8 * 2的地址空间里。至于为什么要×2,是因为这部分存储区是按照2字节访问的,即每存放1个字节的数据要占据2个字节的空间。所以这段存储区的地址是从0
[单片机]
STM32printf函数实现方法
这几天学习stm32发现利用keil不能正常使用printf函数,所以我去网上找了一下,这是一个网易博主的解决办法,亲测有效: STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义 /
[单片机]
STM32 I2C从机发送数据
stm32 I2C主机发送功能在网上有很多例程,调试也很容易,从机发送数据的介绍很少,鉴于本人刚开始调试单片机程序不久,花了一整天也没调试通,最后在部门领导的帮助下,通过示波器及单步调试程序,查看寄存器状态值,终于实现了。下面主要介绍下从机发送数据注意事项。(附带例程) 1、相信使用I2C的都知道,从机是不能主动发送数据的,开始条件都是由主机生成。 2、根据参考文档,I2C默认是从机模式,只有在生成起始条件后,才会从从机模式自动切换到主机模式。所以作为从机模式使用时不能生成起始条件。 3、附图1,为从机发送器的传送时序图,截图于参考手册,图中说明部分讲述了怎样能清除事件,这点很重要,每次事件是都要去清除才可以去检测下一
[单片机]
<font color='red'>STM32</font> I2C从机发送数据
STM32—LCD
1.LCD/LCM的基本概念 液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。 LCM(LCD Module)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。 在平时的学习开发中,我们一般使用的是LCM,带有驱动IC和LCD屏幕等多个模块。 2.FSMC的基本概念 在STM32上开发LCD显示,可以有两种方式来对LCD进行操作,一种是通过普通的IO口,连接LCM的相应引脚来进行操作,第
[单片机]
STM32定时器中断
STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。 TIM1和TIM8是能够产生3对PWM互补输出的高级定时器,常用于三相电机的驱动,时钟由APB2的输出产生;TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。 通用TIMx定时器特性包括: ●16位向上,向下,向上/向下自动装载计数器 ● 16位可编程预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值 ●4个独立通道:(定时器通道是什么意思?在PWM一节中有提到...)
[单片机]
<font color='red'>STM32</font>定时器中断
【ARM】2440裸机系列-RTC数字时钟
功能 裸机程序,实现LCD显示数字时钟 主要代码 1)背景绘制 1 2 3 4 5 6 7 8 9 10 11 void Brush_ U32 c) { int x,y ; for ( y = 0 ; y LCD_HEIGHT ; y++ ) { for ( x = 0 ; x LCD_WIDTH ; x++ ) { LCD_BUFFER = c ; } } } 2)文字绘制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3
[单片机]
【ARM】2440裸机系列-<font color='red'>RTC</font>数字时钟
STM32—重定向printf和getchar函数到串口
在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。 以printf()为例: printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。 那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__w
[单片机]
<font color='red'>STM32</font>—重定向printf和getchar函数到串口
STM32外部中断解决方法
01 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平、低电平)、边沿变化(上升沿、下降沿)等。51单片机有5个中断源,其中有两个是外部中断,分别为INT0和INT1,INT0被分配在P3.2引脚,INT1被分配在P3.2引脚,也即是说如果使用51单片机的外部中断0,则必须将信号接在P3.2上,否则无效。 02 举例说明什么是中断 单片机在执行程序时有两种方式: 查询方式 中断方式 所谓查询方式就是单片机一遍一遍的扫描,查看所监视的目标有没有发生变化,是一种主动式的监视方法,用一个成语可以很客观的描述:守株待兔。 所谓中断方式就是单片机不主动去监视目标,而是目标主动通知单片机状态
[单片机]
<font color='red'>STM32</font>外部中断解决方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved