1 本节介绍
📝本节您将学习如何通过K230开发板来设置和获取当前系统时间。RTC 是嵌入式系统中非常常见且基础的一个功能,无论是在数据记录、事件触发还是定时操作中,都能派上用场。
🏆学习目标
1️⃣了解 实时时钟【RTC】的基本概念。
2️⃣如何设置当前系统时间并获取当前时间。
2 名词解释
名词 | 说明 |
---|---|
实时时钟(RTC) | Real-Time Clock 是一种能够提供持续、精确的日期和时间信息的硬件或外设模块,可在系统断电后依然通过备用电源运行,以保持时间不丢失。 |
注意:
庐山派开发板在设计时未预留后备RTC电源。一方面,由于芯片内置的RTC时间精度普遍都比较低,掉电保持时钟的实用性有限;另一方面,受限于板子的尺寸较小,无法容纳备用电池。
如果在实际项目中需要准确的时间功能,建议采取以下两种方法之一:
- 通过网络获取时间数据。
- 外接高精度时钟模块,例如国产的 SD3078。该模块采用 IIC 通讯,精度为 ±3.8 ppm,年误差约为两分钟。
3 什么是RTC
实时时钟(RTC)是指一种能够独立、连续地计量时间的硬件模块。RTC 即使在主系统电源关闭的情况下(例如有备用电池支持)也能持续走时,以确保设备下次启动时仍能获得当前真实时间。庐山派的RTC供电是和ADC的1.8供电是同一个网络,所以当开发板掉电时,开发板的时间也就停止走时了。如果你的项目对系统时间敏感,需要注意一下。
RTC 内部包含一个计时器电路,通过一个高精度的时钟源(通常是晶振)来计数。这个计数器会根据时间流逝自动增加内部的时间值,包括年、月、日、时、分、秒,从而实现连续计时。当系统需要获取当前时间时,只需从 RTC 的寄存器中读取相关数据即可。
4 RTC使用指南
K230 提供了一个 RTC(实时时钟)模块,允许用户设置和获取当前系统时间,适用于需要时间跟踪的应用。
RTC 类位于 machine
模块下。
4.1 示例
python
from machine import RTC
# 实例化 RTC 对象
rtc = RTC()
# 获取当前时间(返回包含日期和时间信息的元组)
current_time = rtc.datetime()
print("当前时间:", current_time)
# 设置当前时间
# 假设要设置时间为 2024 年 12 月 11 日,星期三(值为3表示星期三),时间为 17:07:00
# rtc.init((年, 月, 日, 星期, 时, 分, 秒, 微秒))
rtc.init((2024, 12, 11, 3, 17, 7, 0, 0))
# 再次获取时间,查看是否设置成功
updated_time = rtc.datetime()
print("当前的时间:", updated_time)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
4.2 构造函数
python
rtc = RTC()
1
参数
无
4.3 init
方法
python
rtc.init(year, mon, day, hour, min, sec, microsec)
1
参数
year
: 年mon
: 月day
: 日hour
: 时min
: 分sec
: 秒microsec
: 微秒
返回值
无
4.4 datetime
方法
python
print(rtc.datetime())
1
参数
无
返回值
返回当前日期和时间信息,包括:
year
: 年mon
: 月day
: 日hour
: 时min
: 分sec
: 秒microsec
: 微秒
5 设置并获取时间
python
# 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源
# 开发板官网:www.lckfb.com
# 技术支持常驻论坛,任何技术问题欢迎随时交流学习
# 立创论坛:www.jlc-bbs.com/lckfb
# 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
# 不靠卖板赚钱,以培养中国工程师为己任
from machine import RTC
from machine import Pin
from machine import FPIOA
import time
# 创建FPIOA对象,用于初始化引脚功能配置
fpioa = FPIOA()
# 设置引脚功能,将指定的引脚配置为普通GPIO功能,
fpioa.set_function(62,FPIOA.GPIO62)
fpioa.set_function(20,FPIOA.GPIO20)
fpioa.set_function(63,FPIOA.GPIO63)
# 实例化Pin62, Pin20, Pin63为输出,分别用于控制红、绿、蓝三个LED灯
LED_R = Pin(62, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 红灯
LED_G = Pin(20, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 绿灯
LED_B = Pin(63, Pin.OUT, pull=Pin.PULL_NONE, drive=7) # 蓝灯
# 板载RGB灯是共阳结构,设置引脚为高电平时关闭灯,低电平时点亮灯
# 初始化时先关闭所有LED灯
LED_R.high() # 关闭红灯
LED_G.high() # 关闭绿灯
LED_B.high() # 关闭蓝灯
# 默认选择红色LED灯,后续可以通过变量改变需要控制的灯
LED = LED_G # 当前控制的LED为绿色LED
# 实例化 RTC 对象
rtc = RTC()
# 设置当前时间
# 假设要设置时间为 2024 年 12 月 11 日,星期三(值为3表示星期三),时间为 17:07:50
# rtc.init((年, 月, 日, 星期, 时, 分, 秒, 微秒))
rtc.init((2024, 12, 11, 3, 17, 7, 50, 0))
print("RTC 初始化完成,当前时间:", rtc.datetime())
# 定义目标时间点,假设定时任务为每天 17:08 触发,在这个例程中会在10秒后触发。
target_hour = 17
target_minute = 8
def check_and_trigger_event():
"""
检查当前时间是否达到了指定的时间点,并触发事件。
"""
current_time = rtc.datetime()
print("当前时间:", current_time)
# 提取当前时间的小时和分钟
current_hour = current_time[4]
current_minute = current_time[5]
# 判断是否达到目标时间点
if current_hour == target_hour and current_minute == target_minute:
# 触发事件
trigger_event()
def trigger_event():
"""
触发特定的事件逻辑。
"""
LED.low() # 点亮当前选择的LED
print("触发定时事件:绿灯亮啦!当前时间达到了目标时间点!")
# 主循环,持续运行程序逻辑
while True:
check_and_trigger_event()
# 延时 1 秒,避免主循环运行速度过快
time.sleep(1)
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
这个代码有详细的中文注释,这里不再过多解释,总的来说就是我们在上电后,把系统时间设置为17点07分50秒,然后设置一个类似闹钟的时间为17点08分,当时间触发后庐山派开发板上的RGB绿灯就会亮,实际IDE运行效果如下图所示: