Stm32 中RTC秒中断的使用方法及例子

RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。

RTC的秒中断功能类似SysTick系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。

例:

主函数间隔0.5秒LED变化一次;

秒中断一次打印数据"RTC Sec...";

也就是LED变化一次,串口打印一次数据"RTC Sec..."

扩展部分的功能RTC计数:可以实现RTC闹钟

原理描述

    从框图中大概就可以看到该模块有些什么功能及其工作的原理。

 

RTC框图:

Stm32 中RTC秒中断的使用方法及例子_第1张图片

从上面系统框图来分析“RTC秒中断”的原理:

1、RTC时钟源,总共有三类:可任意选择,并配置成任意秒数为周期

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文实例代码是:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

使用“RCC_RTCCLKSource_HSE_Div128”作为时钟源(高速时钟源),也就是外部高速时钟的128分频,也就是每秒8M/128(62500)个脉冲;

当然,我们也可以选择另外两个时钟源,也就是使用低速时钟源,一般应用在RTC闹钟可RTC日历等都使用低速时钟源。

2、RTC分频:

本文实例代码是:RTC_SetPrescaler(62500);

这个值是和上面对应的,因为我们这里是实现真正的1秒钟中断一次。

3、RTC中断:

RTC中断有三种:

RTC_IT_SEC秒中断(一个周期中断一次,自己进行配置)

RTC_IT_ALR闹钟中断

RTC_IT_OW(计数)溢出中断

 

本文实例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);

使能RTC_IT_SEC秒中断。

 

再次强调:

这里的“秒中断”是概念上的秒中断,它的中断间隔时间是根据你选择的时钟源和分频值决定的,并非真正的1秒钟中断一次。

我们可以试着将源代码中的分频值该62500的一半31250,可以看得出来,秒中断的间隔时间为0.5秒(请自行修改实验测试)。

下面将讲述关于“RTC秒中断”重要的、容易弄错的几点:

1.RCC时钟源

Stm32 中RTC秒中断的使用方法及例子_第2张图片

该函数位于bsp.c文件下面;

RCC是很多初学者,甚至已经工作的朋友容易遗漏的地方,有很多朋友觉得它使用的外设不正常,很大部分是没有配置RCC导致的。

重点注意:

A.外设RCC时钟的配置要在其外设初始化的前面;

B.匹配对应时钟。

比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

2. RTC秒中断配置

Stm32 中RTC秒中断的使用方法及例子_第3张图片

该函数位于rtc.c文件下面;

该函数请结合参考手册(框图和寄存器)理解。

注意4点:

A.使能后备区域:PWR_BackupAccessCmd(ENABLE);

从系统框图可以看见RTC有阴影部分,其实这部分就是后备区域。因此,需要使能,这也是为什么上面需要配置RCC时钟的原因。

B.选择RTC时钟源:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

在原理描述中说了,RTC时钟源有三种:任意选择

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

C.使能RTC秒中断:RTC_ITConfig(RTC_IT_SEC,ENABLE);

RTC有三类中断:

RTC_IT_SEC秒中断

RTC_IT_ALR闹钟中断

RTC_IT_OW(计数)溢出中断

D.RTC分频:RTC_SetPrescaler(62500);

我们是为了得到真正的1秒钟中断一次,所以这里的值是62500 = 8M/128,这样才能刚好1秒中断一次。

3. NVIC配置

Stm32 中RTC秒中断的使用方法及例子_第4张图片

该函数位于bsp.c文件下面;

我们要中断,就需要配置NVIC(中断控制器),为其分配优先级。

很多人觉得自己的配置没问题,但程序就是不进入中断,原因可能就在这里。因此,NVIC这里也是容易忽略的地方。

4. RTC中断

Stm32 中RTC秒中断的使用方法及例子_第5张图片

该函数位于stm32f10x_it.c文件下面;

这里需要注意,RTC有三类中断,但入口都是这个函数,因此,需要在函数体里面分辨是哪一个中断进入了该函数。

注意1点:

清除中断标志位:RTC_ClearITPendingBit(RTC_IT_SEC);

这是通过RTC_GetCounter();函数获取计数值,然后把这个计数值分别用小时、分钟、秒来表示的过程。代码如下

RTCCount=RTC_GetCounter();//获得计数值并计算当前时钟

THH=RTCCount/3600;//小时

TMM=(RTCCount%3600)/60;//分钟

TSS=(RTCCount%3600)%60;//秒

你可能感兴趣的:(STM32)