你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32CubeMX系列|RTC实时时钟

[复制链接]
STMCU-管管 发布时间:2020-9-24 10:45
RTC实时时钟
, `1 G+ {. u0 \1. RTC实时时钟简介

STM32的实时时钟RTC是一个独立的定时器,RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期

3 V1 V, X* w2 ]. E
RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后背区域,即在系统复位或从待机模式唤醒后RTC的设置和事件维持不变。但是在系统复位后,会自动禁止访问后备寄存器和RTC,以防止对后备区域(BKP)的意外操作。所以在要设置时间之前,要先取消备份区域写保护。RTC的简化框图如下所示:

# j. Y; Z0 E' _: p) T0 U$ I

9 m  t6 P& w: K+ q: Y
1_meitu_1.jpg
+ }: Y: y) g  H, R

9 A7 \% j3 |8 M( H  u# f5 B9 QRTC由两个主要部分组成:第一部分(APB1接口)用来和APB1总线相连,此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作;另一部分(RTC核心)由一组可编程计数器组成,分为两个主要模块,第一个模块是RTC的预分频模块,可编程产生1秒的RTC时间基准TR_CLK。第二个模块是一个32位的可编程计数器(RTC_CNT),可被初始化为当前的系统时间,一个32位的时钟计数器按秒钟计算可以记录4294967296秒,约136年左右,一般应用已经足够3 Y9 q( f+ C) ~% @, ]  ?

/ y- |- I: R$ H& v/ S2 \
RTC还有一个闹钟寄存器RTC_ALR,用于产生闹钟。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CNT = RTC_ALR将产出一个闹钟中断,从而实现闹钟功能


5 ~- z* J9 g8 i7 a& l

2. 硬件设计4 I+ \/ g3 _$ I: z/ S

本实验通过RTC的秒中断来持续输出时间通过串口1打印出来,并通过设置闹钟中断实现一个闹钟提醒,D1指示灯提示系统正常运行

  • D1指示灯
  • USART1串口
  • RTC$ d* S# A/ w7 B  P# G# ]
    6 U3 P+ b* ^+ O5 \8 c! F
) m5 c3 G; w1 F+ t5 h, y* Z

" O5 a% a/ b8 q6 s
3. 软件设计3.1 STM32CubeMX设置% J5 I# y* {7 y
  • RCC设置中开启外部高速晶振(HSE)以及外部低速晶振(LSE),时钟树中将RTC的频率设置为32.768KHz" v: Q7 X. I5 E
    ' |+ h7 [, R" e+ J5 Q9 W" ^

5 g! k! b3 q# @5 Z
% R$ v2 l! d9 `2 Z# e1 {! W
% L  L1 w. s: Q3 ^
2_meitu_2.jpg
. f, A# C# p0 e/ P9 ?3 r
( y: X% L, P: W# s0 T! X
3_meitu_3.jpg
* H- o4 }1 K7 I3 t. S- N6 Z' \
7 e5 Z7 Z7 ]: ^" A" P+ n6 r- s

9 d/ W' {3 f# Y% u+ b5 }& R' i8 ]
  • PC0设置为GPIO推挽输出模式、上拉、高速、默认输出电平为高电平
  • USART1选择为异步通讯方式,波特率设置为115200Bits/s,传输数据长度为8Bit,无奇偶校验,1位停止位
  • 激活时钟源,激活日历,选择No RTC Output,设置初始日期和时间; w% g3 J# a$ i1 N0 P/ l8 m

    ' Q4 u+ M% C8 }" t" h) z: r
& m; J1 _" ~0 U5 ]# ^0 `  @" k

+ `' ^* S0 S  P5 q. ^5 X4 T

4_meitu_4.jpg


+ F; P, n5 |2 N7 A6 l; A
  • 使能RTC全局中断和闹钟中断: L6 p- r3 D4 Q2 {" _7 t! x1 I3 c' w

    9 i% Y' h- p+ P
4 S- I# \- L- `
- q4 ^- T. D' X& z, z+ r& q" X- a* }

5_meitu_5.jpg

. T5 Y2 y5 l( X) s  U8 [8 a8 p
  • 输入工程名,选择工程路径(不要有中文),选择MDK-ARM V5;勾选Generated periphera initialization as a pair of ‘.c/.h’ files per IP ;点击GENERATE CODE,生成工程代码, E! g4 B2 B" W0 d, ^3 c

    7 D* e: f( F5 e8 J( J+ n

& B# J1 p# u2 `7 }: u
% k( J8 X1 v0 d2 X; f8 U8 f" P9 t8 ]
3.2 MDK-ARM编程  M  s  l! D' w. H4 C
; T5 x9 N- ]$ c& A2 s1 ~; y' f1 i
  • 在rtc.c文件中编写秒中断处理回调函数和闹钟中断处理函数' M5 e- p9 r% I
& W1 [, @; ^& Y

+ i& O; \6 b* M. m8 E- S
  1. extern RTC_DateTypeDef GetDate;# Q, H2 _4 A! i1 s
  2. extern RTC_TimeTypeDef GetTime;" d: A' r% ?6 L  E
  3. ) W+ Z* f% {  s# i. `6 e
  4. void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc){3 L; h, _% S  g2 y. b: a. O/ V
  5.         HAL_RTC_GetTime(hrtc,&GetTime,RTC_FORMAT_BIN);
    $ y/ T6 h  J, p0 [5 l) X& E
  6.         HAL_RTC_GetDate(hrtc,&GetDate,RTC_FORMAT_BIN);$ w; C' ^9 s4 G# ^& |. j% I+ x5 y
  7.         printf("Date:%02d-%02d-%02d\r\n",2000+GetDate.Year,GetDate.Month,GetDate.Date);
    4 K+ M' E5 ?+ V5 w" b6 H
  8.         printf("Time:%02d:%02d:%02d\r\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);) p" A4 {6 X* n  ^: u9 B& \
  9.         printf("\r\n");        
    4 W: h) y. M+ l& w$ v) k: \
  10. }
    3 ^  y4 Y) d- `

  11. ; A( K% k) M/ Q" f! ?( E4 v
  12. void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){
    - a) s) U, u' }, ?
  13.         printf("Alarm Active...!!!\n");! W. ~+ i; F5 X& e/ [
  14. }
复制代码
# ?, a7 ]/ @+ R8 ]/ `$ j

6 R% a- Z7 Q& M8 s% X4 l
  • 在main.c文件中编写闹钟设置相关代码并开启相关中断' X' q" U+ D. E. h

0 i  J1 p5 r1 [2 ~9 |3 L1 e$ v

2 g' p- d* H1 C8 o7 C! ~4 _" m: g
  1. /* USER CODE BEGIN PV */) ~, u% U; R5 H
  2. RTC_DateTypeDef GetDate;5 n/ s7 b3 G" I' H$ |' _
  3. RTC_TimeTypeDef GetTime;9 u8 Y- G& q" S! j
  4. RTC_AlarmTypeDef sAlarm;5 {# b7 f3 U3 W
  5. /* USER CODE END PV */1 p" l' N% ?2 F# d
  6. /* Private function prototypes -----------------------------------------------*/; u2 X) U) v7 r* _2 T9 y+ H6 X# G8 g
  7. void SystemClock_Config(void);& k" |5 j, u1 K: P* }1 q

  8. # z7 Z1 t, z% Q1 O
  9. int main(void){
    0 [  l: r. n" u
  10.   HAL_Init();
    ) f7 M! w, t4 P7 n
  11.   SystemClock_Config();3 p6 j/ r+ P' t9 p* w
  12.   /* Initialize all configured peripherals */
    9 V1 P( B; ^: o5 k5 ?4 E
  13.   MX_GPIO_Init();
    , a6 ?# b" ]/ e" Y
  14.   MX_RTC_Init();+ f) g6 x. h3 d# C8 B( N# R
  15.   MX_USART1_UART_Init();
    " o" a# @# X  X" P. Z, }. j
  16.   /* USER CODE BEGIN 2 */# y; j& c7 f5 q4 Z4 ]7 q! K
  17.   __HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启秒中断
    4 J# r' I1 B* B6 R5 d2 e( K3 C& ^% \
  18.   sAlarm.Alarm = RTC_ALARM_A;
    . E( W+ ^1 k9 n9 t
  19.   sAlarm.AlarmTime.Hours = 16;" O  {# h4 A/ M6 v" W" e+ i
  20.   sAlarm.AlarmTime.Minutes = 20;* D3 O2 `. I. p( j9 r3 @. M
  21.   sAlarm.AlarmTime.Seconds = 30;
    3 Y0 W# x% u' j2 I
  22.   HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN);  //设置闹钟并使能闹钟中断3 H7 F1 H$ w. d1 X
  23.   /* USER CODE END 2 */1 P- H. Z) F+ l
  24.   while (1){
    $ O/ g0 l  v" W4 J( }7 I& I
  25.     HAL_Delay(1000);
    - g6 i1 ?, N' k& b
  26.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
    - _8 {* b7 W/ H/ M
  27.   }
    8 }2 [- L: s3 ?- t
  28. }
复制代码
+ o- w1 w0 s6 \0 ]
& }/ L7 ]2 f* @- W, n# s8 W
4. 下载验证
( p2 u, S6 k1 K1 o+ t. p( y- \, |- `

编译无误后下载到开发板,可以看到D1指示灯每1s闪烁一次,串口助手每1s会打印出相应的日期和时间,闹钟设置的时间到后会打印出闹钟中断函数里的相关语句


1 d' t' m6 a* H

6_meitu_6.jpg


% i9 Z7 U$ e. w5 H6 a! x6 y$ L2 ]& x: U: N
) W& Z4 H! {3 W) B* H! w. F4 Y' {
赞 收藏 评论0 发布时间:2020-9-24 10:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版